- 最近在训练
Wenet
模型,所以顺便记录一下。
源码流程 以aishell为例
资源下载
- 执行以下语句进行下载,下载到
/export/data/asr-data/OpenSLR/33/
目录中,并进行解压和分类。1
./run.sh --stage -1 --stop_stage -1
- 执行以下语句进行下载,下载到
生成索引文件
- 执行
local/aishell-data-prep.sh
生成索引文件到data/local/<train> <dev> <test>
中,然后再把text
和wav.scp
两个文件复制到data/<train> <dev> <test>
三个文件夹中。1
./run.sh --stage 0 --stop_stage 0
- 执行
归一化计算
- 先将
text
进行备份,备份为text.org
- 分离
text
中的元素,后半部分去掉空格,再与前半部分合并(空格隔开) - 进行归一化计算(CMVN)
- 删除备份文件
1
./run.sh --stage 1 --stop_stage 1
- 先将
生成字典
- 生成data.list字典,格式为
{"key":wav的id, "wav": wav的绝对路径, "txt": 文字}
。在训练时调用这个字典文件进行训练。模型测试时同理。1
./run.sh --stage 2 --stop_stage 2
- 生成data.list字典,格式为
格式化,数据打包
1
./run.sh --stage 3 --stop_stage 3
模型训练
- 读取配置文件中的信息,输出到
exp/conformer
,也就是说,这里面的文件都是生成的,而非源文件。1
./run.sh --stage 4 --stop_stage 4
- 读取配置文件中的信息,输出到
模型评价
1
./run.sh --stage 5 --stop_stage 5
模型导出
- 导出WeNet模型为TorchScript格式
1
./run.sh --stage 6 --stop_stage 6
- 导出WeNet模型为TorchScript格式
注意事项 以aishell为例
对应文件夹的创建
- 因为脚本并没有执行
mkdir -p
之类的命令,因此有一些文件夹需要自己手动创建,否则会出现报错。1
2
3
4
5mkdir -p /export/data/asr-data/OpenSLR/33/
mkdir -p data/test/
mkdir -p data/train/
mkdir -p data/dev/
ls
导出权重
- 如果是用的
jupyter notebook
的话,不要直接下载,否则会得到一个.ptrom
的文件,应该直接执行压缩之后再下来下来。1
tar -czvf 输出文件 源文件
其他说明
使用自己的数据集进行训练
数据准备
- 首先是数据集准备,将数据集转换为
text
和wav.scp
两个文件。 - 其中
text
为wav名称 语句
。注意中间是空格隔开。 wav.scp
为wav名称 wav绝对路径
。注意中间是空格隔开。
开始训练
跳过数据准备的前几步,直接从归一化计算开始跑。
1
./run.sh --stage 1 --stop_stage 1
载入训练
1
./run.sh --stage 4 --stop_stage 4 --checkpoint exp/conformer/avg_30.pt
保存训练日志
- 执行模型训练时加上记录语句(其他同理)
1
2
3
4
5
6
7
8./run.sh --stage 4 --stop_stage 4 | tee ls.txt
// 或 但这样不会输出在终端上
./run.sh --stage 4 --stop_stage 4 > ls.txt
// 增量写入
./run.sh --stage 4 --stop_stage 4 | tee -a ls.txt
// 或 但这样不会输出在终端上
./run.sh --stage 4 --stop_stage 4 >> ls.txt
配置文件
- 注意观察
run.sh
,发现训练的配置文件为conf/train_conformer.yaml
。训练时如果数据量过大可以在此修改batch_size
。可以改固定值,也可以改为动态。当然也可以在这里改迭代次数。