ESPnet运行中文ASR示例
ESPnet简介
ESPnet是一个端到端语音处理工具包。主要侧重于端到端语音识别和端到端语音合成。ESPnet使用Chaine和PyTorch作为主要的深度学习引擎,并且还遵循Kaldi风格的数据处理、特征提取/格式化和配方(recipe,Kaldi的处理方式),以提供用于语音识别和其他语音处理实验的完整设置。
拉取Docker image
Docker image已预安装ESPnet的依赖Kaldi。ESPnet使用Conda环境来安装Python及其信赖。
git pull espnet/espnet:200~gpu-cuda10.0-cudnn7-u18
也可以不使用Docker image,有两种方式:
从源码编译安装ESPnet,这时得自己编译安装Kaldi与Warp-CTC
使用ESPnet预编译的二进制Kaldi与ESPnet
下载预训练中文ASR模型
官方提供了使用Aishell数据集的中文预训练ASR模型。
| Task | CER (%) | WER (%) | Pretrained model |
| ----------- | :----: | :----: | :----: |
| Aishell dev | 6.0 | N/A | [link](https://github.com/espnet/espnet/blob/master/egs/aishell/asr1/RESULTS.md#transformer-result-default-transformer-with-initial-learning-rate--10-and-epochs--50) |
| Aishell test | 6.7 | N/A | same as above
|
克隆ESPnet源码
git clone git@github.com:espnet/espnet
预训练模型放入egs/aishell目录中
├── conf
│ ├── decode.yaml
│ └── train.yaml
├── data
│ └── train_sp
│ └── cmvn.ark
└── exp
├── train_rnnlm_pytorch_lm
│ ├── model.json
│ └── rnnlm.model.best
└── train_sp_pytorch_train_pytorch_transformer_lr1.0
└── results
├── model.json
└── model.last10.avg.best
启动容器
一分部源码目录需要映射进容器中使用,这里是参考egs/aishell/asr1/run.sh的内容。
docker run -it --rm \
-v /home/ubuntu/jack/espnet/egs:/espnet/egs \
-v /home/ubuntu/jack/espnet/espnet:/espnet/espnet \
-v /home/ubuntu/jack/espnet/test:/espnet/test \
-v /home/ubuntu/jack/espnet/utils:/espnet/utils \
-v /home/ubuntu/jack/espnet/demo_asr:/espnet/demo_asr \
--workdir /espnet/demo_asr/ \
espnet/espnet:gpu-cuda10.0-cudnn7-u18 \
/bin/bash
运行中文ASR识别示例
预训练的中文ASR模型包含语言模型。使用的是transformer模型架构。此Demo没有使用语言模型。
随机挑选一个Aishell训练集中的音频文件作示例:BAC009S0730W0125.wav。
import json
import torch
import argparse
from espnet.bin.asr_recog import get_parser
from espnet.nets.pytorch_backend.e2e_asr_transformer import E2E
import os
import scipy.io.wavfile as wav
from python_speech_features import fbank
filename = os.path.join(os.path.dirname(__file__), 'BAC009S0730W0125.wav')
sample_rate, waveform = wav.read(filename)
fbank = fbank(waveform,samplerate=16000,winlen=0.025,winstep=0.01,
nfilt=86,nfft=512,lowfreq=0,highfreq=None,preemph=0.97)
root = "espnet/egs/aishell/asr1"
root = os.path.join(os.path.dirname(__file__), '../..', root)
model_dir = root + "/exp/train_sp_pytorch_train_pytorch_transformer_lr1.0/results"
# load model
with open(model_dir + "/model.json", "r") as f:
idim, odim, conf = json.load(f)
model = E2E(idim, odim, argparse.Namespace(**conf))
model.load_state_dict(torch.load(model_dir + "/model.last10.avg.best"), strict=False)
model.cpu().eval()
# load tocken_list
token_list = conf['char_list']
# recognize speech
parser = get_parser()
args = parser.parse_args(["--beam-size", "2", "--ctc-weight", "1.0", "--result-label", "out.json", "--model", ""])
result = model.recognize(fbank, args, token_list)
s = "".join(conf["char_list"][y] for y in result[0]["yseq"]).replace("<eos>", "").replace("<space>", " ").replace("<blank>", "")
print("prediction: ", s)
ESPNet实现ASR包含以下流程:
数据准备:下载数据与解压缩数据;
特征提取:使用Kaldi(Kaldi也是个开源ASR工具)来提取语音特征,输出为80维的FBank特征,加上3维的pitch特征,总共83维。然后进行均值归一化,让网络更容易对语音特征进行学习;
转换数据格式:将中间数据转化为JSON格式;
语言模型的训练:语言模型使用的RNN-LM模型,其中RNN-LM训练有无字的字符序列水平知识。尽管注意解码器暗含像等式中一样包含语言模型。 RNN-LM概率用于与解码器网络一起预测输出标签。基于注意力的解码器会先学会使用LM。此外,RNN-LM可以与编码器一起训练解码器网络
声学模型的训练:使用字典、训练集和测试集,基于CTC模型、Attention的架构和Transformer的解码器进行声学部分的训练;
识别与打分:联合Transformer模型、CTC模型和RNN语言模型进行打分:
识别结果!
image.png
- 点赞
- 收藏
- 关注作者
评论(0)