声学模型是指给定声学符号(音素)的情况下对音频特征建立的模型。

数学表达

用 \(X\) 表示音频特征向量 (观察向量),用 \(S\) 表示音素 (隐藏/内部状态),声学模型表示为 \(P(X|S)\)。

但我们的机器是个牙牙学语的孩子,并不知道哪个音素具体的发出的声音是怎么样的。我们只能通过大量的数据去教他,比如说在拼音「é」的时候对应「鹅」的发音,而这个过程就是 GMM 所做的,根据数据建立起「é」这个拼音对应的音频特征分布,即 \(P(x|s=é)\)。孩子学会每个拼音的发音后,就可以根据拼音拼读一个单词 / 一个句子,但你发现他在读某段句子的时候,听起来好像怪怪的,你检查发现是他把某个拼音读错了,导致这句话听起来和常理不符。而这个怪怪的程度就是你听到这个音频特征序列的时感觉这个音频序列以及其背后的拼音出现的可能性的倒数,这部分则是通过 HMM 来建模的。

总结一下,GMM 用于对音素所对应的音频特征分布进行建模,HMM 则用于音素转移和音素对应输出音频特征之间关系的建模。

HMM

即为隐马尔可夫模型(Hidden Markov model,HMM)

HMM 脱胎于马尔可夫链,马尔可夫链表示的是一个系统中,从一个状态转移到另一个状态的所有可能性。但因为在实际应用过程中,并不是所有状态都是可观察的,不过我们可以通过可观察到的状态与隐藏状态之间的可能性。因此就有了隐马尔可夫模型。

HMM 要遵循的假设:

  • 一阶马尔可夫假设:下一个状态只依赖于当前的状态。因此多阶马尔可夫链可简化为

    \[P(s_{t+1} | s_1,s_2,\ldots,s_t) = P(s_{t+1} | s_t)
    \]

  • 输出无关假设:每个输出只取决于当前 (内部/隐藏) 状态,和前一个或多个输出无关。

声学模型为什么要用HMM?

因为声学模型建立的是在给定音素序列下输出特定音频特征序列的似然 \(P(X|S)\),但在实际情况中,我们只知道音频特征序列,并不知道其对应的音素序列,所以我们需要通过 HMM 建立音频特征与背后的每个音素的对应关系,以及这个音素序列是怎么由各个音素组成的。

上两个假设可以引申出 HMM 中主要的两种概率构成:

  • 从一个内部状态 \(i\) 转移到另一个内部状态 \(j\) 的概率称为转移(Transition) 概率,表示为 \(a_{ij}\)。
  • 在给定一个内部状态 \(j\) 的情况下观察到某个观察值 \(x_t\) 的概率称为输出(Emission)概率,表示为 \(b_j(x_t)\)。

HMM 的三个经典问题

  • 评估问题 Estimation
  • 解码问题 Decoding
  • 训练问题 Learning

️:后文提到的状态即指的是内部 / 隐藏状态。

评估问题

评估问题就是说,我已知模型参数 \(\theta\) (输出概率以及转移概率),最后得到的观察序列为某个特定序列 \(X\) 的概率是多少。

在刚才的例子中,就是孩子已经知道每个拼音后面可能接什么拼音,每个拼音怎么读,当他读出了某段声音,这段声音的概率是多少。

因为在观察序列固定的情况下,有多种可能的状态序列 \(S\),而评估问题就是要计算出在所有可能的状态下得到观察序列的概率,表示为

\[\begin{aligned}
P(X) = \sum_S P(X | S) P(S) \\
\end{aligned}
\]

在当前的公式里,我们暂时先忽略固定的参数 \(\theta\)。根据一阶马尔可夫假设,时刻 \(t\) 的状态都只取决于时刻 t-1 的状态,因此单个状态序列出现的概率表示为

\[\begin{aligned}
P(S) &= P(s_1) \prod^T_{t=2} P(s_t|s_{t-1}) \\
&= \pi_k \prod^T_{t=2} a_{ij}
\end{aligned}
\]

其中, \(\pi_k\) 表示时刻1下状态为 \(k\) 的概率。

根据输出无关假设,在时刻 \(t\) 观察序列的值只取决于时刻 \(t\) 的状态,因此观察序列关于状态序列的似然表示为

\[P(X|S) = \prod_{t=1}^T P(x_t|s_t) = \prod_{t=1}^T b_j(x_t)
\]

因此整个观察序列出现的概率为

\[\begin{aligned}
P(X) &= \sum_S P(X | S) P(S) \\
&= \sum_S \pi_k b_k(x_1) \prod^T_{t=2} a_{ij} b_j(x_t)
\end{aligned}
\]

