wav2letter 是由 Facebook AI 研究团队开源的一款简单而高效的端到端自动语音识别系统,它实现了在 WavLetter:an End-to-End ConvNet-based Speed Recognition System 和 Letter-Based Speech Recognition with Gated ConvNets 这两篇论文中提到的架构。
论文地址:
(1)WavLetter:an End-to-End ConvNet-based Speed Recognition System
https://arxiv.org/abs/1609.03193
(2)Letter-Based Speech Recognition with Gated ConvNets
https://arxiv.org/abs/1712.09444
如果要使用 wav2letter 或相关的预训练模型,请引述下面两篇论文。
一台运行 MacOS 或 Linux 的电脑。
Torch 框架。
在 CPU 上训练:Intel MKL。
在 GPU 上训练:NVIDIA CUDA Toolkit(cuDNN v5.1 for CUDA 8.0)。
读取声音文件:Libsndfile。
标准语音特征:FFTW。
如果打算在 CPU 上训练,强烈建议安装 Intel MKL。
修改.bashrc 文件,加入如下内容:
# 我们假设 Torch 安装在 $HOME/usr 目录.
export PATH=$HOME/usr/bin:$PATH
# 在编译期间检测 MKL
# 同时确保在运行时也能找到它
INTEL_DIR=/opt/intel/lib/intel64
MKL_DIR=/opt/intel/mkl/lib/intel64
MKL_INC_DIR=/opt/intel/mkl/include
if [ ! -d "$INTEL_DIR" ]; then
echo "$ warning: INTEL_DIR out of date"
fi
if [ ! -d "$MKL_DIR" ]; then
echo "$ warning: MKL_DIR out of date"
fi
if [ ! -d "$MKL_INC_DIR" ]; then
echo "$ warning: MKL_INC_DIR out of date"
fi
# 确保 Torch 可以找到 MKL
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$INTEL_DIR:$MKL_DIR
export CMAKE_LIBRARY_PATH=$LD_LIBRARY_PATH
export CMAKE_INCLUDE_PATH=$CMAKE_INCLUDE_PATH:$MKL_INC_DIR
下面将 LuaJIT 和 LuaRocks 安装在 $HOME/user 目录,如果要在系统级别安装,请去掉 DCMAKE_INSTALL_PREFIX=$HOME/user 选项。
下面我们假设 luarocks 和 luajit 已经被包含在 $PATH 中,如果没有,那么请用正确的路径调用 luarocks 和 luajit。假设它们安装在 $HOME/usr 目录,那么请调用~/usr/bin/luarocks 和~/usr/bin/luajit。
如果要使用 wav2letter 解码器,需要安装 KenLM,而安装 KenLM 需要使用 Boost。
如果你要使用多个 CPU/GPU(或多台机器)训练模型,就需要 OpenMPI 和 TorchMPI。
提示:建议重新编译 OpenMPI,因为标准发行版使用了大量可变的编译标签,某些标签对于成功运行 TorchMPI 来说是至关重要的。
首先安装 OpenMPI:
注意:可以使用 openmpi-3.0.0.tar.bz2,但需要移除—enable-mpi-thread-multiple 选项。
现在可以安装 TorchMPI 了:
MPI_CXX_COMPILER=$HOME/usr/bin/mpicxx ~/usr/bin/luarocks install torchmpi
luarocks install torch
luarocks install cudnn # 支持 GPU
luarocks install cunn # 支持 GPU
数据目录包含了一些用于预处理各种数据集的脚本,目前只提供了 LibriSpeech 和 TIMIT。
下面是如何预处理 LibriSpeech ASR 语料库的例子:
使用 OpenMPI 来启动多个训练进程,每个 GPU 运行一个,我们假设 mpirun 已经包含在 $PATH 路径中。
在运行解码器之前,我们需要做一些预处理。
首先,创建字母词典,包括在 wav2letter 中使用的重复字母。
这样我们就有了语言模型,然后对它进行预处理。在这里,我们使用预训练的 LibriSpeech 语言模型,当然,我们也可以使用 KenLM 来训练其他模型。然后我们将单词转成小写,并为它们生成音标。预处理脚本可能会发出一些警告,告诉你有些单词因为重复字母(这里是 2,因为使用了参数 -r 2)而无法正确生成音标,不过这种情况很少见,所以在我们看来不是什么问题。
注意:我们也可以使用 4gram.arpa.gz,不过它需要更长的预处理的时间。
额外步骤:使用 KenLM 将模型转换成二级制的文件可以加快后续的加载速度,我们假设 KenLM 已经被包含在 $PATH 中:
build_binary 3-gram.pruned.3e-7.arpa 3-gram.pruned.3e-7.bin
现在,我们在数据集上运行 test.lua。这个脚本还会显示字母错误率(Letter Error Rate)和单词错误率(Word Error Rate)——后者没有使用后处理的声学模型进行计算。
接下来运行解码器:
我们提供了用于 LibriSpeech 的预训练模型:
要使用预训练模型,需要执行 README 中提到的安装和解码步骤。
注意:预训练模型是基于 Facebook 的基础设施进行训练的,所以在运行时需要给 test.lua 传入适当的参数: