环境准备

本次实验的工具依赖于Nemo,在进行实验在conda环境中安装Nemo,为了方便实验,还在conda中还安装了jupyterlab工具。

  1. 首先就是在conda中安装nemo
sudo apt-get update && sudo apt-get install -y libsndfile1 ffmpeg
pip install Cython
pip install --user pytest-runner
pip install rosa numpy==1.19.4
pip install torchmetrics==0.6.0
pip install nemo_toolkit[all]==1.4.0
pip install ASR-metrics
  1. 检测nemo是否安装成功
    输入python进入python环境,尝试导入nemo中的包,查看是否报错。若不报错则安装成功。
>>>import nemo
>>>import nemo.collections.asr as nemo_asr
>>>import nemo.collections.tts as nemo_tts

模型的训练

1. 在训练模型之前,我们可以看一下未经过训练的模型语音识别出的内容。

// 使用memo加载进来中文预训练模型,并将其实例化
qua=nemo_asr.models.EncDecCTCModel.restore_from("stt_zh_quartznet15x5.nemo")
// 第一次调用transcribe函数测试预训练模型识别效果
result = qua.transcribe(paths2audio_files=["test/test4.wav"])
// 输出结果
print(asr_result)

// 第二次调用transcribe函数测试预训练模型识别效果
result = qua.transcribe(paths2audio_files=["test/test1.wav"])
// 输出结果
print(asr_result)

值得说明的是,第一次所识别的语音内容为:你好大白,我是谢**,请让我进入小区。第二次所识别的语音内容为:你好大白,请让我进入小区。这两次的识别结果如下:

gru语音识别模型搭建流程图_json


gru语音识别模型搭建流程图_模型识别_02


可以看出,没经过训练的模型识别的效果几乎为零。2. 模型训练数据集准备

训练模型首先要准备的就是训练所需的训练数据集以及测试数据集,这里准备好数据集后将这些准备好的音频制作成json格式的清单用于训练时的加载。json数据清单格式如下图所示。

gru语音识别模型搭建流程图_模型识别_03


其中:

audio_filepath:音频的存放位置

duration:音频的时长

text:音频内容

这里我们准备的训练集有12个音频文件,测试集有13个音频文件

gru语音识别模型搭建流程图_json_04

3. 模型训练

  • 加载数据清单
train = "json/train.json"
test = "json/test.json"
  • 加载quartznet配置文件
import yaml
config_path = "quartznet_15x5_zh.yaml"
with open(config_path) as f:
    params = yaml.full_load(f)
  • 将数据清单传给配置文件
params['model']['train_ds']['manifest_filepath']=train_manifest
params['model']['validation_ds']['manifest_filepath']=test_manifest
  • 使用迁移学习的方法训练模型
qua.setup_training_data(train_data_config=params['model']['train_ds'])# 指向我们将用于微调的数据作为训练集
qua.setup_validation_data(val_data_config=params['model']['validation_ds'])# 指向新的验证数据进行微调
import pytorch_lightning as pl 
trainer = pl.Trainer(gpus=1,max_epochs=800) //设置训练器参数
trainer.fit(quartznet)  //开始训练
  • 检验迁移学习训练模型的识别结果
print(qua.transcribe(paths2audio_files=["test/test4.wav"]))
print(qua.transcribe(paths2audio_files=["test/test1.wav"]))

识别结果如下图

gru语音识别模型搭建流程图_语音识别_05


gru语音识别模型搭建流程图_语音识别_06


可以看到训练后的模型识别结果准确率有着很大的提升。

  • 模型的保存
qua.save_to("asr_model_sayhello.nemo")
  • 将训练好的模型进行重载并进行测试
model_1 = nemo_asr.models.EncDecCTCModel.restore_from("asr_model_sayhello.nemo")
print(model_1.transcribe(paths2audio_files=["test/test2.wav"]))

结果如下,可见,在更换测试音频后仍然可以准确的识别出语音内容

gru语音识别模型搭建流程图_python_07