
精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
非常好的kaldi实践方案,里面对数据结果有说明,这时国内文章一般没有的情况,显的非常直观,并且我在里面发现了些非常好的工具说明。如果对这个实践想掌握,但没有信心请联系锐英源,QQ396806883,手机13803810136。
注意:编译 Kaldi 有点复杂,所以我们在 Myth 上为您编译了一个版本。我们强烈建议学生完成关于 Myth 的这部分作业。如果出于某种原因,您更愿意在您的个人计算机上执行此操作,请参阅附录中的安装说明(预计时间为 2 小时)。
首先,Kaldi 有几个我们为您安装的依赖项。但是,我们需要将它们添加到您的路径中。
打开您的~/.bash_profile并添加以下行:
# .bash_profile
export MKL_ROOT=/afs/ir/class/cs224s/intel/oneapi/mkl/latest
export PATH=/afs/ir/class/cs224s/sox-14.4.2/src:$PATH
export PATH=/afs/ir/class/cs224s/srilm-1.7.3/bin/i686-m64:$PATH
记住你再次获取文件。
source ~/.bash_profile
接下来,Kaldi 二进制文件存储在/afs/ir/class/cs224s/kaldi/src/binMyth 中。确保您可以访问这些!
>>> ls /afs/ir/class/cs224s/kaldi/src/bin
acc-lda est-lda
acc-lda.cc est-lda.cc
acc-lda.o est-lda.o
acc-tree-stats est-mllt
acc-tree-stats.cc est-mllt.cc
acc-tree-stats.o est-mllt.o
add-self-loops est-pca
... ...
我们在此处为您提供入门代码。请注意,这是一个大文件,因为它包含完整的数据集和一组帮助脚本。
单击该链接应下载名为harper_valley_bank.tar.gz. 将其移至 myth 并将其解压到您的主目录中。
scp harper_valley_bank.tar.gz wumike@myth.stanford.edu:~
ssh wumike@myth.stanford.edu
tar -xzvf harper_valley_bank.tar.gz
此文件夹包含用于训练和对齐 Kaldi 模型的实用程序脚本。花一点时间熟悉每个子文件夹的内容:
>>> ls harper_valley_bank/s5
cmd.sh conf data local path.sh run.sh setup_data.py steps utils
该data文件夹包含原始波形和脚本。我们将在下一节对此进行更多探讨。
的local,steps和utils文件夹包含建立在顶部辅助脚本kaldi是用于常见的操作如培训HMM模型的二进制文件。
该run.sh脚本包含适合单声道模型的样板。这是您进行大部分编辑的地方。
本path.sh是用来指向Kaldi安装。确保它包含该行
KALDI_ROOT = '/afs/ir/class/cs224s/kaldi'
切换到harper_valley_bank/s5/data目录。
>>> cd harper_valley_bank/s5/data; ls
corpus lang local raw test train
该raw文件夹包含您在第 1 部分中分析的 HarperValleyBank 数据集的全套波形和抄本。 Kaldi 期望数据经过专门格式化。我们已经为您完成了这项工作,并将输出放在train和 中test。如果您对它的工作原理感到好奇,请参阅s5/setup_data.py。
我们将快速突出一些更重要的文件:
{train,test}/text: 包含所有训练语句。每行中的第一个标记是话语的唯一 id;行的其余部分显示话语,全部大写。每个话语 id 开头的数字指定说话人 id(例如,第一行中的 107)。
107-GRIDSPACE_T0126ffdce48049a9_UTT1 UH HIGHWAY MY NAME IS DAVID JONES
107-GRIDSPACE_T0126ffdce48049a9_UTT3 I WANTED TO KNOW THE LOCAL BRANCH HOURS
107-GRIDSPACE_T0126ffdce48049a9_UTT6 NO THAT'S IT WILL BE ALL THANK YOU
107-GRIDSPACE_T0126ffdce48049a9_UTT8 YOU TOO BYE NOW
107-GRIDSPACE_T16319d899b0d4fec_UTT1 HI MY NAME IS MAYBE BROWN I NEED TO CHECK MY ACCOUNT BALANCE
107-GRIDSPACE_T1c4e1b0407594bb9_UTT1 MY NAME IS LINDA
{train,test}/segments: 包含 .wav 文件中标记每个话语开始和结束的秒数。它对中的每一行都有一个一对一的映射text。Kaldi 将使用此信息为语音模型裁剪正确的输入。
107-GRIDSPACE_T0126ffdce48049a9_UTT1 107-GRIDSPACE_F0126ffdce48049a9 9.02 12.32
107-GRIDSPACE_T0126ffdce48049a9_UTT3 107-GRIDSPACE_F0126ffdce48049a9 21.69 24.27
107-GRIDSPACE_T0126ffdce48049a9_UTT6 107-GRIDSPACE_F0126ffdce48049a9 44.19 45.78
{train,test}/utt2spk: 将每个话语映射到说话者 id。相关,{train,test}/spk2utt将每个说话者 id 映射到话语列表。
30-GRIDSPACE_Tca2f61d1fbd74667_UTT2 30
23-GRIDSPACE_T3200779259d544b5_UTT2 23
29-GRIDSPACE_T42c90e3299244cc4_UTT5 29
24-GRIDSPACE_T9a2fac8101ef4a87_UTT9 24
{train,test}/wav.scp: 将每个对话 id 映射到 .wav 文件的路径。对于此任务,我们不会区别对待座席和呼叫者。
40-GRIDSPACE_Fee34f34e93b64a6f data/raw/audio/caller/ee34f34e93b64a6f.wav
44-GRIDSPACE_Ff9e797a1807e41fd data/raw/audio/caller/f9e797a1807e41fd.wav
21-GRIDSPACE_Fd73be060c5994ae3 data/raw/audio/agent/d73be060c5994ae3.wav
33-GRIDSPACE_F076cd53656c64dc5 data/raw/audio/caller/076cd53656c64dc5.wav
的内容train,并test通过扬声器分开,这意味着所有的测试中分割音频文件是前所未见的扬声器。一个好的 ASR 系统的挑战是推广到野外的说话者。
corpus/corpus.txt: 包含由新行分隔的所有话语。Kaldi 将使用它来构建语言模型。语言模型用于将转录偏向“类人”文本。
local/lang/lexicon.txt:Kaldi 训练的 HMM 模型是通过音素(而不是单词)。也就是说,我们需要能够分解我们对音素的话语中的标记。我们在CMUDict的“词典”中对此进行了硬编码。
ABYSMAL AH0 B IH1 Z M AH0 L
ABYSMALLY AH0 B IH1 Z M AH0 L IY0
ABYSS AH0 B IH1 S
ABYSSINIA AE0 B S IH1 N IY2 AH0
ABYSSINIAN AE0 B S IH1 N IY2 AH0 N
ABZUG AE1 B Z AH2 G
ABZUG(1) AE1 B Z UH2 G
通过这个词典,我们向 Kaldi 提供了有关语音和单词发音的先验信息。在构建 Kaldi 系统时,拥有一个好的词典是非常重要的。
local/lang/{optional_silence.txt/silence_phones.txt}:音素代表沉默或未知标记的硬编码。在我们的词典中,token<UNK>表示词汇外的单词。
local/lang/{nonsilence_phones.txt}:所有非静音音素的列表。
lang/*: 用于处理自然语言的文件。例如,lang/words.txt将每个单词映射到唯一索引,而lang/phonemes.txt将每个音素映射到唯一索引。
##任务 3.1.1: 检查启动代码(1 分)
如您所见,Kaldi 格式非常具体。因此,开发人员为您提供了帮助函数来检查数据格式是否正确。作为您的第一项任务,在您的训练和测试文件夹上运行以下脚本以验证格式:
utils/validate_data_dir.sh ./data/train --no-feats
utils/validate_data_dir.sh ./data/test --no-feats
在背面,包括命令行输出的屏幕截图。在进行更改时,最好检查一下数据格式中没有错误。
最基本的 Kaldi 模型,通常甚至是最复杂的 Kaldi 语音系统的构建块是单音素模型,它在话语中的每个音素上拟合 HMM。也就是说,它在预测对齐时不添加任何上下文信息(前面或后面的音素)。
下面接下来的五项任务将采取步骤训练单声道模型。然后,我们探索了一些改进和解释训练模型的方法。前几个步骤将主要是程序性的,以帮助您训练您的第一个 Kaldi 模型。
首先,我们需要定义一些全局变量。在harper_valley_bank/s5. 您需要为每个新的 bash shell 执行此操作。
. ./cmd.sh # set global commands
. ./path.sh # set global paths
与大多数语音系统一样,Kaldi 不将原始波形作为输入特征。在作业 1 中,您了解了梅尔频率倒谱系数 (MFCC)。在此任务中,我们将在 HarperValleyBank 语料库上预先计算 MFCC 特征。
运行以下命令:
steps/make_mfcc.sh --cmd "$train_cmd" data/train exp/make_mfcc/train mfcc
steps/make_mfcc.sh --cmd "$train_cmd" data/test exp/make_mfcc/test mfcc
可能还要等一下!仔细阅读输出。如果成功,您应该在以下位置找到几个原始 MFCC 功能的新压缩文件harper_valley_bank/s5/mfcc:
raw_mfcc_test.1.ark raw_mfcc_test.2.scp raw_mfcc_test.4.ark raw_mfcc_train.1.scp raw_mfcc_train.3.ark raw_mfcc_train.4.scp
raw_mfcc_test.1.scp raw_mfcc_test.3.ark raw_mfcc_test.4.scp raw_mfcc_train.2.ark raw_mfcc_train.3.scp
raw_mfcc_test.2.ark raw_mfcc_test.3.scp raw_mfcc_train.1.ark raw_mfcc_train.2.scp raw_mfcc_train.4.ark
同样在data/train和data/test子目录中,您应该找到以下文件:
feats.scp: 从 id 到原始压缩文件路径和行号的映射
0-GRIDSPACE_T0d48b37580c94ea6_UTT1 /afs/.ir/users/w/u/wumike/cs224s/harper_valley_bank/s5/mfcc/raw_mfcc_train.1.ark:35
0-GRIDSPACE_T0d48b37580c94ea6_UTT2 /afs/.ir/users/w/u/wumike/cs224s/harper_valley_bank/s5/mfcc/raw_mfcc_train.1.ark:2782
0-GRIDSPACE_T0d48b37580c94ea6_UTT4 /afs/.ir/users/w/u/wumike/cs224s/harper_valley_bank/s5/mfcc/raw_mfcc_train.1.ark:5568
utt2dur:从话语到持续时间(秒)的映射
9-GRIDSPACE_Te1aaf02301d14cc7_UTT5 2.58
9-GRIDSPACE_Te1aaf02301d14cc7_UTT7 5.46
9-GRIDSPACE_Te1aaf02301d14cc7_UTT8 1.68
9-GRIDSPACE_Te273b03a6feb42fa_UTT2 4.35
monophone 模型依赖这些文件来抓取特征来训练 HMM。
最后,我们对 MFCC 特征进行归一化。这有助于 ASR 系统对环境噪声(例如麦克风质量、背景噪声等)更有弹性。
steps/compute_cmvn_stats.sh data/train exp/make_mfcc/train mfcc
steps/compute_cmvn_stats.sh data/test exp/make_mfcc/test mfcc
完成语言模型和数据集的设置后,实际上训练单音器模型是一个命令。
steps/train_mono.sh --boost-silence 1.25 --totgauss 1000 --nj 4 --cmd "$train_cmd" data/train data/lang exp/mono
注意:确保您已运行. ./path.sh和. ./cmd.sh.
# output of train_mono.sh
steps/train_mono.sh: Initializing monophone system.
steps/train_mono.sh: Compiling training graphs
steps/train_mono.sh: Aligning data equally (pass 0)
steps/train_mono.sh: Pass 1
steps/train_mono.sh: Aligning data
steps/train_mono.sh: Pass 2
steps/train_mono.sh: Aligning data
...
steps/train_mono.sh: Done training monophone system in exp/mono
我们重点介绍了一些超参数:
totgauss:Kaldi 混合模型中的高斯总数。
boost-silence:提高对齐中沉默可能性的因素。
为了评估单音模型的质量,我们计算预测和真实转录的词/音素错误率(即 WER)。
“单词错误率”定义为:
WER = (# substitutions + # deletions + # insertions) / (# total)
它也被称为 Levenshtein 距离。
要在 Kaldi 中计算 WER,我们首先需要使用经过训练的单音模型进行预测。
这需要语言模型的一些工件。在运行以下命令之前,请完成任务 3.5.1。这将生成一个G.fst需要的文件mkgraph。
注意:下面的命令可能需要一些时间!
utils/mkgraph.sh --mono data/lang exp/mono exp/mono/graph
steps/decode.sh --config conf/decode.config --nj 4 --cmd "$decode_cmd" exp/mono/graph data/test exp/mono/decode
部分解码脚本计算 WER。我们使用另一个 Kaldi 实用程序来打印exp文件夹中所有模型的错误率。
for x in exp/*/decode*; do [ -d $x ] && grep WER $x/wer_* | utils/best_wer.sh; done
在我们要求您报告WER的所有地方,您可以使用上面的命令。
解码后,我们可以计算它们与原始波形的对齐方式,即模型如何将语音中的音素对齐到音频文件。
steps/align_si.sh --boost-silence 1.25 --nj 4 --cmd "$train_cmd" data/train data/lang exp/mono exp/mono_ali
注意:训练好的模型exp/mono存储在exp/mono_ali.
定性检查模型效果的一个好方法是查看其对齐方式。要可视化这些对齐,请执行以下命令:
gunzip -k exp/mono_ali/ali.1.gz
show-alignments data/lang/phones.txt exp/mono_ali/final.mdl ark:exp/mono_ali/ali.1
在您的文章中,我们建议包括对齐示例的屏幕截图。
这是一个示例输出show-alignments:
23-GRIDSPACE_T7846f7b9d786467d_UTT5 [ 4 16 18 ] [ 1238 1240 1239 1239 1239 1242 1241 1241 ] [ 572 571 571 571 571 571 574 573 573 573 573 573 576 575 ] [ 278 280 279 282 281 ] [ 674 673 673 676 678 677 677 677 677 677 677 677 677 ] [ 1490 1489 1492 1494 ] [ 770 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 769 772 771 771 771 774 ] [ 1508 1510 1512 ] [ 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 18 17 17 17 ] [ 1022 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1021 1024 1023 1023 1026 1025 ] [ 1820 1819 1822 1824 1823 1823 ] [ 4 1 16 15 15 15 15 15 18 ] [ 1286 1288 1287 1287 1287 1287 1287 1290 1289 1289 1289 1289 1289 ] [ 578 577 577 577 577 577 577 577 577 577 577 577 577 577 580 579 579 579 582 581 581 581 581 581 581 ] [ 1292 1291 1294 1293 1293 1293 1293 1293 1293 1293 1293 1293 1293 1293 1293 1293 1293 1293 1296 ] [ 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 15 15 15 15 18 ] [ 1814 1813 1813 1813 1813 1813 1813 1816 1818 1817 1817 ] [ 1106 1108 1110 1109 1109 1109 1109 ] [ 1490 1489 1489 1489 1489 1489 1489 1492 1491 1494 1493 ] [ 1364 1363 1363 1363 1366 1365 1365 1368 1367 1367 ] [ 1502 1501 1501 1501 1501 1501 1501 1501 1501 1501 1504 1503 1506 1505 1505 1505 ] [ 1034 1033 1033 1033 1033 1033 1036 1035 1038 ] [ 1178 1177 1180 1182 ] [ 1508 1510 1512 1511 1511 1511 1511 ] [ 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 16 15 18 ] [ 1238 1237 1237 1240 1239 1239 1239 1239 1239 1239 1239 1239 1242 1241 1241 ] [ 890 889 889 889 889 889 889 889 889 889 892 891 891 894 893 ] [ 1292 1294 1293 1293 1293 1293 1293 1293 1293 1296 ] [ 1502 1501 1501 1501 1501 1501 1501 1501 1501 1504 1503 1506 1505 1505 1505 1505 1505 1505 1505 ] [ 1562 1564 1563 1563 1566 1565 1565 ] [ 1490 1492 1494 ] [ 1106 1105 1105 1105 1105 1105 1105 1105 1105 1105 1105 1105 1108 1107 1110 ] [ 1556 1558 1560 ]
23-GRIDSPACE_T7846f7b9d786467d_UTT5 SIL M_B AY1_E AE1_B D_I R_I EH2_I S_E SIL IH1_B Z_E SIL N_B AY1_I N_E SIL Z_B IY1_I R_I OW0_E S_B IH1_I K_I S_E SIL M_B EY1_I N_E S_B T_I R_I IY1_I T_E
一串数字是每个时间范围的转换/状态 ID。符号序列是对应于这些状态的音素级序列。从这个图来看,什么表明您的模型已经摆脱了平坦的开始,现在正在以更合理的方式对齐语音?评论你从回顾一些对齐中学到的任何其他东西。
正如您可能已经观察到的那样,第一个单声道模型的性能非常差:大约 25% 的 WER。这意味着大约四分之一的转录是错误的!
该模型可能对超参数非常敏感。尝试修改配方中的任何参数,看看是否有任何选择可以提高性能。例如,您可以改变高斯的数量或训练步骤的数量。有关train_mono.sh更详尽的超参数列表,请参阅脚本或 Kaldi 文档。
警告:我们可以在这些实验中重用 MFCC 功能和语言模型。但是,请注意您在训练、解码和对齐脚本中指定的文件夹。详尽地命名例如exp/mono_10kgaussianor是一件好事exp/mono_bigram。尽量不要覆盖旧的实验!
您的任务是尽可能获得性能最佳的单声道模型。在背面,描述您的方法并记录每次尝试的 WER。如果您观察到任何变化,请描述所产生的对齐方式中的任何变化。添加截图!
##你的第一个 Kaldi 方案
我们总结了您在harper_valley_bank/s5/recipe.sh. 该文件称为“Kaldi 配方”。
您可能已经猜到了,单声道模型的功率非常有限。流行的扩展之一是添加有关周围音素的信息,以在每个 HMM 状态中构建更具上下文的表示。
在 monophone 模型的对齐方式上训练 triphone 模型是很常见的。这通过在更简单的模型之上逐步构建更复杂的模型来体现 Kaldi 的一般哲学。
steps/train_deltas.sh --cmd "$train_cmd" <N_HMM> <N_GAUSSIAN> data/train data/lang exp/mono_ali exp/tri
请参阅上面的行作为示例。它使用 中的对齐方式exp/mono_ali并将三音素模型保存到exp/tri.
[注意:您的目录参数可能会有所不同,具体取决于您为上面的各种单音实验命名的名称。]
添加代码以recipe.sh在您的最佳单音模型之上训练三音模型。Kaldi 工作流程是逐步构建越来越大的模型。
最初,设置<N_HMM>为 2000 和<N_GAUSSIAN>10000(注意这已经是比单声道模型大得多的模型)。
与我们对单音素模型所做的类似,使用 Kaldi 脚本解码、对齐三音素模型并计算错误率。再次注意传递到steps/align_si.sh和的路径steps/decode.sh。
报告您的单词错误率。评论它与您的单声道系统的比较。如果您在构建三音系统时更改了任何模型参数,请在背面进行描述。
有一个 Kaldi 工具可以更深入地比较两组对齐方式。生成您的三音器和单音器模型之间的比较。在您提交的内容中包含输出,并评论您的观察结果。
steps/compare_alignments.sh data/lang data/train exp/mono_ali exp/tri_ali exp/compare_ali_mono_tri
这将生成一个带有派生统计信息和输出的文件夹:
>>> ls exp/compare_ali_mono_tri
compare_phones_mid.txt ctm2 phones_correct.txt utt_stats.words.percentiles
compare_phones_worst.txt log utt_stats.phones.percentiles utt_stats.words.sorted
ctm1 phone_subs.txt utt_stats.phones.sorted word_stats.txt
我们重点介绍了一些文件,这些文件提供了模型何时成功以及何时出错的示例。这些可用于解释模型行为。
phones_correct.txt:显示转录每个音素的准确性。
# Format: <phone> <frame-count> <percent-correct>
UW0_I 28 19.58%
AH2_B 2 25.00%
AO0_B 18 26.47%
AW2_I 30 30.30%
AA1_S 16 38.10%
phone_subs.txt:显示两个音素被误认为的频率。沉默令牌SIL通常非常重要。
#Format: <phone1> <phone2> <num-frames> <prob-wrong%> <reverse-prob-wrong%>
# <num-frames> is the number of frames that were labeled <phone1> in the first
# set of alignments and <phone2> in the second.
# <prob-wrong> is <num-frames> divided by the smaller of the total num-frames of
# phone1 or phone2, whichever is smaller; expressed as a percentage.
#<reverse-prob-wrong> is the same but for the reverse substitution, from
#<phone2> to <phone1>; the comparison with <prob-wrong> the substitutions are).
SIL IH1_B 7773 14.25% 1.27%
SIL AH0_B 4844 20.95% 1.35%
SIL K_E 5426 16.17% 2.38%
SIL DH_E 2465 31.04% 1.13%
word_stats.txt:显示转录单词的准确性(多个音素)。
# Word stats. Format:
<proportion-of-wrong-frames> <num-wrong-frames> <num-correct-frames> <word>
0.176643 64059.5 362650 <eps>
0.105527 9247 87627 IS
0.221541 3793 17121 AND
0.212678 2125.5 9994 A
你的任务是在你训练的最好的单音素模型上建立最好的三音素模型。在背面,记录您构建的每个渐进模型的策略、WER 和对齐分析。一些需要考虑的问题:
使用更强大的三音素模型会提高性能吗?
比较您尝试过的不同设置的准确性。
描述您可能已经注意到的关于对齐质量的任何其他观察结果。将屏幕截图添加到 writeup!
通过比较对齐来讨论您观察到的任何模式。
在步骤 3.3 中,您在单声道模型之上执行了一个迭代阶段。对于越来越复杂的模型,您可以根据需要多次执行此操作。工业级 Kaldi 配方精心串起一长串模型。
为了探索这一点,我们将在您的最佳三音素模型之上拟合具有 LDA 和 MLLT 特征变换的 ASR 模型。
##背景
LDA或潜在狄利克雷分配,是一种广泛使用的聚类统计模型。LDA 模型有两组潜在变量:一组代表K主题之一,而另一组代表V单词/音素之一。训练这些潜在变量以使观察到的数据集尽可能有可能。
MLLT,最大似然线性变换,是一种学习的线性运算,具有每个时间步长的系数。通过最大化训练数据集的对数似然来拟合参数。有关更多详细信息,请参阅文档。
LDA-MLLT:可以在 LDA 特征(即潜在变量)之上学习 MLLT。
Kaldi 也有一个 bash 脚本来适应 LDA-MLLT 模型:
steps/train_lda_mllt.sh --cmd "$train_cmd" \
<N_HMM> <N_GAUSSIAN> data/train data/lang exp/tri_ali exp/tri_lda
首先选择<N_HMM>3500 和<N_GAUSSIAN>20,000。此命令将填充一个新目录exp/tri_lda。
对齐 LDA-MLLT 三音素需要一种特殊的算法:特征空间最大似然线性回归,或 FMLLR。代替steps/align_si.sh,使用以下内容:
steps/align_fmllr.sh --cmd "$train_cmd" data/train data/lang exp/tri_lda exp/tri_lda_ali
同样,您的任务是在recipe.sh您的最佳三音素模型之上构建您可以使用的最佳 LDA-MLLT 配方。像上面一样,在背面记录您的策略、WER 和对齐分析。请尽可能具有描述性:使用compare_alignments脚本并在文章中包含示例或屏幕截图。
##任务 3.4.2:你的第四个 Kaldi 模型(7 分)
我们使用说话人自适应训练 (SAT) 在 LDA-MLLT 模型之上拟合第四个(也是最后一个)模型。这种方法的目标是抽象出说话者之间的音频差异,以便转录更容易。
拟合 SAT 模型:
steps/train_sat.sh --cmd "$train_cmd" \
4200 40000 data/train data/lang exp/tri_lda_ali exp/tri_lda_sat
此命令将填充一个新目录exp/tri_lda_sat。
我们使用 FMLLR 来对齐 SAT 三音素。
steps/align_fmllr.sh --cmd "$train_cmd" \
data/train data/lang exp/tri_lda_sat exp/tri_lda_sat_ali
同样,您的任务是在recipe.sh您的最佳lda模型之上构建您可以使用的最佳 SAT 配方。在背面记录您的观察和分析。
##步骤 3.5:语言模型评分(15 分)
使 ASR 模型转录更加真实的一个流行技巧是使用语言模型偏置解码。也就是说,给定一个已知转录的语料库,如果我们试图将波形转录成文本,我们不应该生成与语料库内容非常“不同”的文本。
为此,Kaldi 让我们训练一个 N-gram 语言模型,以对给定固定内容的下一个转录音素或单词的概率进行评分,例如p_lm(x_5 | x_4, x_3, x_2)(3-gram 语言模型)。
假设 ASR 模型对第 5 个令牌进行预测p_asr(x_5 | x_1, ..., x_5)。我们可以不直接使用它来解码,而是执行以下操作:
p_asr(x_5 | x_1, ..., x_5) * p_lm(x_5 | x_4, x_3, x_2) / Z
where Z = sum(p_asr(x_5|...) * p_lm(x_5|...))
x_5在语言模型下,这增加了更可能的选择。
##任务 3.5.1:准备语言模型(2分)
为了在 Kaldi 中训练三元组,我们将使用一个名为srilm.
我们已经在 Myth 上安装了它。如果您正确编辑了您的~/.bash_profile,您应该能够访问其二进制文件。检查以下各项:
ngram-count -help
假设工作正常,我们可以按如下方式训练三元组:
mkdir data/local/srilm
ngram-count -order 3 -write-vocab data/local/srilm/vocab-full.txt -wbdiscount -text data/corpus/corpus.txt -lm data/local/srilm/lm.arpa
arpa2fst --disambig-symbol=#0 --read-symbol-table=data/lang/words.txt data/local/srilm/lm.arpa data/lang/G.fst
这将创建一个来自三元模型的概率查找表。对于有限词汇表,可以手动枚举这些。
# data/local/srilm/lm.arpa
\data\
ngram 1=1447
ngram 2=8987
ngram 3=5684
\1-grams:
-4.38141 'BOUT -0.3008405
-4.858531 'EM -0.3010149
-4.256471 'TIL -0.6061357
-1.012504 </s>
-4.045618 <UNK> -0.2854705
-99 <s> -1.130832
-1.751321 A -1.221856
-3.904289 ABLE -1.247691
-3.77935 ABOUT -0.3080984
-4.858531 ABOVE -0.2880712
最后,我们可以验证语言模型是否正确设置
utils/validate_lang.pl --skip-determinization-check data/lang
##任务 3.5.2: 用语言模型重新评分(2 分)
训练完语言模型后,我们现在使用它进行解码。
回忆第 3.2.3 步,我们通过调用 来解码一个训练好的模型steps/decode.sh。
紧接着,我们调用第二个二进制文件来使用我们的语言模型对解码的概率进行重新评分。这将覆盖exp/tri_lda_sat/decode.
cp -r data/lang data/lang_lm_3gram
steps/lmrescore.sh --cmd "$decode_cmd" data/lang data/lang_lm_3gram data/test exp/tri_lda/decode exp/tri_lda/decode_lm_3gram
将上面的命令添加到recipe.sh. 使用步骤 3.4.2 中的最佳 SAT 模型,使用 3-gram 语言模型对其解码的概率格重新评分。
注意:这将创建一个新的实验目录:decode_lm_3gram. 通常,将您的实验分开并正确命名您的文件夹很重要。这将大大改善您使用 Kaldi 的体验。
完成此操作后,记录对 WER 或对齐质量的任何更改。使用compare_alignments二进制(如在任务 3.3.3 中)来比较是否重新评分。总结您的发现并在背面提供具体示例。
##任务 3.5.3: 尝试不同的语言模型(2 分)
我们任意选择使用 3-gram 语言模型。尝试构建一些不同的语言模型(例如,bi-gram 或 4-gram)并报告性能差异。再次注意目录,不要覆盖现有的实验。
在文章中,请报告您尝试的每个变体的测试集 WER。
##任务 3.5.4:使用更大的语料库(9 分)
到目前为止,我们已经在 HarperValleyBank 语料库上训练了我们所有的语言模型。这种方法的好处是语言模型将涵盖与银行员工在词汇、对话流等方面交谈的特质。 然而,这种方法的弱点是 HarperValleyBank 数据集非常小,因此较大的 n-gram都会看起来独一无二。因此,我们可能无法正确训练更大的语言模型(例如 4-gram)。
在这里,我们将尝试测试使用在更大的人类语音集上训练的语言模型是否有助于性能。我们将使用Librispeech 语料库,其中包含 1000 小时的有声读物阅读英语演讲。
(注意:需要说明的是,我们仍然使用在 HarperValleyBank 上训练的 SAT 模型。Librispeech 语料库仅用于重新加权模型概率。)
Librispeech LM 可在此处公开获得。我们已经下载4-gram.arpa.gz并将其放入/afs/ir/class/cs224s/librispeech/lm.
在 Kaldi 中加载语言模型:
mkdir data/lang_librispeech
utils/build_const_arpa_lm.sh /afs/ir/class/cs224s/librispeech/lm/4-gram.arpa.gz data/lang data/lang_librispeech
现在,在使用您最好的 SAT 模型解码后,我们可以使用以下命令重新评分:
cp -r data/lang data/lang_lm_librispeech
steps/lmrescore_const_arpa.sh --cmd "$decode_cmd" data/lang data/lang_librispeech data/test exp/tri_lda/decode exp/tri_lda_sat_lm_librispeech/decode
这与lmrescore.sh您在上面使用的非常相似。由于 Librispeech LM 非常大,因此以特殊的压缩格式存储。该二进制文件被硬编码为该格式。
将此重新评分与之前的重新评分方法进行比较。拥有更大的语言模型有帮助吗?如果不是,那可能是为什么?
在文章中记录您的分析、WER 和示例对齐方式。将对齐质量与使用任务 3.5.3 中的最佳语言模型进行比较。