开源自动语音识别系统wav2letter


Wav2letter是Facebook人工智能实验室推出的一种简单高效的端到端自动语音识别系统(ASR),它将基于卷积网络的声学模型和图解码结合起来,通过转录的语音训练后,无需强制对齐音素,系统就可以输出字母。

关于此系统的细节可在两篇论文上查看:
•Wav2Letter:an End-to-End ConvNet-based Speech Recognition System(地址:https://arxiv.org/abs/1609.03193
•Letter-Based Speech Recognition with Gated ConvNets(地址:https://arxiv.org/abs/1712.09444

安装要求
•MacOS或者Linux
•Torch
•在CPU上训练:Intel MKL
•在GPU上训练:NVIDIA CUDA工具包(CUDA 8.0、cuDNN v5.1)
•音频文件读取:Libsndfile
•标准语音特征:FFTW

安装
MKL
如果你打算在CPU上训练,那么推荐安装Intel MKL。
运行一下代码更新你的.bashrc文件夹。
# We assume Torch will be installed in $HOME/usr.

Change according to your needs.

export PATH=$HOME/usr/bin:$PATH

This is to detect MKL during compilation

but also to make sure it is found at runtime.

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

Make sure MKL can be found by Torch.

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
接下来在本地安装LuaJIt和LuaRocks,文件夹为$HOME/usr。如果需要在系统范围内安装,则删除-DCMAKE_INSTALL_PREFIX=$HOME/usr选项。
git clone https://github.com/torch/luajit-rocks.git
cd luajit-rocks
mkdir build; cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/usr -DWITH_LUAJIT21=OFF
make -j 4
make install
cd ../..


在接下来的步骤中,我们假设luarocks和luajit都在$PATH文件夹中。如果不在,并已经在本地安装了,你可以试着运行~/usr/bin/luarocks和~/usr/bin/luajit。

KenLM语言模型工具包
如果你打算用wav2letter解码器,你需要安装KenLM。
KenLM需要Boost。
# make sure boost is installed (with system/thread/test modules)

actual command might vary depending on your system

sudo apt-get install libboost-dev libboost-system-dev libboost-thread-dev libboost-test-dev


安装好boost后,就可以安装KenLM了:
wget https://kheafield.com/code/kenlm.tar.gz
tar xfvz kenlm.tar.gz
cd kenlm
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/usr -DCMAKE_POSITION_INDEPENDENT_CODE=ON
make -j 4
make install
cp -a lib/* ~/usr/lib # libs are not installed by default :(
cd ../..


OpenMPI和TorchMPI
如果你要用到多CPU或GPU训练,那么就要安装OpenMPI和TorchMPI。
注意:强烈建议自己重新编译OpenMPI。标准的OpenMPI二进制文件的编译选项中存在很多变量。某些选项对成功编译和运行TorchMPI非常关键。
首先安装OpenMPI:
wget https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.2.tar.bz2
tar xfj openmpi-2.1.2.tar.bz2
cd openmpi-2.1.2; mkdir build; cd build
./configure --prefix=$HOME/usr --enable-mpi-cxx --enable-shared --with-slurm --enable-mpi-thread-multiple --enable-mpi-ext=affinity,cuda --with-cuda=/public/apps/cuda/9.0
make -j 20 all
make install


然后安装TorchMPI:
MPI_CXX_COMPILER=$HOME/usr/bin/mpicxx ~/usr/bin/luarocks install torchmpi


Torch和其他Torch工具包
luarocks install torch
luarocks install cudnn # for GPU support
luarocks install cunn # for GPU support


wav2letter包
git clone https://github.com/facebookresearch/wav2letter.git
cd wav2letter
cd gtn && luarocks make rocks/gtn-scm-1.rockspec && cd ..
cd speech && luarocks make rocks/speech-scm-1.rockspec && cd ..
cd torchnet-optim && luarocks make rocks/torchnet-optim-scm-1.rockspec && cd ..
cd wav2letter && luarocks make rocks/wav2letter-scm-1.rockspec && cd ..

Assuming here you got KenLM in $HOME/kenlm

And only if you plan to use the decoder:

cd beamer && KENLM_INC=$HOME/kenlm luarocks make rocks/beamer-scm-1.rockspec && cd ..


训练wav2letter模型
数据预处理
数据文件夹包含许多用于预处理各种数据集的脚本。现在我们只提供LibriSpeech和TIMIT。
以下是如何预处理LibriSpeech自动语音识别系统语料库的一个例子:
wget http://www.openslr.org/resources/12/dev-clean.tar.gz
tar xfvz dev-clean.tar.gz

repeat for train-clean-100, train-clean-360, train-other-500, dev-other, test-clean, test-other

luajit ~/wav2letter/data/librispeech/create.lua ~/LibriSpeech ~/librispeech-proc
luajit ~/wav2letter/data/utils/create-sz.lua librispeech-proc/train-clean-100 librispeech-proc/train-clean-360 librispeech-proc/train-other-500 librispeech-proc/dev-clean librispeech-proc/dev-other librispeech-proc/test-clean librispeech-proc/test-other


训练
mkdir experiments
luajit ~/wav2letter/train.lua --train -rundir ~/experiments -runname hello_librispeech -arch ~/wav2letter/arch/librispeech-glu-highdropout -lr 0.1 -lrcrit 0.0005 -gpu 1 -linseg 1 -linlr 0 -linlrcrit 0.005 -onorm target -nthread 6 -dictdir ~/librispeech-proc  -datadir ~/librispeech-proc -train train-clean-100+train-clean-360+train-other-500 -valid dev-clean+dev-other -test test-clean+test-other -gpu 1 -sqnorm -mfsc -melfloor 1 -surround "|" -replabel 2 -progress -wnorm -normclamp 0.2 -momentum 0.9 -weightdecay 1e-05


在多个GPU上训练
使用OpenMPI产生多个训练过程,每个GPU产生一个:
mpirun -n 2 --bind-to none  ~/TorchMPI/scripts/wrap.sh luajit ~/wav2letter/train.lua --train -mpi -gpu 1 ...

我们假设这里mpirun在$PATH文件夹中。

运行解码器
运行解码器前要先做一些预处理。
首先创建一个字母库,其中包括在wav2letter中使用到的特殊重复字母:
cat ~/librispeech-proc/letters.lst >> ~/librispeech-proc/letters-rep.lst && echo "1" >> ~/librispeech-proc/letters-rep.lst && echo "2" >> ~/librispeech-proc/letters-rep.lst


然后我们就得到了一个语言模型,接着预处理它。在这里,我们使用为LibriSpeech预先训练好的语言模型,但也可以用KenLM自己训练。接着,我们在预处理时将其转换成小写字母的单词,并用特殊词典dict.lst中的重复字母产生出转换后的字母。由于重复字母数量并不多,脚本也许会提醒你错误的转换。在我们的案例中没有这种问题,因为那些单词都比较罕见。
wget http://www.openslr.org/resources/11/3-gram.pruned.3e-7.arpa.gz luajit
~/wav2letter/data/utils/convert-arpa.lua ~/3-gram.pruned.3e-7.arpa.gz ~/3-gram.pruned.3e-7.arpa ~/dict.lst -preprocess ~/wav2letter/data/librispeech/preprocess.lua -r 2 -letters letters-rep.lst


注意:可以用预训练的4-gram语言模型4-gram.arpa.gz代替;预训练过程会更久。

另外,用KenLM将其转化为二进制格式,后续载入语言模型,可缩短转化时间(我们这里假设KenLM在$PATH中)。
build_binary 3-gram.pruned.3e-7.arpa 3-gram.pruned.3e-7.bin


我们现在可以为经过特殊训练的模型生成emissions,在数据集上运行test.lua。脚本还可以显示字母错误率(LER)和单词错误率(WER),后者无需通过声音模型的处理即可得出。
luajit ~/wav2letter/test.lua ~/experiments/hello_librispeech/001_model_dev-clean.bin -progress -show -test dev-clean -save


当emissions存储后,可运行解码器来计算单词错误率:
luajit ~/wav2letter/decode.lua ~/experiments/hello_librispeech dev-clean -show -letters ~/librispeech-proc/letters-rep.lst  -words ~/dict.lst -lm ~/3-gram.pruned.3e-7.arpa -lmweight 3.1639 -beamsize 25000 -beamscore 40 -nthread 10 -smearing max -show


预训练模型
LibriSpeech的完整预训练模型:
wget https://s3.amazonaws.com/wav2letter/models/librispeech-glu-highdropout.bin


有关该模型的使用,请阅读安装要求、安装以及解码过程。
注意:该模型是在Facebook架构上预训练的,所以在运行test.lua的时候需要稍微改变参数:
luajit ~/wav2letter/test.lua ~/librispeech-glu-highdropout.bin -progress -show -test dev-clean -save -datadir ~/librispeech-proc/ -dictdir ~/librispeech-proc/ -gfsai


GitHub地址:github.com/facebookresearch/wav2letter

学习更多语音识别技术http://www.julyedu.com/course/getDetail/101
语音识别技术的前世今生1.png
已邀请:

要回复问题请先登录注册

返回顶部