【发布时间】:2012-07-30 14:03:01
【问题描述】:
我正在尝试使用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) 在使用数据进行训练时,我应该使用普通口语模式(仅适应我的口音)还是耳语模式(适应耳语和我的口音)?我想我尝试了这两种情况,并没有发现任何差异来得出任何结论,但我不知道 Pocketsphinx 的内部结构,所以我可能做错了什么。
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 个单词),但随后测试我仍然收到有时非法的结果,例如汤姆安娜(无需任何号码)。有没有办法使用 ARPA 模型来强制执行某些结构?
14) 字典是否应该仅限于这大约 15 个单词,或者只是完整的字典只会影响速度而不影响性能?
15) 修改字典(音素)是提高耳语识别的方法吗? (我不是专家,但当我们耳语时,我猜有些词听起来可能不同?)
16) 任何其他提高准确性的技巧都会非常有帮助!
【问题讨论】:
标签: voice-recognition cmusphinx