第一次接触语音识别开发的朋友可能会被复杂的工具链吓到,但别担心,跟着我的步骤一步步来,你也能轻松搭建起自己的语音识别开发环境。我当初刚入门时也踩过不少坑,现在把这些经验都分享给你,帮你少走弯路。
语音识别开发环境主要包含三个核心部分:Kaldi工具包、PyTorch-Kaldi深度学习框架,以及TIMIT、Librispeech等主流数据集。我们先从最基础的Kaldi安装开始,这是整个环境的基础。建议使用Ubuntu 18.04或20.04系统,这是最稳定的开发环境。
在开始之前,确保你的系统已经更新到最新状态。打开终端,输入以下命令更新系统:
bash复制sudo apt-get update
sudo apt-get upgrade -y
这个步骤可能会花费一些时间,取决于你的网络速度。更新完成后,我们需要安装一些必要的开发工具和依赖库。这些工具包括编译器、版本控制工具、Python环境等。别被这一长串命令吓到,它们都是开发必备的基础工具:
bash复制sudo apt-get install -y --no-install-recommends g++ make automake autoconf bzip2 unzip wget sox libtool git subversion python2.7 python3 zlib1g-dev gfortran ca-certificates patch vim
安装完成后,建议创建一个Python2.7的软链接,因为Kaldi的某些脚本仍然依赖Python2.7:
bash复制sudo ln -s /usr/bin/python2.7 /usr/bin/python
Kaldi是语音识别领域最流行的开源工具包之一,它提供了从特征提取到声学模型训练的全套工具。安装Kaldi的第一步是从GitHub克隆代码库:
bash复制git clone https://github.com/kaldi-asr/kaldi.git
如果你的网络连接GitHub不太稳定,也可以直接下载最新的ZIP压缩包解压。克隆完成后,进入tools目录检查依赖:
bash复制cd kaldi/tools
extras/check_dependencies.sh
这个脚本会告诉你缺少哪些依赖包。根据提示安装缺少的依赖后,我们需要安装Intel MKL数学库,这对Kaldi的性能至关重要:
bash复制extras/install_mkl.sh
安装完成后,再次运行check_dependencies.sh确认所有依赖都已满足。如果看到"all OK"的提示,就可以开始编译工具链了:
bash复制make -j $(nproc)
这里的-j参数后面跟的是你CPU的核心数,可以使用nproc命令自动获取。编译过程可能会比较长,耐心等待。如果遇到下载失败的情况(某些.tar.gz文件大小为0),需要手动下载这些文件并放到相应目录,然后执行make clean后重新make。
接下来编译Kaldi主代码:
bash复制cd ../src
./configure --shared
make depend -j $(nproc)
make -j $(nproc)
编译完成后,我们可以用Kaldi自带的yesno例子测试安装是否成功:
bash复制cd ../egs/yesno/s5
./run.sh
如果一切顺利,你会看到识别结果输出,这表示Kaldi已经正确安装。第一次运行可能会比较慢,因为需要下载和解压示例数据。
PyTorch-Kaldi是基于PyTorch的Kaldi扩展,它结合了Kaldi的高效特征提取和PyTorch灵活的深度学习框架。在安装PyTorch-Kaldi之前,确保你已经完成了Kaldi的安装,并且系统已经安装了Python3和pip。
首先安装PyTorch,建议使用conda创建一个新的Python环境:
bash复制conda create -n pytorch-kaldi python=3.7
conda activate pytorch-kaldi
pip install torch torchvision torchaudio
然后从GitHub克隆PyTorch-Kaldi代码:
bash复制git clone https://github.com/mravanelli/pytorch-kaldi.git
cd pytorch-kaldi
接下来需要配置环境变量,让PyTorch-Kaldi知道Kaldi的安装位置。编辑你的.bashrc文件:
bash复制nano ~/.bashrc
在文件末尾添加以下内容(注意将KALDI_ROOT替换为你实际的Kaldi安装路径):
bash复制export KALDI_ROOT=/path/to/your/kaldi
PATH=$PATH:$KALDI_ROOT/tools/openfst
PATH=$PATH:$KALDI_ROOT/src/featbin
PATH=$PATH:$KALDI_ROOT/src/gmmbin
PATH=$PATH:$KALDI_ROOT/src/bin
PATH=$PATH:$KALDI_ROOT/src/nnetbin
export PATH
保存退出后,执行以下命令使配置生效:
bash复制source ~/.bashrc
现在可以安装PyTorch-Kaldi的Python依赖了:
bash复制pip install -r requirements.txt
安装完成后,你可以运行示例脚本来验证安装是否成功。PyTorch-Kaldi提供了多个示例配置,可以从最简单的开始尝试:
bash复制python run_exp.py cfg/TIMIT_baselines/TIMIT_MLP_mfcc.cfg
TIMIT和Librispeech是语音识别领域最常用的两个基准数据集。TIMIT相对较小,适合快速验证模型;Librispeech则更大更复杂,适合训练更强大的模型。
TIMIT数据集需要从LDC(语言数据联盟)购买,但对于学术研究,可以通过Academic Torrents免费获取。首先安装Transmission客户端:
bash复制sudo apt-get install transmission-cli transmission-common transmission-daemon
然后从Academic Torrents下载TIMIT数据集:
bash复制transmission-cli "magnet:?xt=urn:btih:5bc066a9a38a7b702354b43f211b5a1c2b61e1d3&dn=TIMIT&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.istole.it%3A6969&tr=udp%3A%2F%2Fopen.demonii.com%3A1337"
下载完成后,解压数据集并准备Kaldi格式的数据目录。Kaldi提供了TIMIT数据准备的脚本,位于egs/timit/s5目录下。你需要修改run.sh中的路径指向你下载的TIMIT数据集位置。
Librispeech数据集可以从OpenSLR网站直接下载:
bash复制wget https://www.openslr.org/resources/12/train-clean-100.tar.gz
wget https://www.openslr.org/resources/12/train-clean-360.tar.gz
wget https://www.openslr.org/resources/12/train-other-500.tar.gz
wget https://www.openslr.org/resources/12/dev-clean.tar.gz
wget https://www.openslr.org/resources/12/dev-other.tar.gz
wget https://www.openslr.org/resources/12/test-clean.tar.gz
wget https://www.openslr.org/resources/12/test-other.tar.gz
下载完成后,解压所有压缩包:
bash复制for f in *.tar.gz; do tar xzf $f; done
Kaldi同样提供了Librispeech的数据准备脚本,位于egs/librispeech/s5目录下。你需要修改run.sh中的路径,并可能需要根据你的硬件配置调整一些参数,比如并行处理的数量。
在环境搭建过程中,你可能会遇到各种问题。下面分享一些我遇到过的典型问题及解决方法。
问题1:Kaldi编译失败
最常见的原因是依赖没有完全安装。仔细检查check_dependencies.sh的输出,确保所有依赖都已安装。另一个常见问题是内存不足,可以尝试减少make的并行数量(比如make -j 4)。
问题2:PyTorch-Kaldi运行时找不到Kaldi工具
这通常是因为环境变量没有正确设置。确保KALDI_ROOT指向正确的路径,并且PATH包含了Kaldi的各种工具目录。可以执行which fstcompile等命令测试路径是否正确。
问题3:数据集处理失败
数据集处理失败通常是因为路径设置不正确或者文件权限问题。确保所有数据文件的路径在配置文件中正确指定,并且你有读取这些文件的权限。对于TIMIT数据集,还需要注意它有一个特殊的目录结构。
为了提高开发效率,我建议:
对于性能优化,可以考虑: