使用DeepSpeech2进行语音识别
介绍
本文主要介绍使用DeepSpeech2实现 Baidu Warp-CTC ,创建基于deepSpeech2架构的网络,并使用CTC激活函数进行训练。 DeepSpeech2具有以下特性:
- 训练DeepSpeech,可配置递归的类型和体系结构,支持多gpu支持
- 使用kenlm的语言模型支持(现在的WIP,目前还没有建立LM的指令)
- 多个数据集下载器,支持AN4 TED voxforge和Librispeech,数据集可以合并,支持自定义数据集
- 在线训练噪声注入提高噪声鲁棒性
- 音频增强以提高噪声稳健性
- 训练过程中出现故障或停止时的重新启动功能
- 可视化训练图的Visdom/Tensorboard支持
安装
Git URL:
git://www.github.com/SeanNaren/deepspeech.pytorch.git
Git Clone代码到本地:
git clone http://www.github.com/SeanNaren/deepspeech.pytorch
Subversion代码到本地:
$ svn co --depth empty http://www.github.com/SeanNaren/deepspeech.pytorch
Checked out revision 1.
$ cd repo
$ svn up trunk
此外,需要安装几个库以便进行训练。我假设所有的东西都安装在Ubuntu上的Anaconda中。 如果你还没有安装pytorch,请安装。 为Warp-CTC绑定安装这个fork :
git clone https://github.com/SeanNaren/warp-ctc.git
cd warp-ctc
mkdir build; cd build
cmake ..
make
export CUDA_HOME="/usr/local/cuda"
cd ../pytorch_binding
python setup.py install
安装pytorch audio:
sudo apt-get install sox libsox-dev libsox-fmt-all
git clone https://github.com/pytorch/audio.git
cd audio
pip install cffi
python setup.py install
如果你希望支持使用语言模型进行beam搜索解码,请安装ctcdecode:
git clone --recursive https://github.com/parlance/ctcdecode.git
cd ctcdecode
pip install .
最后克隆这个repo,并且在repo中运行它:
pip install -r requirements.txt
Docker
没有正式的Dockerhub镜像,但是提供了一个Dockerfile来构建你自己的系统。
sudo nvidia-docker build -t deepspeech2.docker .
sudo nvidia-docker run -ti -v `pwd`/data:/workspace/data -p 8888:8888 deepspeech2.docker # Opens a Jupyter notebook, mounting the /data drive in the container
如果你更喜欢bash :
nvidia-docker run -ti -v `pwd`/data:/workspace/data --entrypoint=/bin/bash deepspeech2.docker # Opens a bash terminal, mounting the /data drive in the container
数据集
目前支持AN4 Tedium VoxForge和Librispeech,脚本会设置数据集,并且创建dataloading中使用的清单文件。
AN4
在repo的根文件夹中下载,并且设置运行下面的an4数据集:
cd data; python an4.py
TEDLIUM
你可以选择手动下载原始数据集文件,也可以通过脚本(会缓存它)下载,在这里 找到文件。 在repo的根文件夹中下载,并且设置TEDLIUM_V2数据集运行命令:
cd data; python ted.py # Optionally if you have downloaded the raw dataset file, pass --tar_path /path/to/TEDLIUM_release2.tar.gz
Voxforge
要下载和设置Voxforge数据集,请在repo的根文件夹中运行以下命令:
cd data; python voxforge.py
请注意,此数据集不带有验证数据集或测试数据集。
LibriSpeech
下载和设置LibriSpeech数据集,在repo的根目录中运行以下命令:
cd data; python librispeech.py
你可以选择手动下载原始数据集文件,也可以通过脚本(也会缓存它们)下载,为此,你必须创建下面的文件夹结构,并从这里下载相应的tar文件 。
cd data/
mkdir LibriSpeech/ # This can be anything as long as you specify the directory path as --target-dir when running the librispeech.py script
mkdir LibriSpeech/val/
mkdir LibriSpeech/test/
mkdir LibriSpeech/train/
现在将tar.gz文件放入正确的文件夹中,它们现在将用于librispeech的数据预处理,并在格式化数据集后删除。 如果你不想添加所有文件,可以选择指定所需的librispeech文件,像下面这样:
cd data/
python librispeech.py --files-to-use"train-clean-100.tar.gz, train-clean-360.tar.gz,train-other-500.tar.gz, dev-clean.tar.gz,dev-other.tar.gz, test-clean.tar.gz,test-other.tar.gz"
自定义数据集
要创建自定义数据集,必须创建一个包含训练数据位置的CSV文件,必须是以下格式:
/path/to/audio.wav,/path/to/text.txt
/path/to/audio2.wav,/path/to/text2.txt
...
合并多个清单文件
要创建更大的清单文件(一次训练/测试多个数据集),我们可以将包含所有要合并的清单的目录中的清单文件合并在一起,如下所示。你还可以从新清单中删除短剪辑和长剪辑。
cd data/
python merge_manifests.py --output-path merged_manifest.csv --merge-dir all-manifests/ --min-duration 1 --max-duration 15 # durations in seconds
训练
python train.py --train-manifest data/train_manifest.csv --val-manifest data/val_manifest.csv
使用python train.py --help获取更多参数和选项。 也有visdom支持可视化训练,启动服务器后,使用:
python train.py --visdom
也有tensorboard支持可视化训练,按照说明设置,使用:
python train.py --tensorboard --logdir log_dir/ # Make sure the Tensorboard instance is made pointing to this log directory
对于两个可视化工具,你可以在训练时通过更改--id参数将自己的名称添加到运行中。
多gpu训练
我们支持通过分布式并行(查看这里和这里,以便了解为什么不使用DataParallel )进行多gpu训练。 要使用多gpu :
python -m multiproc python train.py --visdom --cuda # Add your parameters as normal, multiproc will scale to all GPUs automatically
multiproc将打开除主进程以外的所有进程的日志。 如果Infiniband不可用,我们建议使用TCP默认的gloo后端,NCCL2也可以作为后端使用,这里有更多信息。
噪声增强和噪声注入
有两种不同类型的噪声支持,噪声增强和噪声注入。
- 噪声增强:加载音频时对速度和增益做一些小更改以增强健壮性,使用时,使用--augment标志进行训练。
- 噪声注入:在训练数据中动态添加噪声以增强鲁棒性,要使用它,得首先使用采样的噪声文件填充目录。数据加载器将从这个目录中随机选取样本。
要启用噪声注入,请使用--noise-dir/path/to/noise/dir/指定噪音文件的位置,有一些噪声参数,如--noise_prob确定噪声的概率,--noise-min,--noise-max参数确定训练中的最小噪声和最大噪声。 包括了一个脚本,用于将噪声注入音频文件,以听到不同的噪音级别和文件的声音,适用于安排噪音数据集。
python noise_inject.py --input-path /path/to/input.wav --noise-path /path/to/noise.wav --output-path /path/to/input_injected.wav --noise-level 0.5 # higher levels means more noise
Checkpoints( 检查点)
训练支持保存模型的检查点,以便在发生错误或早期终止时继续训练,要启用epoch 检查点,请执行以下操作:
python train.py --checkpoint
要启用每个N批次的检查点,以及epoch保存,请执行以下操作:
python train.py --checkpoint --checkpoint-per-batch N # N is the number of batches to wait till saving a checkpoint at this batch.
请注意,要使batch检查点系统正常工作,在从原始训练运行中加载检查点模型时,无法更改batch size。 要从已保存的已保存的模型继续,请执行以下操作:
python train.py --continue-from models/deepspeech_checkpoint_epoch_N_iter_N.pth.tar
这将从相同的训练状态继续,并且重新创建visdom图继续(如果启用)。 如果你想从以前的模型检查点开始,但是不继续训练,请添加--finetune标志,从--continue-from权值重新开始训练。
选择batch size
脚本可以用来测试是否可以在硬件上进行训练,以及可以使用的model/batch size的限制,使用:
python benchmark.py --batch-size 32
使用标志--help查看可以与脚本一起使用的其他参数。
模型详细信息
保存的模型包含它训练进程的元数据,要查看元数据,请执行以下命令:
python model.py --model-path models/deepspeech.pth.tar
另外需要注意的是,在模型上没有最终的SoftMax层,因为在训练时Warp CTC会在内部执行SoftMax,如果在模型的顶部构建了任何东西,这也必须在复杂解的码器中实现,因此请考虑清楚!
Testing/Inference
要在测试集(必须与训练集的格式相同)上评估经过训练的模型,请执行以下操作:
python test.py --model-path models/deepspeech.pth --test-manifest /path/to/test_manifest.csv --cuda
提供了一个输出的示例脚本:
python transcribe.py --model-path models/deepspeech.pth --audio-path /path/to/audio.wav
备用解码器
默认情况下,test.py和transcribe.py使用GreedyDecoder,它在每个时间点选择最高的可能输出标签,然后过滤重复和空白符号,给出最终输出。 可以根据安装部分的说明,选择使用beam搜索解码器来安装ctcdecode库,test和transcribe脚本有一个--decoder参数,要使用beam解码器,请添加--decoder beam ,beam解码器支持额外的解码参数:
- beam_width每个时间步长要考虑多少个beam
- lm_path可选的,用于解码二进制KenLM语言模型
- 语言模型的alpha权重
- 单词的beta加成权重
时间偏移
使用--offsets标志在使用transcribe.py脚本时获取转录中每个字符的位置信息,偏移量基于输出张量的大小,你需要将它转换为所需的格式,例如,基于默认参数,你可以将偏移值乘以标量(以秒为单位的文件持续时间/输出大小)以获得以秒为单位的偏移量。
致谢
本文来源: