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

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

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

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

为了解决这个问题,我们将单词划分为更小的单元,称为电话。在英语(和许多印度语言)中,大约有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组合在一起形成一个巨大的网络。识别基本上是在如此大的空间中的搜索问题。在更大的空间,问题就越大。实时识别涉及使用维特比算法扫描网络以获得语音信号的转录。

回答过的其他问题

如何获取TOCO tf_convert的冻结Tensorflow模型的input_shape

如果再次启动Tensorboard,请返回到您看过的图表,应该有一个搜索图标(我想在左上角),您可以在其中输入“输入”并找到输入张量。它会给你想要的形状。我猜这将是'[1,image_size,image_size,3]'形式的东西。 或者,您可以检查代码 feed_dict ...... 展开详请

新手搜索正则表达式

已采纳
以下应该可以工作: \b(?:all\s)?right\b 这匹配right并且前面有一个可选的(?)all+空格(\s)(如果存在)。 该\b锚在那里,以确保有一个单词边界之前all或right之后right。 此外,?:这里不捕获该all\s组。 例 编辑 它是/它是: ...... 展开详请

播种多线程unif_rand()

在评论中宣传 dqrng后,我意识到我没有编写任何关于如何使用该软件包中的RNG进行并行使用的文档。所以我开始了如下操作,它将成为下一个版本的一部分。这是其中一个示例,与您尝试执行的操作非常相似: #include <Rcpp.h> // [[Rcpp::depends(d...... 展开详请

过滤r中行的最长重复序列序列的数据帧

如下: test.data[] <- t(apply(test.data,1,function(x) {y<-rle(x) y$values[y$lengths==1] <- 0 y$values[y$lengths!=max(y$l...... 展开详请

运行Junit @Test方法时出现NoSuchMethodError

不需要检查你的类路径,是的,在大多数情况下,它是由使用的不同版本的JARS引起的。对我而言,它与Spring Boot版本有关,因此下面有调试步骤: 1)检查你的txt调试文件(通常是在target / surefire-reports中)2)在这个调试文件中,获取导致错误的包...... 展开详请

C#参数中的键值对

你可以让你的Message类实现IEnumerable接口并给它一个Add方法。然后,您就可以使用集合初始化器语法: Agent.SendMessage ( new Message(MessageTypes.SomethingHappened) {{ "foo", 42...... 展开详请

扫码关注云+社区