Create README_cn.md

pull/3891/head
张春乔 10 months ago committed by GitHub
parent 419af4503c
commit c56baec069
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,208 @@
# 使用Aishell数据集训练DeepSpeech2的离线/在线ASR模型
此示例包含用于使用[Aishell数据集](http://www.openslr.org/resources/33)训练DeepSpeech2离线或在线模型的代码。
## 概述
您需要的所有脚本都在`run.sh`中。`run.sh`中有几个阶段,每个阶段都有其功能。
| 阶段 | 功能 |
|:---- |:----------------------------------------------------------- |
| 0 | 数据处理。包括:<br> (1) 下载数据集 <br> (2) 计算训练数据集的CMVN <br> (3) 获取词汇文件 <br> (4) 获取训练、开发和测试数据集的manifest文件 |
| 1 | 训练模型 |
| 2 | 通过平均前k个最佳模型来获得最终模型设置k=1表示选择最佳模型 |
| 3 | 测试最终模型性能 |
| 4 | 导出静态图模型 |
| 5 | 测试静态图模型 |
| 6 | 对单个音频文件进行推理 |
您可以通过设置`stage`和`stop_stage`来选择运行一系列阶段。
例如如果您想执行阶段2和阶段3的代码可以运行以下脚本
```bash
bash run.sh --stage 2 --stop_stage 3
```
或者,您可以将`stage`设置为等于`stop-stage`来仅运行一个阶段。
例如,如果您只想运行`stage 0`,可以使用以下脚本:
```bash
bash run.sh --stage 0 --stop_stage 0
```
下面的文档将详细描述`run.sh`中的脚本。
## 环境变量
`path.sh`包含环境变量。
```bash
source path.sh
```
需要先运行此脚本。
另一个脚本也需要运行:
```bash
source ${MAIN_ROOT}/utils/parse_options.sh
```
它将支持在shell脚本中使用`--variable value`的方式。
## 局部变量
在`run.sh`中设置了一些局部变量。
`gpus`表示您想使用的GPU数量。如果您设置`gpus=`则表示仅使用CPU。
`stage`表示您想在实验中从哪个阶段开始。
`stop_stage`表示您想在实验中结束于哪个阶段。
`conf_path`表示模型的配置路径。
`avg_num`表示要平均的前k个最佳模型的数量以获得最终模型。
`model_type`表示模型类型:离线或在线
`audio_file`表示在阶段6中您想进行推理的单个文件的路径。
`ckpt`表示模型的检查点前缀,例如"deepspeech2"
您可以在使用`run.sh`时设置局部变量(除了`ckpt`)。
例如,您可以在命令行中设置`gpus`和`avg_num`
```bash
bash run.sh --gpus 0,1 --avg_num 1
```
## 阶段0数据处理
要使用此示例,您需要先处理数据,可以使用`run.sh`中的阶段0来完成此操作。代码如下
```bash
if [ ${stage} -le 0 ] && [ ${stop_stage} -ge 0 ]; then
# 准备数据
bash ./local/data.sh || exit -1
fi
```
阶段0用于处理数据。
如果您只想处理数据,可以运行:
```bash
bash run.sh --stage 0 --stop_stage 0
```
您也可以直接在命令行中运行这些脚本。
```bash
source path.sh
bash ./local/data.sh
```
处理完数据后,`data`目录将如下所示:
```bash
data/
|-- dev.meta
|-- lang_char
| `-- vocab.txt
|-- manifest.dev
|-- manifest.dev.raw
|-- manifest.test
|-- manifest.test.raw
|-- manifest.train
|-- manifest.train.raw
|-- mean_std.json
|-- test.meta
`-- train.meta
```
## 阶段1模型训练
如果您想训练模型,可以使用`run.sh`中的阶段1。代码如下
```bash
if [ ${stage} -le 1 ] && [ ${stop_stage} -ge 1 ]; then
# 训练模型,所有`ckpt`在`exp`目录下
CUDA_VISIBLE_DEVICES=${gpus} ./local/train.sh ${conf_path} ${ckpt}
fi
```
如果您想训练模型可以使用以下脚本来执行阶段0和阶段1
```bash
bash run.sh --stage 0 --stop_stage 1
```
或者您可以在命令行中运行这些脚本仅使用CPU
```bash
source path.sh
bash ./local/data.sh
CUDA_VISIBLE_DEVICES= ./local/train.sh conf/deepspeech2.yaml deepspeech2
```
如果您想使用GPU可以在命令行中运行这些脚本假设您只有一个GPU
```bash
source path.sh
bash ./local/data.sh
CUDA_VISIBLE_DEVICES=0 ./local/train.sh conf/deepspeech2.yaml deepspeech2
```
## 阶段2前k个模型平均
训练完模型后我们需要得到用于测试和推理的最终模型。在每个epoch中都会保存模型检查点因此我们可以基于验证损失从它们中选择最佳模型或者我们可以对它们进行排序并平均前k个模型的参数以得到最终模型。我们可以使用阶段2来完成此操作代码如下
```bash
if [ ${stage} -le 2 ] && [ ${stop_stage} -ge 2 ]; then
# 平均n个最佳模型
avg.sh best exp/${ckpt}/checkpoints ${avg_num}
fi
```
`avg.sh`在`../../../utils/`中定义,该路径在`path.sh`中定义。
如果您想得到最终模型可以使用以下脚本来执行阶段0、阶段1和阶段2
```bash
bash run.sh --stage 0 --stop_stage 2
```
或者您可以在命令行中运行这些脚本仅使用CPU
```bash
source path.sh
bash ./local/data.sh
CUDA_VISIBLE_DEVICES= ./local/train.sh conf/deepspeech2.yaml deepspeech2
avg.sh best exp/deepspeech2/checkpoints 1
```
## 阶段3模型测试
测试阶段用于评估模型性能。测试阶段的代码如下:
```bash
if [ ${stage} -le 3 ] && [ ${stop_stage} -ge 3 ]; then
# 测试ckpt avg_n
CUDA_VISIBLE_DEVICES=0 ./local/test.sh ${conf_path} exp/${ckpt}/checkpoints/${avg_ckpt} || exit -1
fi
```
如果您想训练并测试模型可以使用以下脚本来执行阶段0、阶段1、阶段2和阶段3
```bash
bash run.sh --stage 0 --stop_stage 3
```
或者您可以在命令行中运行这些脚本仅使用CPU
```bash
source path.sh
bash ./local/data.sh
CUDA_VISIBLE_DEVICES= ./local/train.sh conf/deepspeech2.yaml deepspeech2
avg.sh best exp/deepspeech2/checkpoints 1
CUDA_VISIBLE_DEVICES= ./local/test.sh conf/deepspeech2.yaml conf/tuning/decode.yaml exp/deepspeech2/checkpoints/avg_10
```
## 预训练模型
您可以从[这里](../../../docs/source/released_model.md)获取预训练模型。
使用`tar`脚本来解压模型,然后您可以使用脚本来测试模型。
例如:
```bash
wget https://paddlespeech.bj.bcebos.com/s2t/aishell/asr0/asr0_deepspeech2_offline_aishell_ckpt_1.0.1.model.tar.gz
tar xzvf asr0_deepspeech2_offline_aishell_ckpt_1.0.1.model.tar.gz
source path.sh
# 如果您已经处理了数据并获得了manifest文件则可以跳过以下两个步骤
bash local/data.sh --stage -1 --stop_stage -1
bash local/data.sh --stage 2 --stop_stage 2
CUDA_VISIBLE_DEVICES= ./local/test.sh conf/deepspeech2.yaml exp/deepspeech2/checkpoints/avg_10
```
发布的模型性能如[这里](./RESULTS.md)所示。
## 阶段4导出静态图模型
此阶段是将动态图转换为静态图。
```bash
if [ ${stage} -le 4 ] && [ ${stop_stage} -ge 4 ]; then
# 导出ckpt avg_n
CUDA_VISIBLE_DEVICES=0 ./local/export.sh ${conf_path} exp/${ckpt}/checkpoints/${avg_ckpt} exp/${ckpt}/checkpoints/${avg_ckpt}.jit ${model_type}
fi
```
如果您已经有一个动态图模型,可以运行以下脚本:
```bash
source path.sh
./local/export.sh conf/deepspeech2.yaml exp/deepspeech2/checkpoints/avg_10 exp/deepspeech2/checkpoints/avg_10.jit
```
## 阶段5测试静态图模型
与阶段3类似静态图模型也可以进行测试。
```bash
if [ ${stage} -le 5 ] && [ ${stop_stage} -ge 5 ]; then
# 测试导出的ckpt avg_n
CUDA_VISIBLE_DEVICES=0 ./local/test_export.sh ${conf_path} exp/${ckpt}/checkpoints/${avg_ckpt}.jit ${model_type}|| exit -1
fi
```
如果您已经导出了静态图,可以运行以下脚本:
```bash
CUDA_VISIBLE_DEVICES= ./local/test_export.sh conf/deepspeech2.yaml conf/tuning/decode.yaml exp/deepspeech2/checkpoints/avg_10.jit
```
## 阶段6单个音频文件推理
在某些情况下您可能想使用训练好的模型对单个音频文件进行推理。您可以使用阶段5。代码如下
```bash
if [ ${stage} -le 6 ] && [ ${stop_stage} -ge 6 ]; then
# 测试单个.wav文件
CUDA_VISIBLE_DEVICES=0 ./local/test_wav.sh ${conf_path} ${decode_conf_path} exp/${ckpt}/checkpoints/${avg_ckpt} ${model_type} ${audio_file}
fi
```
您可以自己训练模型,或者下载预训练模型,使用以下脚本:
```bash
wget https://paddlespeech.bj.bcebos.com/s2t/aishell/asr0/asr0_deepspeech2_offline_aishell_ckpt_1.0.1.model.tar.gz
tar asr0_deepspeech2_offline_aishell_ckpt_1.0.1.model.tar.gz
```
您可以下载音频演示文件:
```bash
wget -nc https://paddlespeech.bj.bcebos.com/datasets/single_wav/zh/demo_01_03.wav -P data/
```
您需要准备一个音频文件或使用上述音频演示文件请确认音频的采样率为16K。您可以通过运行以下脚本来获取音频演示文件的结果。
```bash
CUDA_VISIBLE_DEVICES= ./local/test_wav.sh conf/deepspeech2.yaml conf/tuning/decode.yaml exp/deepspeech2/checkpoints/avg_10 data/demo_01_03.wav
```
Loading…
Cancel
Save