我正在尝试使用pocketsphinx(。语法非常简单,例如:
public <grammar> = (Matt, Anna, Tom, Christine)+ (One | Two | Three | Four | Five | Six | Seven | Eight | Nine | Zero)+ ;
例如:
Tom Anna Three Three
产量
Tom Anna 33
我调整了声学模型(考虑到我的外国口音),之后我获得了不错的表现(准确率约为 94%)。我使用了约 3 分钟的训练数据集。现在我正试图做同样的事情,但通过对着麦克风耳语。在没有训练的情况下,准确率显着下降到约 50%。通过口音训练,我得到了约 60%。我尝试了其他想法,包括去噪和提高音量。我阅读了整个文档,但想知道是否有人可以回答一些问题,以便我可以更好地了解我应该在哪个方向上提高性能。
1) 在教程中,您正在调整 hub4wsj_sc_8k 声学模型。我猜“8k”是一个采样参数。使用 sphinx_fe 时,您使用“-samprate 16000”。是否故意使用 16k 采样率的数据来训练 8k 模型?为什么没有使用 8k 采样的数据?对性能有影响吗?
2) 在 sphinx 4.1 中(与 pocketsphinx 相比)有不同的声学模型,例如 WSJ_8gau_13dCep_16k_40mel_130Hz_6800Hz.jar。这些模型可以与pocketsphinx一起使用吗?具有 16k 采样率的声学模型通常会在具有 16k 采样率的数据中具有更好的性能吗?
3)当使用数据进行训练时,我应该使用普通口语模式(仅适应我的口音)还是低语模式(适应耳语和我的口音)?我想我尝试了这两种情况,并没有注意到任何差异来得出任何结论,但我不知道袖珍狮身人面像的内部结构,所以我可能做错了什么。
4) 我使用下面的脚本来记录适应教程中的训练和测试数据:
for i in `seq 1 20`; do
fn=`printf arctic_%04d $i`;
read sent; echo $sent;
rec -r 16000 -e signed-integer -b 16 -c 1 $fn.wav 2>/dev/null;
done < arctic20.txt
我注意到每次我按下 Control-C 时,这个按键在录制的音频中都是不同的,这会导致错误。有时修剪音频有助于纠正或导致其他错误。有没有要求每个录音在说话前后都有几秒钟的相当?
5)当累积观察计数时,我可以修改任何设置以提高性能吗?
6)半连续和连续模型有什么区别?pocketsphinx 可以使用连续模型吗?
7) 我注意到 sphinx4 中的“mixture_weights”文件与您在 pocketsphinx-extra 中获得的文件相比要小得多。它有什么不同吗?
8)我尝试了不同的去除白噪声的组合(使用'sox'工具包,例如sox noise.wav filtered.wav noisered profile.nfo 0.1)。根据最后一个参数,有时它会有所改善(~3%),有时会变得更糟。消除噪音是好事还是pocketsphinx也这样做?我的环境很安静,只有白噪声,我猜当音频录制耳语时可以有更多的声音。
9)我注意到大多数时候单独提高音量(增益)只会使性能稍微变差,尽管对于人类来说更容易区分单词。我应该避免吗?
10) 总的来说,我尝试了不同的组合,我得到的最好结果是仅去除噪声时约为 65%,因此只有轻微的 (5%) 改进。以下是一些统计数据:
//ORIGNAL UNPROCESSED TESTING FILES
TOTAL Words: 111 Correct: 72 Errors: 43
TOTAL Percent correct = 64.86% Error = 38.74% Accuracy = 61.26%
TOTAL Insertions: 4 Deletions: 13 Substitutions: 26
//DENOISED + VOLUME UP
TOTAL Words: 111 Correct: 76 Errors: 42
TOTAL Percent correct = 68.47% Error = 37.84% Accuracy = 62.16%
TOTAL Insertions: 7 Deletions: 4 Substitutions: 31
//VOLUME UP
TOTAL Words: 111 Correct: 69 Errors: 47
TOTAL Percent correct = 62.16% Error = 42.34% Accuracy = 57.66%
TOTAL Insertions: 5 Deletions: 12 Substitutions: 30
//DENOISE, threshold 0.1
TOTAL Words: 111 Correct: 77 Errors: 41
TOTAL Percent correct = 69.37% Error = 36.94% Accuracy = 63.06%
TOTAL Insertions: 7 Deletions: 3 Substitutions: 31
//DENOISE, threshold 0.21
TOTAL Words: 111 Correct: 80 Errors: 38
TOTAL Percent correct = 72.07% Error = 34.23% Accuracy = 65.77%
TOTAL Insertions: 7 Deletions: 3 Substitutions: 28
我所做的那些处理只是为了测试数据。是否应该以相同的方式处理训练数据?我想我试过了,但几乎没有任何区别。
11) 在所有这些测试中,我使用了 ARPA 语言模型。当使用 JGSF 结果通常更糟(我有最新的 pocketsphinx 分支)。这是为什么?
12)因为每个句子的最大数量是'999'并且不超过3个名字,我修改了JSGF并通过手动重复括号中的内容来替换重复符号'+'。这一次的结果更接近 ARPA。语法中有没有办法像正则表达式一样告诉最大重复次数?
13)当使用 ARPA 模型时,我使用所有可能的组合生成它(因为字典是固定的并且非常小:~15 个单词),但随后测试我仍然有时会收到非法结果,例如 Tom Anna(没有任何必需的数字)。有没有办法使用 ARPA 模型来强制执行某些结构?
14) 字典是否应该仅限于大约 15 个单词,或者只是完整的字典只会影响速度而不影响性能?
15) 修改字典(音素)是提高耳语识别率的方法吗?(我不是专家,但当我们耳语时,我猜有些词可能听起来不同?)
16) 任何其他提高准确性的技巧都会非常有帮助!