11

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

例如,当用户说“ R ”时,它应该给我“R”而不是“Are”。

如何在 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
4

6 回答 6

6

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

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

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

您可以使用“字典巧合”和您可以从文本中获得的其他功能来组合它。

于 2012-09-16T17:58:35.533 回答
4

我认为一个不错的选择是遵循@rmunoz 发布的指导方针。但是,如果您不想使用外部活动,那么恐怕您必须自己编写文本识别代码。我也不确定,android 中字母的语音识别有多好。我想背后的机制是受过语言训练的。

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

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

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

于 2012-09-25T09:28:58.313 回答
3

如果您的 Java 程序在有人说“R”时成功识别出“Are”这个词,那么为什么不列举 26 个字母的词并翻译它们呢?

例如

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

是不是太简单了?似乎它对我有用,你可以使用任何你喜欢的语音识别软件。

您的优势是这里的上下文范围非常有限(字母表),因此配置它只需不到一个小时。

您可以记录任何未成功翻译的单词并手动收听以改进您的枚举。

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

要构建您的枚举,只需与您的系统对话并在您背诵字母表时将其翻译。

于 2012-09-25T01:22:39.170 回答
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.....

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

于 2012-09-22T02:30:18.850 回答
2

大卫是对的。由于您的输出集是有限的,您可以选择手动编码规则,例如 Are->R。

问题在于听起来相似的字母。例如,该人可能说 N,但您的系统将其识别为 M。您可以查看语言建模来预测可能的字符序列。例如,如果您的用户之前说“I”,之后说“G”,则双向语言模型将给予“N”比“M”更高的概率。

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

于 2012-09-25T05:12:47.027 回答
2

Any Speech-to-text platform should work as needed. This post discusses some of the available options, which include the built-in speech-to-text, an open-source option called CMUSphinx, and a free, closed source option from Microsoft.

于 2012-09-25T15:04:26.990 回答