由于 \(i,j,k\) 都表示可能的状态,假设有 \(n\) 种状态,那么计算该概率的事件复杂度就为 \(O(n^T)\),可谓是指数级别了。

因此,前人开动了脑筋,提出了在该问题上将时间复杂度将为多项式时间的方法。

似然前向算法

该方法采用了分治 / 动态规划的思想,在时刻 \(t\) 下的结果可以利用时刻 \(t-1\) 的结果来计算。

在时刻 \(t\),观察序列的概率表示为前 \(t\) 个时刻的观察序列与时刻 \(t\) 所有可能的状态同时出现的概率和

\[P(x_1,x_2,\ldots,x_t) = \sum_{j\in N} P(x_1,x_2,\ldots,x_t,s_t=j)
\]

其中, \(N\) 表示所有可能的状态的集合。

而连加符号的后面部分被定义为前向概率 \(\alpha_t(j)\),而它可以被上一个时刻的前向概率迭代表示。

\[\begin{aligned}
\alpha_t(j) &=P(x_1,x_2,\ldots,x_t,s_t=j) \\ &= \sum_{i\in N} P(x_1,x_2,\ldots,x_{t-1},s_{t-1}=i)P(s_t|s_{t-1}=i)P(x_t|s_{t}=j) \\
&= \sum_{i\in N}\alpha_{t-1}(i) a_{ij} b_j(x_t)
\end{aligned}
\]

通过该方法,当前时刻下某个状态的概率只需要遍历上一时刻所有状态的概率 (\(n\)),然后当前时刻的所有状态的概率和也只需要遍历当前的所有状态就可以计算得到 (\(n\)),考虑到观察序列持续了 \(T\) 个时刻,因此时间复杂度降为 \(O(n^2T)\)。

整个过程总结如下

  1. 初始化:根据初始的状态分布,计算得到时刻1下每个状态的前向概率 \(\alpha_1(k) = \pi_k b_k(x_1)\)
  2. 对于每个时刻,计算该时刻下每个状态的前向概率 \(\alpha_t(j) = \sum_{i\in N}\alpha_{t-1}(i) a_{ij} b_j(x_t)\)
  3. 最终得到结果 \(P(X) = \sum_{i\in N}\alpha_{T}(i)\)

解码问题

解码问题就是说在得到 HMM 模型之后,我们如何通过观察序列找到最有可能的状态序列。在语音识别中,在给定的音频片段下,找到对应的各个音素。

还是刚才的例子,我们需要猜测孩子读出的这段声音最有可能对应什么样的拼音序列,这就是解码问题。

Viterbi 算法

数学表示

给定在时间 \(t\) 下的内部状态为 \(j\),局部最优概率 \(v_t(j)\) 表示的是在时刻 \(t\) 观察序列与最优内部状态序列的联合概率。

\[v_{t}(j)=\max _{s_{0}, s_{1} \ldots s_{t-1}} P\left(s_{0}, s_{1}, \ldots, s_{t-1}, x_{1}, x_{2}, \ldots, x_{t}, s_{t}=j | \theta\right)
\]

同样也可以根据时间递归表示为

\[v_{t}(j)=\max_{i \in N} v_{t-1}(i) a_{i j} b_{j}\left(x_{t}\right)
\]

算法具体流程如下

  1. 初始化:根据初始的状态分布,计算得到时刻1下每个状态的最优概率 \(v_1(k) = \pi_k b_k(x_1)\)
  2. 对于每个时刻,计算该时刻下每个状态的局部最优概率 \(v_t(j) = \max_{i\in N}v_{t-1}(i) a_{ij} b_j(x_t)\),记录下最优局部最优序列 \((s_1^*,s_2^*,\ldots,s_{t-2}^*) \bigcup (s_{t-1}^*)\)
  3. 最终得到全局最优概率 \(P(X,S^*) = \max_{i\in N} v_T(i)\)
  4. 得到全局最优序列 \(S^* = \arg \max_{i\in N} v_T(i), S^* = (s_1^*,s_2^*,\ldots,s_T^*)\)

在表示上很类似于上面的前向算法,只是加和变成了取最大值。具体推导流程也就不再赘述了。两者的区别可以看下图(来源) ,红线表示解码路径,黑线表示评估路径。

不过这张图是简化的状态,即状态序列 \(S\) 是确定的情况下的状态转移与观察序列之间的关系。

