Признать письма, указанные человеком, использующим java

Мне нужно распознать алфавит, произносимый пользователем, в микрофон устройства. Устройство может быть мобильным телефоном под управлением Android.

Например, когда пользователь говорит " R", он должен дать мне "R", а не "Are"..

Как выполнить распознавание речи в java? Я ищу идеи, которые можно легко выразить в коде. Пожалуйста, предложите.

Edit: Основываясь на одном из предложений @David Hilditch, я придумал следующую карту символов и их звучащие слова.

A - ye,a,yay 
B - be, bee, 
C - see, sea, 
D - thee, dee, de
E - eh, ee, 
F - eff, F
G - jee, 
H - edge, hedge, hatch, itch
I - Aye, eye, I
J - je, jay, joy
K - kay, ke, 
L - el, yell, hell
M - am, yam, em
N - yen, en,
O - oh, vow, waw
P - pee, pay, pie
Q - queue,
R - are, err, year
S - yes, ass, S
T - tee, tea, 
U - you, U
V - we, wee,
W - double you, 
X - axe
Y - why
Z - zed, zee, jed

Ответ 1

Я думаю, что хороший вариант - следовать рекомендациям @rmunoz. Но если вы не хотите использовать внешнюю активность, то я боюсь, вам придется самостоятельно распознавать текст. Я также не уверен, насколько хорошо распознавание речи для писем в андроиде. Я полагаю, что механизмы, которые были созданы, были подготовлены для слов.

Я думаю, что это лучше всего выполнить с помощью Neural Networks. Во-первых, вам нужно будет собрать множество образцов разных людей, говорящих письма (за каждое письмо, которое вы получите, можно сказать 2 примера от человека). Вы также указали бы письмо, которое сказал человек. Поэтому предположим, что вы получаете 52 примера от человека, и у вас есть 10 человек. Теперь вы приобрели 520 примеров устных писем. После этого вы должны создать свою Neural Network из приведенных примеров. Здесь очень хороший учебник: https://www.coursera.org/course/ml. Тогда вам просто нужно запомнить эту нейронную сеть (параметры в нейронной сети) и использовать ее для классификации. Человек что-то говорит в своем микрофоне, и нейронная сеть классифицирует недавно полученный пример с буквой.

Есть только одна проблема. Как представить введенный пользователем звук, чтобы можно было обучить нейронную сеть, а затем классифицировать этот звук. Вы должны вычислить некоторые спектральные особенности введенного звука. Вы можете прочитать что-то об этом в http://www.cslu.ogi.edu/tutordemos/nnet_recog/recog.html. Но я настоятельно рекомендую вам просмотреть первую ссылку перед погружением в следующую (если вы еще ничего не знаете о нейронных сетях).

В других ответах есть предположение, что вы уже можете распознавать такие слова, как "Are". Но из моего понимания вопроса это не так. Таким образом, сопоставление, размещенное в вопросе, не поможет вам.

Ответ 2

Вы можете использовать текст из голоса с помощью API Google (быстро просмотрите http://developer.android.com/reference/android/speech/RecognizerIntent.html).

Затем, если вы хотите вывести язык (а затем и алфавит), вы можете использовать открытый проект под названием "Язык-детектор" на основе n-граммов:

http://code.google.com/p/language-detection/

Вы можете объединить его, используя "совпадения словаря" и другие функции, которые вы можете получить из текста.

Ответ 3

Если у вас уже есть ваша Java-программа, которая успешно распознает слово "Are", когда кто-то говорит "R", то почему бы просто не перечислить 26 буквенных слов и не перевести их?

например.

Ay, Aye, Ai -> A
Bee, Be -> B
Sea, See -> C
Dee, Deer, Dear -> D

Это слишком упрощенно? Похоже, это сработает для меня, и вы можете использовать любое программное обеспечение для распознавания речи, которое вам нравится.

У вас есть преимущество иметь очень ограниченную сферу контекста здесь (буквы алфавита), поэтому вам потребуется меньше часа, чтобы настроить это.

Вы можете сохранить запись любых слов, которые не будут успешно переведены, и вручную прослушать их, чтобы улучшить перечисление.

Сказав это, я уверен, что у большинства достойных программ распознавания речи есть возможность ограничить систему распознаванием букв и цифр, а не слов, но если нет, попробуйте мое решение - оно будет работать.

Чтобы создать свое перечисление, просто поговорите с вашей системой и попросите его перевести, когда вы читаете алфавит.

Ответ 4

Я прихожу из фона Speech Rec на IVR, но вы можете использовать пользовательскую грамматику языка для определения действительных высказываний.

Я считаю, что вы можете использовать что-то вроде http://cmusphinx.sourceforge.net/wiki/ или http://jvoicexml.sourceforge.net/, чтобы выполнить фактическое распознавание.

и грамматика, которую вы загрузите, может выглядеть так:

#JSGF V1.0;

grammar alphabet;

public <alphabet> = a | b| c |d | e;  //etc.....

Его немного избыточное распознавание букв в грамматике, которые уже являются частью языка, но это простой способ ограничить распознаватель, возвращая только высказывание, с которым вы хотите иметь дело.

Ответ 5

Дэвид прав. Поскольку ваш набор выходных данных ограничен, у вас есть возможность использовать правила ручного кодирования, такие как Are- > R.

Проблема заключается в том, что буквы похожи. Например, человек может сказать N, но ваша система распознает его как M. Вы можете взглянуть на языковое моделирование, чтобы предсказать вероятные последовательности символов. Например, если ваш пользователь сказал "Я" до и "G" после, двунаправленная языковая модель даст более высокую вероятность "N", чем "M".

И подходы на основе словаря тоже работают отлично. Если интерпретация буквы приводит к слову в словаре, а не в словаре Eg: "NOSE" и "MOSE", выберите тот, который действителен.