ESPnet运行中文ASR示例

举报
可爱又积极 发表于 2021/11/30 23:11:13 2021/11/30
【摘要】 ESPnet简介ESPnet是一个端到端语音处理工具包。主要侧重于端到端语音识别和端到端语音合成。ESPnet使用Chaine和PyTorch作为主要的深度学习引擎,并且还遵循Kaldi风格的数据处理、特征提取/格式化和配方(recipe,Kaldi的处理方式),以提供用于语音识别和其他语音处理实验的完整设置。拉取Docker imageDocker image已预安装ESPnet的依赖Ka...

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包含以下流程:
image.png
数据准备:下载数据与解压缩数据;

特征提取:使用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

image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。