识别使用Java的人说的字母

问题描述 投票:11回答:6

我需要识别用户在设备的麦克风中说出的字母。该设备可以是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
java android speech speech-to-text
6个回答
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中阅读有关此内容的信息。但我强烈建议您在进入下一个链接之前先查看第一个链接(如果您对神经网络一无所知)。

[其他答案均假设您已经可以识别诸如“ Are”之类的单词。但是据我对问题的理解,事实并非如此。因此,问题中发布的映射将无济于事。


6
投票

您可以使用通过Google的API从语音中获取文本(快速浏览http://developer.android.com/reference/android/speech/RecognizerIntent.html。]

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

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

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


3
投票

[如果您的Java程序已经在有人说'R'时成功识别了'Are'一词,那为什么不只列举26个字母的单词并将其翻译呢?

例如

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

太简单了吗?似乎对我来说可以使用,您可以使用任何喜欢的语音识别软件。

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

您可以保留所有未成功翻译的单词的记录,并手动收听以提高您的枚举。

话虽如此,我敢肯定,大多数体面的语音识别软件都可以选择将系统限制为识别字母和数字,而不是单词,但是如果不能,请尝试我的解决方案-可以。

要建立枚举,只需与您的系统对话,并在您背诵字母时进行翻译。


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.....

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


2
投票

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

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

而且基于字典的方法也很好用。如果解释字母导致字典中的单词与字典中的单词不匹配,例如:“ NOSE”与“ MOSE”,请选择一个有效的单词。


2
投票

任何语音转文字平台都应根据需要运行。 This post讨论了一些可用的选项,包括built-in speech-to-text,称为CMUSphinx的开源选项和来自Microsoft的免费,封闭源option

© www.soinside.com 2019 - 2024. All rights reserved.