识别一个人用java说的信

时间:2012-09-16 17:52:06

标签: java android speech speech-to-text

我需要将用户说出的字母识别为设备的麦克风。该设备可能是Android驱动的手机。

例如,当用户说' R '时,它应该给我'R'而不是'是'..

如何在java中完成这种口头字母识别?我正在寻找可以在代码中轻松表达的想法。请建议。

修改 的 基于@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

6 个答案:

答案 0 :(得分:6)

您可以使用Google的API从语音中获取文字(快速查看http://developer.android.com/reference/android/speech/RecognizerIntent.html)。

然后,如果你想推断语言(然后是字母表),你可以使用一个名为"语言检测器的开放项目"基于n-gram:

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

你可以使用"词典巧合"以及您可以从文本中获得的其他功能。

答案 1 :(得分:4)

我认为一个很好的选择是遵循@rmunoz发布的guidlines。但是如果你不想使用外部活动,那么我担心,你必须自己编写文本识别代码。我也不确定,android中字母的语音识别有多好。我认为背后的机制是针对单词进行训练的。

我认为最好用Neural Networks完成。首先,你必须收集很多不同人的样本,说出来信(你得到的每封信都可以说是一个人的2个例子)。你也可以表示这封信所说的那封信。因此,假设以这种方式,您从一个人那里得到52个例子,并且您有10个人参与。现在你获得了520个口头字母的例子。之后,您必须从提供的示例构建您的神经网络。这里有一个非常好的教程:https://www.coursera.org/course/ml。然后你只需要记住这个神经网络(神经网络中的参数),并将其用于分类。这个人在他们的麦克风中说话,神经网络用新的信件对新获得的例子进行分类。

只有一个问题。如何表示用户输入的声音,以便可以训练神经网络并在以后对该声音进行分类。您必须计算输入声音的一些光谱特征。您可以在http://www.cslu.ogi.edu/tutordemos/nnet_recog/recog.html中阅读有关该内容的内容。但我强烈建议你,在进入下一阶段之前先查看第一个链接(如果你还不了解神经网络的话)。

其他答案有一个假设,即你已经可以识别出诸如“Are”之类的单词。但根据我对这个问题的理解,情况并非如此。因此,问题中发布的映射对您没有帮助。

答案 2 :(得分:3)

如果你已经让你的Java程序成功识别出“有人”这个词,当有人说'R'时,为什么不只是枚举26个字母单词并翻译它们?

e.g。

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

这太简单了吗?看起来它对我有用,你可以使用你喜欢的任何语音识别软件。

你的优点是在这里有一个非常有限的上下文区域(字母表中的字母)所以你需要不到一个小时来配置它。

您可以记录任何不能成功翻译的单词,并手动收听它们以改善您的枚举。

话虽如此,我确信最体面的语音识别软件可以选择限制系统识别字母和数字而不是单词,但如果没有,请尝试我的解决方案 - 它会起作用。

要构建您的枚举,只需与您的系统对话,并在朗读字母表时进行翻译。

答案 3 :(得分:2)

我来自IVR的Speech Rec背景,但你可以使用自定义语言语法来定义什么是有效的话语。

我相信您可以使用http://cmusphinx.sourceforge.net/wiki/http://jvoicexml.sourceforge.net/之类的内容来执行实际识别。

你要加载的语法可能如下:

#JSGF V1.0;

grammar alphabet;

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

它有点冗余识别语法中已经是语言一部分的字母 - 但它是一种简单的方法来限制识别器只返回你想要处理的话语。

答案 4 :(得分:2)

大卫是对的。由于您的输出设置有限,您可以选择手动编码规则,如Are-&gt; R。

问题在于字母听起来很相似。例如,该人可能已经说过N,但您的系统将其识别为M.您可以查看语言建模以预测可能的字符序列。例如,如果您的用户之前说'我'和'G'之后,双向语言模型会给'N'提供比'M'更高的概率。

基于字典的方法也可以正常工作。如果解释这个字母会导致字典中的单词与不在字典中的单词例如:“NOSE”vs“MOSE”,则选择有效的单词。

答案 5 :(得分:2)

任何语音到文本平台都应该按需运行。 This post讨论了一些可用选项,其中包括built-in speech-to-text,一个名为CMUSphinx的开源选项,以及来自Microsoft的免费,封闭源option