端到端语音识别技术全解析
1. 解码方法
在端到端语音识别中,有两种重要的解码方法:重评分(Rescoring)和单遍解码(One - Pass Decoding)。
1.1 重评分
重评分采用两步法。第一步,从注意力解码器生成一组完整的假设。第二步,基于CTC和注意力概率对这些假设进行重新评分(使用前向算法获取CTC概率)。其公式如下:
$\hat{C} = \arg\max_{h\in\hat{\Omega}}{\lambda\alpha_{CTC}(h,X)+(1 - \lambda)\alpha_{ATT}(h,X)}$
1.2 单遍解码
单遍解码专注于在生成字符时计算部分假设的概率。还可以将语言模型融入解码过程,通过在解码器中添加额外的语言建模项:
$\hat{C} = \arg\max_{C\in U^*}{\lambda \log P_{CTC}(C|X)+(1 - \lambda)\log P_{ATT}(C|X)+\gamma \log P_{LM}(C)}$
在波束搜索中,每个不完整假设$h$的得分可以描述为:
$\alpha(h) = \lambda\alpha_{CTC}(h)+(1 - \lambda)\alpha_{ATT}(h)+\gamma\alpha_{LM}(h)$
计算注意力和语言模型得分相对直接:
$\alpha_{ATT}(h) = \alpha_{ATT}(g)+\log P_{ATT}(c|g,X)$
$\alpha_{LM}(h) = \alpha_{LM}(g)+\log P_{LM}(c|g,X)$
其中$h = g;c$,$g$是已知假设,$c$是附加到序列以生成$h$的字符。而CTC得分由于可能产生字符序列的序列数量较多,更为复杂。CTC得分是所有以$h$为前缀的序列的总和:
$P(h,…|X) = \sum_{v\in(U \cup {
})^+}P(h;v|X)$
$\alpha_{CTC}(h) = \log P(h,…|X)$
2. 语音嵌入和无监督语音识别
无监督数据的数量可能比配对的语音 - 文本平行语料库的数量高出几个数量级。因此,无监督语音识别和用于音频处理的声学嵌入是很有前景的研究领域。
2.1 语音嵌入
早期的语音嵌入工作之一使用了一种连体网络来训练声学词嵌入,使发音相似的词在嵌入空间中彼此靠近。该网络分两部分训练:首先,训练一个CNN分类模型对固定音频片段(2秒)中的口语词进行分类;然后,将该网络固定并融入词嵌入网络,该网络训练使正确词的嵌入与声学嵌入对齐,同时分离错误词。为减少输入嵌入空间的大小,仅使用前50,000个字母n - 元组。嵌入空间产生了如(please, pleas)、(plug, slug)和(heart, art)等相似性。另外,也有使用连体CNN网络来区分不同词对的工作,其结果与强监督的词分类模型相似。
2.2 Unspeech
在Unspeech中,作者使用连体网络训练嵌入,用于声学模型的说话人自适应、话语聚类和说话人比较。该工作基于相似语音区域可能有相同说话人的假设,真实和虚假说话人示例的上下文取自同一话语中的相邻上下文窗口或不同文件,类似于负采样的概念。
2.3 Audio Word2Vec
CNN方法的一个缺点是需要固定长度的音频片段。Audio Word2Vec使用序列到序列自动编码器来学习可变长度口语词的固定表示,由于学习的表示就是输入本身,因此可以完全无监督地学习。后来,它被扩展到话语级别,使用分段序列到序列自动编码器(SSAE),该方法学习分割门来确定话语中的词边界,并学习每个片段的编码。由于学习离散变量不可微,使用强化学习来估计相关数量。
3. 案例研究
本案例研究聚焦于在Mozilla Common Voice数据集上构建自动语音识别(ASR)模型,主要涉及Deep Speech 2模型和ESPnet。
3.1 软件工具和库
自Deep Speech 2论文发布以来,有多种开源实现,常见区别在于使用的深度学习框架,如Mozilla的TensorFlow实现、PaddlePaddle实现和PyTorch版本。这里选择PyTorch实现,因其简单性。此外,CTC + 注意力模型(如ESPnet)是最新进展之一,该工具包专注于端到端语音识别和文本到语音,使用Chainer和PyTorch作为后端,并提供一些现代架构的Kaldi风格配方。
3.2 Deep Speech 2
使用PyTorch实现的Deep Speech 2,包含并行数据加载器以加速模型训练、优化的CTC损失函数、支持语言模型的CTC解码库以及用于声学模型训练的数据增强。
- 数据准备 :数据准备可以采用目录结构或清单文件。对于基于字符的模型,无需额外的音标字典,数据在加载时被处理成频谱图并转换为张量。清单文件类似于Kaldi和Sphinx结构,包含每个数据集分割的示例列表,在使用可变长度RNN时可用于过滤较长的文件。
- 声学模型训练 :首先根据默认配置训练基础模型,该模型有两个卷积层和五个双向GRU层,约有4100万个可学习参数。训练过程中启用增强步骤,对节奏和增益进行小的更改以减少过拟合。所有模型在GPU上训练,基于验证集的WER进行早停。训练约15个周期后模型开始发散,最佳验证WER为23.470。在测试集上,使用贪心解码,平均WER为22.611,CER为7.757。
| 参考文本 | 预测文本 | WER | CER |
|---|---|---|---|
| i understand sheep they’re no longer a problem and they can be good friends | i understand shee they’re no longery problem and they can be good friends | 0.214 | 0.027 |
| as he looked at the stones he felt relieved for some reason | ashe looked at the stones he felt relieved for som ason | 0.333 | 0.051 |
以下是Deep Speech 2的训练流程mermaid图:
graph LR
A[数据准备] --> B[声学模型训练]
B --> C[模型评估]
- 语言模型训练 :基于字符的预测在没有语言模型的情况下也能产生合理的转录,但在解码阶段提供语言模型可以改善贪心预测。使用ctcdecode包应用不同的解码方案,该语言模型还包含字符FST,可作为拼写检查器。使用KenLM工具包训练n - 元语言模型,从训练语料库的转录创建语言模型。通过在验证集上评估确定最佳语言模型,结果如下表所示:
| 解码方法 | WER | CER |
|---|---|---|
| 无 | 22.832 | 8.029 |
| 2 - gram | 12.919 | 7.292 |
| 3 - gram | 12.027 | 6.990 |
| 4 - gram | 11.865 | 6.915 |
| 5 - gram | 11.977 | 6.955 |
增加波束大小会线性增加计算时间,选择合适的波束大小是性能和质量之间的良好折衷。使用4 - 元语言模型和波束大小为512时,在测试集上的WER为5.587,CER为3.232。
| 解码方法 | WER | CER |
|---|---|---|
| 4 - gram, beam = 10 | 11.865 | 6.915 |
| 4 - gram, beam = 64 | 7.742 | 4.458 |
| 4 - gram, beam = 128 | 6.939 | 3.984 |
| 4 - gram, beam = 256 | 6.288 | 3.616 |
| 4 - gram, beam = 512 | 5.857 | 3.375 |
3.3 ESPnet
ESPnet是一个受Kaldi启发的端到端语音处理工具包,它结合了混合CTC - 注意力架构,主要包含一些先进的架构。该工具包大部分是基于bash脚本,使用Chainer和PyTorch作为后端。在本案例研究中,使用ESPnet工具包在Common Voice数据集上训练混合CTC - 注意力架构。
- 数据准备 :数据准备与Kaldi非常相似,部分预处理依赖Kaldi,但不需要Kaldi中的音标词典。生成MFCC特征并将其存储为JSON格式,该格式包含目标转录、分词后的转录、特征位置以及训练各组件所需的一些额外信息。以下是格式化训练数据的示例:
{
"utts": {
"cv - valid - dev - sample - 000000": {
"input": [
{
"feat": ".validdev/deltafalse/feats.1.ark:27",
"name": "input1",
"shape": [
502,
83
]
}
],
"output": [
{
"name": "target1",
"shape": [
55,
31
],
"text": "BE CAREFUL WITH YOUR PROGNOSTICATIONS SAID THE STRANGER",
"token": "B E <space> C A R E F U L <space> W I T H <space> Y O U R <space> P R O G N O S T I C A T I O N S <space> S A I D <space> T H E <space> S T R A N G E R",
"token_id": "5 8 3 6 4 21 8 9 24 15 3 26 12 23 11 3 28 18 24 21 3 19 21 18 10 17 18 22 23 12 6 4 23 12 18 17 22 3 22 4 12 7 3 23 11 8 3 22 23 21 4 17 10 8 21"
}
],
"utt2spk": "cv - valid - dev - sample - 000000"
},
...
}
}
提取特征并创建输入文件后,网络即可开始训练。
- 模型训练 :模型训练过程在一定程度上遵循Kaldi脚本。提取特征后,运行训练脚本。训练的模型是一个4层双向LSTM编码器和1层单向LSTM解码器,使用Adadelta在单个GPU上训练20个周期。以下是完整的训练参数列表:
python asr_train.py --backend pytorch --outdir exp/results --dict data/lang1char/train_nodup_units.txt --minibatches 0 --resume --train - json dump/cv_valid_train/deltafalse/data.json --valid - json dump/cv_valid_dev/deltafalse/data.json --etype blstmp --elayers 4 --eunits 320 --eprojs 320 --subsample 1 2 2 1 1 --dlayers 1 --dunits 300 --atype location --adim 320 --aconv - chans 10 --aconv - filts 100 --mtlalpha 0.5 --batch - size 30 --maxlen - in 800 --maxlen - out 150 --sampling - probability 0.0 --opt adadelta --epochs 20
训练过程中可以监控CTC和注意力的损失,以确保收敛的一致性。训练和验证的总体损失是这两个组件的加权和。验证损失在最后一个周期之前与训练数据损失趋势一致。为了获得最佳模型,应继续训练直到验证损失持续偏离训练损失,并选择在验证数据上表现最佳的模型。
训练过程中的损失曲线和准确率曲线如下:
通过绘制解码过程中每个时间步的权重,可以检查输出注意力权重。可视化注意力可以显示推理过程中输入的哪一部分被关注。早期阶段,注意力与输入的对齐存在一些中断,而后期注意力与输入无缝对齐。
基础模型在测试集上使用贪心解码(波束大小为1)时,WER为12.34,CER为6.25。在测试集的预测中加入波束搜索(ESPnet默认选择为20)后,WER降至11.56,CER降至5.80。调整波束大小和加入语言模型的调优可作为进一步的探索。
以下是ESPnet的训练流程mermaid图:
graph LR
A[数据准备] --> B[特征提取]
B --> C[模型训练]
C --> D[模型评估]
综上所述,端到端语音识别技术在解码方法、语音嵌入和无监督学习等方面都有重要的研究进展。通过在Mozilla Common Voice数据集上的案例研究,我们看到了Deep Speech 2和ESPnet等模型在语音识别任务中的应用和性能表现。不同的模型和方法各有优缺点,在实际应用中需要根据具体需求和场景进行选择和调优。
超级会员免费看
888

被折叠的 条评论
为什么被折叠?



