ASR (Automatic Speech Recognition) 是自然语言处理中的关键技术之一,其目的是将人类语音信号转换为文本形式。在近些年,深度学习已经成为ASR领域的主流技术,本文将为大家讲解 ASR 语音识别的深度学习模型。
1. 基于 DNN-HMM 模型
DNN (deep neural network) 是一种典型的深度学习模型,常常应用于 ASR 任务中。基于 DNN 的 ASR 模型通常包含以下几个部分:
1.1. 特征提取
ASR 任务中常常利用 MFCC、FBANK 等特征来表示语音信号。其中 MFCC(Mel Frequency Cepstral Coefficients)用于提取语音中频率特征,FBANK(Filter-Bank)用于滤波特征提取。这些特征通常是多帧连续的,我们可以将其垂直地连接起来形成一个帧序列 $X$,其中每一行是一个帧向量。
1.2. DNN 模型
在 DNN 模型中,通常采用多层感知器(Multi-Layer Perceptron,MLP)作为基本的神经网络结构。我们可以使用深度学习框架(例如 Keras、Tensorflow)来搭建模型,输入为特征提取中得到的帧序列 $X$,输出为各个音素的概率分布 $P(y_t | X)$。
1.3. 解码
我们可以使用基于 HMM(Hidden Markov Model)的解码器来将 DNN 模型得到的音素概率转化为词序列。HMM 是一种基于概率模型的序列模型,其思想就是将一个序列表示为各个卡尔马克夫链之间的转移概率。HMM 解码的过程通常需要使用 CKY 算法或 Viterbi 算法,根据语言模型和语音模型(通常用 n-gram 模型)的得分,从得分最高的序列中抽取最终结果。
2. 基于 CTC 模型
CTC (Connectionist Temporal Classification) 是另一种 ASR 模型,它使用了类似 HMM 的序列建模技术。与上述基于 DNN-HMM 模型不同,CTC 模型将整个语音信号作为输入,不需要进行人工特征提取。
2.1. 数据预处理
首先,对原始的语音信号进行处理,得到一系列音频的时频图。其中每一行是一个时间戳,每一列是一个频率。预处理的参数通常包括噪声抑制、语速归一化、重采样和滤波等。
2.2. CTC 模型
CTC 模型中,采用了循环神经网络(Recurrent Neural Network,RNN)将时域和频域的特征结合在一起,建立了一个输出为字符序列的分类器,该分类器在标签不完全的情况下也能达到较高的识别率。
2.3. 解码
CTC 模型采用了一个类似于 BeamSearch 的贪婪策略来抽取最优结果。在此基础上,使用语言模型进行后验修正可以进一步提升识别准确率。
示例
以下是使用 Kaldi 语音识别工具对 WSJ0 数据集进行训练、测试的示例代码。
1. 基于 DNN-HMM 模型
## 1. 特征提取
# 分别提取训练集和测试集的 MFCC 特征
steps/make_mfcc.sh --nj 10 --cmd "$train_cmd" data/train exp/make_mfcc/train mfcc
steps/compute_cmvn_stats.sh data/train exp/make_mfcc/train mfcc
steps/make_mfcc.sh --nj 5 --cmd "$train_cmd" data/test exp/make_mfcc/test mfcc
steps/compute_cmvn_stats.sh data/test exp/make_mfcc/test mfcc
## 2. 搭建 DNN 模型
# DNN 模型的配置文件通常称为 nnet_config
local/nnet3/tuning/train_dnn_template.sh --stage "$train_stage" \
--features-train data/train/feats.scp \
--labels-train data/train/ali_train_pdf \
--features-validate data/test/feats.scp \
--labels-validate data/test/ali_test_pdf \
--num-epochs "$num_epochs" \
--model-dir exp_dnn \
--nnet-config nnet/nnet_ms_a.conf \
--cmd "$decode_cmd"
## 3. HMM 解码
# 对测试集进行 HMM 解码
steps/nnet3/decode.sh --acwt 1.0 --post-decode-acwt 10.0 \
--cmd "$decode_cmd" --nj 5 \
exp/tri1/graph_tgsmall data/test \
exp_dnn/decode_tgsmall
2. 基于 CTC 模型
## 1. 数据预处理
# 使用 Kaldi 工具提取时频图
steps/make_fbank.sh --nj 10 --cmd "$train_cmd" data/train exp/make_fbank/train fbank
steps/compute_cmvn_stats.sh data/train exp/make_fbank/train fbank
steps/make_fbank.sh --nj 5 --cmd "$train_cmd" data/test exp/make_fbank/test fbank
steps/compute_cmvn_stats.sh data/test exp/make_fbank/test fbank
## 2. 搭建 CTC 模型
# 训练 DNN 模型
local/train_ctc_dnn.sh --nj 10 --cmd "$train_cmd" \
--feature-type fbanks --splice 0 --cmvn-opts "--norm-vars=false" \
data/train data/lang exp/tri1_ali exp/ctc
## 3. CTC 解码
# 对测试集进行 CTC 解码
steps/nnet3/decode.sh --nj 5 --cmd "$decode_cmd" \
--acwt 1.0 --post-decode-acwt 10.0 \
--scoring-opts --min-lmwt 1 --max-lmwt 20 \
--skip-scoring false --skip-diagnostics true \
--skip-post-decode false \
exp/tri1/graph_tgsmall data/test exp/ctc/decode-tgsmall
以上,便是两个基于深度学习的 ASR 模型的完整攻略以及示例说明。