CMUS狮身人面像(五)-调整默认声学模型

调整默认声学模型



本页介绍如何进行一些简单的声学模型调整以改进配置中的语音识别。请注意,改编不一定适合特定的说话者。它只是提高了适应数据和模型之间的拟合度。例如,您可以适应自己的声音以使听写变得更好,但您也可以适应特定的录音环境、音频传输通道、您的口音或用户的口音。您可以使用经过干净的广播数据和电话数据训练的模型,通过进行适应来生成电话声学模型。跨语言适应也很有意义,例如,您可以通过创建电话机映射并使用英语电话机创建另一种语言词典,使英语模型适应另一种语言的声音。

适应过程采用转录数据并改进您已有的模型。它比训练更稳健,即使您的适应数据很小,也可以带来良好的结果。例如,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已经是文本形式了。

累积观察计数

适应的下一步是从适应数据中收集统计数据。这是使用bwSphinxTrain 的程序完成的。您应该能够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.parambwbw例如不支持upperf或其他特征提取参数。您只需要使用可接受的参数,feat.params应跳过其他参数。

例如,对于连续模型,您不需要包含该svspec 选项。相反,您只需使用-ts2cbfn .cont.对于半连续模型使用-ts2cbfn .semi。如果模型有feature_transformen-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文件

如果您想节省模型空间,可以使用sendumpPocketSphinx 支持的文件。对于 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,需要保留mdefmixture 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中使用经过训练的模型,您需要更新代码中的模型位置。

故障排除

如果调整没有改善您的结果,请首先测试准确性并确保其良好。

我不知道从哪里开始寻找问题......

  1. 测试适配集的准确率是否有所提高
  2. 适应集的准确性提高⇢检查您的适应集是否与测试集匹配
  3. 适应集的准确性没有提高⇢你在适应过程中犯了一个错误

……或者我期望通过适应会有多少改进

从几个句子中,你应该获得大约 10% 的相对 WER 改进。

我迷失了……

…是否需要更多/更好的训练数据,我是否没有正确进行适应,我的语言模型是否是这里的问题,或者我的配置是否存在本质上的错误。

您很可能只是忽略了打印给您的一些错误消息。显然,您需要提供更多信息并允许访问您的实验文件,以获得更明确的建议。

下一步是什么

我们希望调整后的模型能给您带来可接受的结果。如果没有,请尝试通过以下方式改进您的适应过程:

  1. 添加更多适配数据
  2. 调整您的语言模式/使用更好的语言模型
  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟V-SpHeNIC

支持科研技术

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值