如何做到精准的语音识别?

  • 回答 (6)
  • 关注 (1)
  • 查看 (819)

我经常想知道技术是否会赶上科幻想象力,我最终会与一个可以与人类无缝交谈的机器人进行交互?我想知道我们如何构建世界上最准确的语音识别系统?

秋之夕颜清秋之夕颜清提问于
坐看云起时冒险家回答于

为了解决这个问题,我们将单词划分为更小的单元,称为电话。在英语(和许多印度语言)中,大约有50个电话可以组合成任何单词。例如,单词“Hello”可以分为“HH,AH,L,OW”。您可以查找CMU发音字典[6]以进行英语单词的语音扩展。

ASR的问题归结为识别电话序列而不是单词。这需要为每部手机构建ML模型。这些模型称为单声道模型。如果你能很好地识别手机,你已经解决了ASR问题的很大一部分。不幸的是,识别手机并非易事。

如果我们绘制电话话语的傅立叶频谱,则可以看到明显的峰值,如图中所示:  Formant Frequencies  [5]。

峰值频率F1和F2是手机的关键指标。这里显示了元音相对于F1和F2的散点图。可以看出,扩散很大并且经常彼此重叠。 元音之间主导频率的变化。没有明确的界限来区分元音  [3]。

这种重叠使得ML算法难以区分电话。

单声道的另一个问题是它们经常受到相邻电话的影响。 该图示  出了时域以及语音话语“脚跟”的时频域(STFT)表示。 时间域和STFT表示单词“Heel” [ 页面在upenn.edu ]。

鞋跟这个词可以在发音上扩展为“HH IY L”。在图中可以清楚地看到电话“HH”对“IY”的影响。Triphone模型(也称为上下文相关模型)被提议作为模拟该上下文依赖性的解决方案。这里的模型是针对三音素的每种可能的变化而构建的,希望它们能够捕获足够的上下文变化。这种三音素的可能数量将是50 ^ 3的数量级,这是非常高的数量。建立如此大量的模型同样是不可行的。幸运的是,并非所有三音素都使用英语(其他语言)。经过一些巧妙的技巧后,我们可以将分类单元的数量减少到5,000-10,000。

即使有良好的音素识别,仍然很难识别语音。这是因为预先没有定义单词边界。这在区分语音相似的句子时会引起问题。这类句子的一个典型例子是“ 让我们破坏一个漂亮的海滩 ”和“ 让我们认识演讲 ”。这些句子在语音上非常相似,声学模型很容易在它们之间混淆。ASR中使用语言模型(LM)来解决此特定问题。

另一个破坏ASR系统的因素是重音。就像人类一样,机器也很难用不同的口音来理解同一种语言。有关示例,请参阅此视频

这是因为系统先前为特定重音学习的分类边界对于其他重音不会保持不变。这就是为什么ASR系统在配置过程中经常询问您的位置/说话风格(例如英语 - 印度语,英语 - 美国语,英语 - 英语)的原因。

到目前为止所描述的复杂性是自然语言的一部分。即使具有如此大的复杂性,在无噪声环境中识别语音通常被认为是解决的问题。噪音和回声等外部影响是罪魁祸首。

录制音频时,噪音和回声是不可避免的干扰。由于来自诸如墙壁,镜子和桌子的表面的语音能量的反射,发生回声。当扬声器靠近麦克风说话时,这不是什么大问题。但是,当从远处说话时(例如,通过Amazon Echo进行购买),相同信号的多个副本将以不同的时间延迟和强度进行反映和组合。这将导致电话随着时间的推移而拉伸并最终破坏相邻的语音信息。

这种现象称为涂抹。去除污点的过程称为dereverberation,这是解决混响问题的常用技术。

ASR中另一个值得注意的问题是在解码阶段。在这里,LM和AM组合在一起形成一个巨大的网络。识别基本上是在如此大的空间中的搜索问题。在更大的空间,问题就越大。实时识别涉及使用维特比算法扫描网络以获得语音信号的转录。

回答过的其他问题

如何更改数组中的值?

我在行动中可以看到一个错误.php是:

require(' tables.php ');

它应该是:require(' tables.php ');

我的气流DAG和操作员没有按照我的预期行事

你的代码看起来很好。如果关闭DAG,是否会在文件中附加一些行?

我认为你所看到的是回填执行。你今天把你的开始日期隐含在午夜。因此,气流将在每小时最终运行任务之前赶上并启动这些DAG运行。

数组列表中的Java对象

您ArrayList在Zeitansager必须型的Zuhoerer,而不是String。 然后在你的循环中sagAn()你需要调用: abonnenten.get(i).update(); 代替: abonnenten.upd...... 展开详请

如何对Hyperledger织物代码进行测试?

解决了,但我不知道发生了什么以及为什么。VScode将在顶部提供“运行文件测试||运行包测试”提示,我点击它并运行成功。

如何在两种图案之间打印线条?

我通过搜索引擎搜索了这个问题,我有一个简明的回复提供: 伪代码 perl -ne 'print if /begin_string/ .. /ending_string/' file.txt 真实的代码 perl -ne 'print if /^foo/ .. /^base/'...... 展开详请

.NET中的只读/Const在哪里?

constC#中的方法参数没有修饰符。如果你想拥有类似于const保证的东西,你可以在接口中使用不可变类型。例如,方法可以接受IEnumerable<T>而不是可变集合类型。你也可以看看ReadOnlyCollection

关于作者

扫码关注云+社区