传统声学模型之HMM和GMM的更多相关文章

  1. kaldi基于GMM的单音素模型 训练部分

    目录 1. gmm-init-mono 模型初始化 2. compile-train-graghs 训练图初始化 3. align-equal-compiled 特征文件均匀分割 4. gmm-acc ...

  2. 音频工具kaldi部署及模型制作调研学习

    语音识别简介 语音识别(speech recognition)技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR).计算机语音识别(英语:Comput ...

  3. NLP入门之语音模型原理

    这一篇文章其实是参考了很多篇文章之后写出的一篇对于语言模型的一篇科普文,目的是希望大家可以对于语言模型有着更好地理解,从而在接下来的NLP学习中可以更顺利的学习. 1:传统的语音识别方法: 这里我们讲 ...

  4. Kaldi单音素模型 训练部分

    在Kaldi中,单音素GMM的训练用的是Viterbi training,而不是Baum-Welch training.因此就不是用HMM Baum-Welch那几个公式去更新参数,也就不用计算前向概 ...

  5. 语音识别传统方法(GMM+HMM+NGRAM)概述

    春节后到现在近两个月了,没有更新博客,主要是因为工作的关注点正从传统语音(语音通信)转向智能语音(语音识别).部门起了个新项目,要用到语音识别(准备基于Kaldi来做).我们之前做的传统音频已基本成熟 ...

  6. HMM 传统后向算法

    HMM 传统后向算法,已实现,仅供参考. package jxutcm.edu.cn.hmm.model; import jxutcm.edu.cn.hmm.bean.HMMHelper; impor ...

  7. 网络流量预测 国内外研究现状【见评论】——传统的ARIMA、HMM模型,目前LSTM、GRU、CNN应用较多,貌似小波平滑预处理步骤非常关键

    Time Series Anomaly Detection in Network Traffic: A Use Case for Deep Neural Networks from:https://j ...

  8. HMM隐马尔科夫算法(Hidden Markov Algorithm)初探

    1. HMM背景 0x1:概率模型 - 用概率分布的方式抽象事物的规律 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测. 概率模型(p ...

  9. 上下文无关的GMM-HMM声学模型

    一.语音识别基本介绍 (一)统计语音识别的基本等式 X------声学特征向量序列,观测值 W------单词序列 W*------给定观测值下,概率最大的单词序列 应用贝叶斯理论等价于 进而得出统计 ...

随机推荐

  1. 团队作业第五次——Alpha冲刺

    这个作业属于哪个课程 软件工程 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 Alpha冲刺 作业正文 正文 github链接 项目地址 其他参考文献 无 一.代码规范与计划 ...

  2. Rocket - debug - TLDebugModule

    https://mp.weixin.qq.com/s/EhUb1z5oiIw6dJ-90ifDJA 简单介绍TLDebugModule中的实现. 1. device device是一个设备描述符,包含 ...

  3. jchdl - GSL实例 - Add

    https://mp.weixin.qq.com/s/6xcYYdYZTBPTf25xFluzBQ   使用FullAdder级联实现加法器   参考链接: https://github.com/wj ...

  4. Java实现 蓝桥杯 算法训练 Pollution Solution

    试题 算法训练 Pollution Solution 问题描述 作为水污染管理部门的一名雇员,你需要监控那些被有意无意倒入河流.湖泊和海洋的污染物.你的其中一项工作就是估计污染物对不同的水生态系统(珊 ...

  5. Java实现 LeetCode 240 搜索二维矩阵 II

    public static boolean searchMatrix(int[][] matrix, int target) { if(matrix.length == 0) return false ...

  6. 类似-Xms、-Xmn这些参数的含义:

    类似-Xms.-Xmn这些参数的含义: 答: 堆内存分配: JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 默认空余堆内存小于 ...

  7. java实现第六届蓝桥杯牌型整数

    牌型整数 题目描述 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不 ...

  8. (三)linux三剑客之sed

    一.sed是什么? 二.sed的工作原理? 三.sed的基本用法? 四.sed的进阶使用? 一.sed是什么? sed 就是一个非交互式流编译器: 交互式:文件缓存.人工编译.全局并行可逆 非交互式: ...

  9. 如何在本地搭建微信小程序服务器

    现在开发需要购买服务器,价格还是有点贵的,可以花费小代价就可以搭建一个服务器,可以用来开发小程序,博客等. 1.域名(备案过的) 2.阿里云注册免费的https证书 3.配置本地的nginx 4.内网 ...

  10. @uoj - 310@ 【UNR #2】黎明前的巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Evan 和 Lyra 都是聪明可爱的孩子,两年前,Evan 开 ...