调整默认声学模型
本页介绍如何进行一些简单的声学模型调整以改进配置中的语音识别。请注意,改编不一定适合特定的说话者。它只是提高了适应数据和模型之间的拟合度。例如,您可以适应自己的声音以使听写变得更好,但您也可以适应特定的录音环境、音频传输通道、您的口音或用户的口音。您可以使用经过干净的广播数据和电话数据训练的模型,通过进行适应来生成电话声学模型。跨语言适应也很有意义,例如,您可以通过创建电话机映射并使用英语电话机创建另一种语言词典,使英语模型适应另一种语言的声音。
适应过程采用转录数据并改进您已有的模型。它比训练更稳健,即使您的适应数据很小,也可以带来良好的结果。例如,5分钟的演讲就足以通过适应特定的说话者来显着提高听写准确性。
由于使用的声学模型类型不同,PocketSphinx 和 Sphinx4 之间的适配方法略有不同。有关更多技术信息,请阅读有关声学模型类型的文章 。
构建工具
您在这里至少需要 PocketSphinx 和 SphinxTrain。按照教程中的说明构建并安装 PocketSphinx 。SphinxTrain 可以使用相同的指令构建:
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=$HOME/cmusphinx -G Ninja
cmake --build build --target install
这些工具将位于$HOME/cmusphinx/libexec/sphinxtrain
.
创建适应语料库
现在,您需要创建一个适应数据语料库。该语料库将包括
- 句子列表
- 一本描述该句子列表中所有单词发音的词典
- 你所说的每个句子的录音
所需文件
您使用的实际句子集有些随意,但理想情况下它应该很好地覆盖句子集中最常用的单词或音素或您想要识别的文本类型。例如,如果你想识别孤立的命令,你需要记录它们。如果你想识别听写,你需要记录完整的句子。对于简单的语音适应,我们仅使用CMU ARCTIC文本转语音数据库中的句子就获得了良好的结果。为此,以下是 ARCTIC 的前 20 个句子、一个.fileids
文件和一个转录文件:
下面的部分将引用这些文件,因此,如果您想继续操作,我们建议您立即下载这些文件。您还应该确保已下载并编译 sphinxbase 和 sphinxtrain。
记录您的适应数据
如果您要适应单个扬声器,您可以自己记录适应数据。不幸的是,这比应有的情况要复杂一些。
基本上,您需要为改编语料库中的每个句子录制一个音频文件,并根据 arctic20.transcription
和中列出的名称命名文件arctic20.fileids
。
此外,您需要确保以16 kHz(如果您采用电话型号则为 8 kHz)的采样率以单通道单声道进行录制。
最简单的方法是启动 Audacity 或 Wavesurfer 等录音机并读取一个大音频文件中的所有句子。然后,您可以在文本编辑器中将音频文件剪切为句子,并确保每个句子都保存在相应的文件中。文件结构应如下所示:
arctic_0001.wav
arctic_0002.wav
.....
arctic_0019.wav
arctic20.fileids
arctic20.transcription
您应该验证这些录音听起来是否正常。为此,您可以使用以下命令回放它们:
for i in *.wav; do play $i; done
如果您已经有讲话者的录音,您可以将其分割成句子并创建.fileids
和.transcription
文件。
如果您正在适应音频的声道、口音或其他一些通用属性,那么您需要手动收集更多的录音。例如,在呼叫中心,您可以记录和转录数百个呼叫,并使用它们通过适应来提高识别器的准确性。
调整声学模型
首先,我们将默认声学模型从 PocketSphinx 复制到当前目录中以便对其进行处理。假设您安装了 PocketSphinx $HOME/cmusphinx
,声学模型目录为 $HOME/cmusphinx/share/pocketsphinx/model/en-us/en-us
。将此目录复制到您的工作目录:
cp -a $HOME/cmusphinx/share/pocketsphinx/model/en-us/en-us .
我们还复制字典和语言模型进行测试:
cp -a $HOME/cmusphinx/share/pocketsphinx/model/en-us/cmudict-en-us.dict .
cp -a $HOME/cmusphinx/share/pocketsphinx/model/en-us/en-us.lm.bin .
生成声学特征文件
为了运行适配工具,您必须从这些 WAV 音频录音中生成一组声学模型特征文件。这可以使用 SphinxBase 的工具来完成 sphinx_fe
。您必须确保使用与训练标准声学模型相同的声学参数来提取这些特征。从 PocketSphinx 0.4 开始,它们存储在feat.params
声学模型目录中名为的文件中。您可以简单地将其添加到 的命令行sphinx_fe
,如下所示:
$HOME/cmusphinx/libexec/sphinxtrain/sphinx_fe -argfile en-us/feat.params \
-samprate 16000 -c arctic20.fileids \
-di . -do . -ei wav -eo mfc -mswav yes
您的工作目录中现在应该有以下文件:
en-us
arctic_0001.mfc
arctic_0001.wav
arctic_0002.mfc
arctic_0002.wav
arctic_0003.mfc
arctic_0003.wav
.....
arctic_0020.wav
arctic20.fileids
arctic20.transcription
cmudict-en-us.dict
en-us.lm.bin
转换sendump和mdef文件
一些模型(例如 en-us)以压缩版本分发。排除了适应所需的额外文件以节省空间。对于 pocketsphinx 的 en-us 模型,您可以下载适合适配的完整版本:
cmusphinx-en-us-ptm-5.2.tar.gz
确保您使用的是包含mixture_weights
文件的完整模型。
如果mdef
模型内的文件转换为二进制,您还需要将文件mdef
从声学模型转换为 SphinxTrain 工具使用的纯文本格式。为此,请使用以下pocketsphinx_mdef_convert
程序:
$HOME/cmusphinx/bin/pocketsphinx_mdef_convert -text en-us/mdef en-us/mdef.txt
在下载中mdef
已经是文本形式了。
累积观察计数
适应的下一步是从适应数据中收集统计数据。这是使用bw
SphinxTrain 的程序完成的。您应该能够bw
在 sphinxtrain 安装文件夹中找到该工具 $HOME/cmusphinx/libexec/sphinxtrain
。
现在,要收集统计数据,请运行:
$HOME/cmusphinx/libexec/sphinxtrain/bw \
-hmmdir en-us \
-moddeffn en-us/mdef.txt \
-ts2cbfn .ptm. \
-feat 1s_c_d_dd \
-svspec 0-12/13-25/26-38 \
-cmn current \
-agc none \
-dictfn cmudict-en-us.dict \
-ctlfn arctic20.fileids \
-lsnfn arctic20.transcription \
-accumdir .
确保命令中的参数与声学模型文件夹内的文件bw
中的参数匹配 。feat.params
请注意,并非所有参数都feat.param
受bw
. bw
例如不支持upperf
或其他特征提取参数。您只需要使用可接受的参数,feat.params
应跳过其他参数。
例如,对于连续模型,您不需要包含该svspec
选项。相反,您只需使用-ts2cbfn .cont.
对于半连续模型使用-ts2cbfn .semi
。如果模型有feature_transform
en-us 连续模型这样的文件,则需要添加参数-lda feature_transform
,bw
否则将无法正常工作。
如果您丢失了该noisedict
文件,则还需要执行额外的步骤。将文件复制fillerdict
到您在参数中选择的目录中hmmdir
,并将其重命名为noisedict
.
使用 MLLR 创建转换
pocketsphinx 和 sphinx4 支持 MLLR 变换。MLLR是一种廉价的自适应方法,适用于数据量有限的情况。使用 MLLR 进行在线适配是一个好主意。MLLR 最适合连续模型。它对半连续模型的影响非常有限,因为半连续模型主要依赖于混合权重。如果您想要获得最佳精度,可以将 MLLR 适应与下面的 MAP 适应结合起来。另一方面,由于 MAP 需要大量自适应数据,因此将其用于连续模型并不实际。对于连续模型,MLLR 更为合理。
接下来,我们将生成 MLLR 转换,将其传递给解码器以在运行时调整声学模型。这是通过以下mllr_solve
程序完成的:
$HOME/cmusphinx/libexec/sphinxtrain/mllr_solve \
-meanfn en-us/means \
-varfn en-us/variances \
-outmllrfn mllr_matrix -accumdir .
该命令将创建一个名为 的适应数据文件mllr_matrix
。现在,如果您希望使用调整后的模型进行解码,只需将-mllr mllr_matrix
(或您创建的 mllr_matrix 文件的路径)添加到 pocketsphinx 命令行即可。
使用 MAP 更新声学模型文件
MAP是一种不同的适应方法。在这种情况下,与 MLLR 不同,我们不创建通用变换,而是更新模型中的每个参数。现在,我们将复制声学模型目录并使用调整后的模型文件覆盖新创建的目录:
cp -a en-us en-us-adapt
要应用调整,请使用以下map_adapt
程序:
$HOME/cmusphinx/libexec/sphinxtrain/map_adapt \
-moddeffn en-us/mdef.txt \
-ts2cbfn .ptm. \
-meanfn en-us/means \
-varfn en-us/variances \
-mixwfn en-us/mixture_weights \
-tmatfn en-us/transition_matrices \
-accumdir . \
-mapmeanfn en-us-adapt/means \
-mapvarfn en-us-adapt/variances \
-mapmixwfn en-us-adapt/mixture_weights \
-maptmatfn en-us-adapt/transition_matrices
重新创建调整后的sendump文件
如果您想节省模型空间,可以使用sendump
PocketSphinx 支持的文件。对于 Sphinx4 你不需要它。sendump
要从更新的文件重新创建 文件mixture_weights
,请运行:
$HOME/cmusphinx/libexec/sphinxtrain/mk_s2sendump \
-pocketsphinx yes \
-moddeffn en-us-adapt/mdef.txt \
-mixwfn en-us-adapt/mixture_weights \
-sendumpfn en-us-adapt/sendump
恭喜!您现在已经有了一个经过调整的声学模型。
en-us-adapt/mixture_weights
和文件en-us-adapt/mdef.txt
不被解码器使用,因此,如果您愿意,可以删除它们以节省一些空间。
其他声学模型
对于Sphinx4,适配与PocketSphinx相同,只是Sphinx4无法读取二进制压缩mdef
文件sendump
,需要保留mdef
和mixture weights
文件。
测试适应性
完成适配后,测试适配质量至关重要。为此,您需要设置与用于适应的数据库类似的数据库。要测试适配,您需要使用所需的参数配置解码,特别是,您需要有一个语言模型 <your.lm>
。有关更多详细信息,请参阅构建语言模型教程 。测试模型的详细过程将在本教程的另一部分中介绍。
您可以尝试在原始声学模型和新声学模型上运行解码器来估计改进情况。
使用模型
适配后,声学模型位于文件夹中en-us-adapt
。您只需要该文件夹。该模型应具有以下文件:
mdef
feat.params
mixture_weights
means
noisedict
transition_matrices
variances
取决于您训练的模型的类型。
要在 PocketSphinx 中使用模型,只需将模型文件放入应用程序的资源中即可。然后使用选项指向它-hmm
:
pocketsphinx -hmm `<your_new_model_folder>` -lm `<your_lm>` \
-dict `<your_dict>` single test.wav
要在Sphinx4中使用经过训练的模型,您需要更新代码中的模型位置。
故障排除
如果调整没有改善您的结果,请首先测试准确性并确保其良好。
我不知道从哪里开始寻找问题......
- 测试适配集的准确率是否有所提高
- 适应集的准确性提高⇢检查您的适应集是否与测试集匹配
- 适应集的准确性没有提高⇢你在适应过程中犯了一个错误
……或者我期望通过适应会有多少改进
从几个句子中,你应该获得大约 10% 的相对 WER 改进。
我迷失了……
…是否需要更多/更好的训练数据,我是否没有正确进行适应,我的语言模型是否是这里的问题,或者我的配置是否存在本质上的错误。
您很可能只是忽略了打印给您的一些错误消息。显然,您需要提供更多信息并允许访问您的实验文件,以获得更明确的建议。
下一步是什么
我们希望调整后的模型能给您带来可接受的结果。如果没有,请尝试通过以下方式改进您的适应过程:
- 添加更多适配数据
- 调整您的语言模式/使用更好的语言模型