Python学习

【笔记】语音识别(上)

笔记为观看王赟老师的网课语音识别之前世之后所记录,记录下来帮助理解以及日后复习用。
最近很粉王老师呀!
贴上他的知乎主页 王老师知乎首页

孤立词识别

特征提取

语音识别采样率最低为8000Hz,8000Hz刚好听清楚说的什么东西。采样率更多,
如果原来的采样率为8000Hz,那么得到的频谱上限为4000Hz,为采样率的一半。由奈奎斯特1928年提出的。
频谱具有精细结构和包络结构。精细结构反映音高用处比较小,包络反映音色,是主要信息。
提取特征的任务就是将精细结构去掉,只留下包络.通过三角滤波实现.计算每一个三角形之中的能量.频谱(幅度谱得平方一下)乘上三角形在横轴上去积分.将每一个三角形的能量连接起来.得到滤波器组输出(Filterbank output,近似频谱包络).横轴就是三角形的个数.
三角形低频较密,高频较疏.模仿人耳的听觉敏感度.
再经行离散余弦变换,40个数变为13个数. MFCC是默认特征.
MFCC中第一个系数为能量.
将频谱图拼接在一起,就变成了语谱图.
将每一帧的MFCC系数拼在一起就成了MFCC序列.

优点:排除基频\符合听觉\纬度低
缺点:视野小,受环境影响大(噪声\回声\滤波)
改进:加入一阶二阶差分,各种归一化(差分:相邻两个相减)

动态弯算法 (对齐算法)

DTW

  • 让待识别语音中的每一帧与模板中最相似的一帧匹配
  • 要保持顺序
  • 动态规划算法
    总距离为各帧的欧式距离之和
    找一种合适的方式让相似帧去匹配

GMM

将模板替换成模型
用高斯混合模型来拟合特征分布.高斯分布的叠加就是高斯混合模型
在空间呈椭球状

  • 均值:中心
  • 协方差:椭球形各个方向的长度
  • 权重:各个椭球的权重 期望最大化(EM算法)

训练模型:

  • 将模板切成多个段落(选择一个模板,剩余模板和它对齐)
  • 用高斯分布的叠加拟合每段中特征向量的分布
    • 对于任意特征向量可给出概率密度
      如何用模型来识别未知语音:
  • 用”动态弯”算法对齐待识别语音与模型
    • 用GMM概率密度代替特征向量间的欧式距离
    • 相乘得到P(待识别语音|模型) 这里隐含了一个独立性假设
  • 取概率最大的模型为识别结果

HMM

对音素持续时间建模

  • 添加状态间的转移概率(状态的个数看句子的复杂程度,其没有确切的物理意义的)
  • P(语音,对齐方式|模型) = GMM观测概率 * HMM转移概率(语音和对齐方式的联合概率)

隐马尔可夫模型特点

  • 隐性:特征序列由隐状态产生,对齐方式未知
  • 马尔可夫性:
    • 转移概率与观测概率只由当前状态决定
    • 推论:状态持续时间服从指数分布 (无记忆分布,指数分布不符合事实,一般状态持续时间是高斯分布,这是一个缺陷)
  • 模型参数:
    • 转移概率
    • 观测概率(GMM,若干个分量,均值协方差)
    • 模型是单向的,不必讨论初始概率

HMM三大问题

  • 求值问题: 给定模型参数和语音,求P(语音|模型)
    • 把P(语音,对齐|模型)对所有对齐方式求和
    • 动态规划算法:Forward algorithm (只考虑了输出概率GMM)
  • 解码: 给定模型参数和语音,求最佳对齐方式
    • 动态规划算法: Viterbi decoding
    • 这是”动态弯”算法的升级版(考虑了输出概率GMM和转移概率HMM)
    • 最佳对齐方式的概率,可以作为总概率的近似
  • 训练: 给定语音和模型结构,求模型参数
    • 如果知道了对齐方式,就好办了.

EM训练算法

鸡生蛋蛋生鸡问题:

  • 如果知道了对齐方式,则容易求模型参数
  • 如果知道了模型参数,也容易求对齐方式

解决办法:

  • 先瞎猜一种对齐方式(如均匀分割)
  • 由此求出模型参数(M步)
  • 然后更新对齐方式(E步)
    • 可用Viterbi求最好的方式(只能求一个),实际用Forward-backward软判决(能求多个方式及其概率)
  • 循环直至收敛

最然似然估计: 最大化P(训练语音|模型)

语音识别基本方程

W*=argmaxP(W|X)=argmaxP(X|W)P(W)/P(X)=argmaxP(X|W)P(W)

  • W*:识别结果
  • W: 任一单词
  • X: 待识别的语音信号
  • P(X|W): 声学模型(GMM+HMM)
  • P(W): 单词的先验概率

连续语音识别

W=argmaxP(X|W)P(W)
W和W
由单词变为了句子

  • P(X|W):句子的声学模型
    • 可由单词的声学模型穿起来
  • P(W): 句子的先验概率–语言模型
    • 通俗理解:一句话是否像话

语言模型

  • 链式法则:
    • P(皮卡皮卡丘)=P(皮)P(卡|皮)P(皮|皮卡)*P(卡|皮卡皮)…
    • 根据半句话猜下一个词
  • 最常见形式: n-gram
    • 每个词至于前n-1个词有关
      • Bigram(n=2): P(皮卡皮卡丘)=P(皮)P(卡|皮)P(皮|卡)*P(卡|皮)…
      • Trigram(n=3): P(皮卡皮卡丘)=P(皮)P(卡|皮)P(皮|皮卡)*P(卡|卡皮)
      • 容易训练和使用
  • 其他形式: 最大熵\神经网络…
  • Bigram是马尔科夫模型
    • 下一个词只与当前词有关
    • 模型是遍历的,不是单向的
    • 可与单词的声学模型复合,得到一门语言的HMM

大量词汇语音识别

不能为每个单词训练单独的HMM
改成为每个因素训练一个HMM
HMM的复合

  • 因素HMM按词典拼接成单词HMM
  • 单词HMM与语言模型复合为语言HMM

训练

  • 给定许多语音和对应的音素串,求模型参数
  • 每个因素串的HMM是单向的,仍用EM算法 (多音字问题,可以用词法转移)
    解码
  • 给定一门语言的HMM和一条语音,求单词串
  • 用Viterbi算法求最佳路径(beam search剪枝)
    • 也可以得到n-best list 或lattice

语音识别系统结构

语音信号->特征提取->解码器(声学模型(GMM-HMM)\词典\语言模型(Bigram))->识别结果
评价标准:词错误率 (WER)

  • 计算方法:
    • 将标准答案与识别结果对齐
    • 用插入+删除+替换错误/标准答案的长度
    • 对齐是的错误数最少
  • 最优对齐不一定唯一
  • 对其不考虑单词读音的相似性
  • WER可能高于100%
    人类停歇的错误率范围2~4%

潘多拉魔盒

语音信号->特征提取->解码器(声学模型(GMM-HMM)\词典\语言模型(Bigram))->识别结果
打了很多补丁

上下文有关模型

两个ai不一样,分别是ai(f,v)和ai(n,n)
两个n不一样,取决于前后的单词

  • 上下文聚类
    • 上述方法状态会爆炸
    • 聚类来缩小,ai(f,v)和ai(n,n)可能仍不同,但ai(m,n)与ai(n,n)可能就一样了.
      英文保留几千个因素就可以了.

区分式训练

  • EM算法是最大似然估计
    • 最大化P(X|W),W是训练文本
    • 但P(X|W可能更大了),W是W的竞争者
    • 导致P(W|X)不一定最大化
  • 区分式训练(discriminative training)
    • 优化概率用MMI最大化互信息/优化次错误率
    • 让P(X|W)大,同时让P(X|W)小
    • 竞争者: 来自最大似然系统输出的n-best list 或lattice

说话人适应

  • 说话人相关训练(speaker dependent training)
    • 在训练时,专门收集特定说话人的数据
  • 说话人适应(speaker adaptation) 是否可以用转移学习
    • 在测试时,把模型参数或待识别语音的特征整体平移,使二者互相适应
    • 模型参数可以不断更新,逐步适应说话人
  • 说话人适应训练(speaker adaptive training)
    • 再训练时,提取说话人的特征(i-vector:用比较短的向量,代表说话人的特点),与声学特征一同作为模型的输入

二次打分(解决语言模型问题)

  • 解码器只能利用n-gram语言模型
    • HMM的状态数随n指数增长
    • 还要考虑编程复杂度
    • 实际一般只用bigram
  • 如何利用更好的语言模型
    • 用bigram识别得n-best list或lattice
    • 用更好的语言模型对这些句子重新打分,选出最优解

这些补丁确实降低了WER
但是

  • 系统宾得复杂到难以驾驭
  • 各模块是单独训练得,用力并不统一
    天下大势分久必合

Kaldi
HCLG HMM Context Lexicon Gramma

One comment

Leave a Comment

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据