精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止全文或局部转载,禁止任何形式的非法使用,侵权必究
希望开发大型的语音识别平台的朋友可以关注此文,也适合初学者对要点进行把握,如果有不会的地方,请找锐英源软件,手机13803810136。本网页先发中文,再发英文,中文是经过锐英源软件手工翻译。
我有一个电影名称和歌曲名称(十亿个)的列表。该列表会定期更新新名称(歌曲和电影名称)。需要从用户话语中识别电影/歌曲名称。是否可以将 Kaldi 用于这样的要求?可以建立开放词汇模型并与 kaldi 一起使用来识别 OOV 单词吗?
声学模型本质上是开放的词汇; 尽管需要更新词典(例如使用 g2p)并重新编译解码图。 使用 Kaldi 绝对是可能的,但它需要对语音识别的工作原理有一定的了解,即对于初学者来说,这可能不是一项合适的任务。
我可以获得我自己的语料库(来自多人的录音和转录)用于声学模型。我可以构建一个只包含(歌曲/电影的)名称的平面语言模型,并不断更新语言模型(G.fst)新名称可用时的名称。那么我可以从新的语言模型和新的词典(包含新名称)重建解码图并使用它吗?对于我的要求,这是一个可行的选择吗?是否可以向我提供有关构建模型的步骤计划的详细信息并将其用于识别?
这个计划是可行的,是的。可能不是构建平面语言模型,而是计算不同电影/歌曲在各种列表中出现的频率的某种概率,并使用这些概率。关于构建模型和使用它们进行识别所涉及的步骤- 您可能可以查看任何示例脚本。我建议使用 Voxforge 或 Librispeech 设置,因为我假设您无权访问 LDC 数据。
我打算用来自 Fisher_english 模型的声学模型进行测试。现在,如果我想识别名称,是否只需在词汇表中添加新名称并使用现有语言模型(名称未出现)生成 HCLG 解码图而不修改语言模型就足够了?
我尝试使用城市名称列表(大约 650 个名称)和上述名称列表的词典(使用 g2p 生成)构建一个小型 unigram 语言模型,并构建 HCLG 解码图。但是使用 Fisher_english 声学模型和生成的 HCLG.fst 进行识别并没有给出预期的结果。
我正在使用以下 cmd :
online2-wav-nnet2-latgen-faster --do-endpointing=false --online=false --config=nnet_a_gpu_online/conf/online_nnet2_decoding.conf --max-active=7000 --beam=15.0 --lattice-beam=6.0 --acoustic-scale=0.1 --word-symbol-table=namelist.txt nnet_a_gpu_online/final.mdl namelist_HCLG.fst "ark:echo utterance-id1 utterance-id1|" "scp:echo utterance-id1 luck.wav|" ark:/dev/null
我打算用来自 Fisher_english 模型的声学模型进行测试。现在
这可能应该有效 -
构建 HCLG时可能出现问题。
如何调试我的 HCLG.fst 中出了什么问题?同时制作 HCLG.fast 树和模型文件也是必需的。在 kaldi-asr.org 树文件中提供的 Fisher 模型不可用,因此使用了来自 voxforge tri3b 模型的树和模型文件。请提供有关调试此问题的一些详细信息。
我想这给了我们答案。树文件不可互换,您需要包含正确的文件。我将不得不修改prepare_online_decoding.sh 脚本以复制树,这将使像您这样的其他人更容易。我刚刚查看了 online-nnet2 训练脚本,看起来它使用了 exp/tri5a 中的树。因此,您应该导航到kaldi-asr.org 上相应上传文件中的该位置并下载该树。
即使在针对fisher的/exp/tri5a的tree和final.mdl重建HCLG.fst之后,我仍然没有得到预期的结果。我正在附加文件以及用于构建 HCLG.fst 的 cmds (cmds.sh)。请检查是否有问题。当我运行以下 cmd 时(lucknow 被记录在 utteranceluck.wav 中)
kaldi-trunk/src/online2bin/online2-wav-nnet2-latgen-faster --do-endpointing=true --online=false --config=newgraph/online_nnet2_decoding.conf --max-active=7000 --beam=15.0 --lattice-beam=6.0 --acoustic-scale=0.1 --word-symbol-table=newgraph/citiwords.txt newgraph/final.mdl newgraph/HCLG.fst 'ark:echo utterance-id1 utterance-id1|' 'scp:echo utterance-id1 luck.wav|' ark:/dev/null
我得到以下输出而不是 LUCKNOW
LOG (online2-wav-nnet2-latgen-faster:ComputeDerivedVars():ivector-extractor.cc:201) Done.
utterance-id1 RAJGARH
为什么它没有被识别为 LUCKNOW?
是“Luck now”还是“laakh nu”或其他什么?字典条目是什么?
字典词条如下:
LUCKNOW l ah kn aw
好的。看起来很近。你需要用字典里的那种语气说话。
但是为什么它完全不同地识别为 RAJGARH 或 RAIPUR。 RAJGARH 和 LUCKNOW 之间没有相似之处吗?
你从哪里得到phones.txt 文件?据我所知,它与http://www.kaldi-asr.org/downloads/build/2/sandbox/online/egs/fisher_english/s5/exp/tri5a/graph/ 中的文件不同。你不能真正混合和匹配这样的文件 - 语音文件是声学模型定义 AFAIK 的一部分。
你应该能够比 RAJGARH 做得更好。出于好奇,我将 luck.wav 上采样到 16kHz,并在其上使用 librispeech nnet2-online 模型(可供下载),结果是“AND NOW”,我认为这更接近。此外,我使用一个 HCLG 图来完成此操作,该图由一个在 14500 本书上训练的非常通用的 3-gram LM 构建,因此使用更小的 LM(如您的),您应该能够正确识别这一点。
您能否提供fisher模型中使用的lexicon.txt和phones.txt的链接,可用于训练g2p模型为我的单词列表生成词典。
你可以在 kaldi-asr.org 浏览它——它将与你下载的模型在同一个上传中,phones.txt 将在 data/lang/ 中,词典将在 data/local/dict/ 之类的地方词典.txt
data/local/dict/lexicon.txt 中的 lexicon.txt 的音素与http://www.kaldi-asr.org/downloads/build/2/sandbox/online/egs/fisher_english/s5/ 中提到的音素不同 exp/tri5a/graph/phones.txt
该版本是在添加词位置依赖信息之前;您可以查看data/local/lang/lexiconp.txt 以获取添加了单词位置依赖信息的示例。在 run.sh 中,您将看到以下命令:
utils/prepare_lang.sh data/local/dict "<unk>" data/local/lang data/lang
我建议的是编辑 data/local/dict/lexicon.txt 来添加你自己的话,然后调用类似
utils/prepare_lang.sh data/local/dict "<unk>" data/local/lang
data/lang_morewords
完成后,验证phones.txt 是否与data/lang/ 中的相同,否则它将与树不兼容。然后使用 data/lang_morewords 构建图形。
非常感谢您的帮助。现在,按照 Dan 的指示,我可以从话语中识别出 LUCKNOW。还要感谢 Vassil 指出phones.txt 问题。
我有一个 20k 独特的印地语单词列表,我有用于构建费舍尔英语声学模型的音素词典。我从上面的 20k个单词创建了一个 unigram 语言模型并构建了解码图(HCLG.fst)。当我尝试使用 Fisher 英语声学模型和上述解码图 (HCLG.fst) 进行识别时,我发现识别准确度不是很好。对于某些单词,识别很好,但对于某些以某些音素开头的单词,结果非常糟糕。1) 使用上述构建的费舍尔英语声学模型和解码图是否有可能达到 95% 以上的准确率?如果可能的话,为了获得超过 95% 的准确度,需要考虑哪些选项进行调整。
2)是否需要为印地语建立一个新的声学模型,并设置新的音素来覆盖语言中的所有声音以获得更好的准确性?
使用一种语言的语音来识别另一种语言不是人们通常会做的事情,我们不希望识别性能非常好。您需要在印地语数据集上进行训练。我不知道一个人是否存在。
我有一些印地语转录的训练数据。我还有一个带有印地语电话机的印地语词典。我已经训练了一个 gmm 声学模型 (tri3b)
steps/train_sat.sh 2000 11000 data/train data/lang exp/tri2b_ali exp/tri3b || exit 1;
utils/mkgraph.sh data/lang exp/tri3b exp/tri3b/graph || exit 1;
现在,当我使用 data/train 和 exp/tri3b 运行 local/online/run_nnet2.sh 时,它在 nnet-combine-fast 阶段失败。
当我检查脚本调试输出时,我发现 num_iters (4) 小于 mix_up_iters (6) 并且 nnets_list [$idx]没有被填充。
请帮助我找到问题的根源。
我在运行 run_nnet2.sh 时附加了屏幕输出(使用 sh -x 表示 train_pnorm_fast.sh)
我将参数 --num-epochs 改为 4,将 --num-hidden-layers 改为 2 并得到了 nnet 模型 final.mdl。获得更好模型的这些参数的理想值是多少?
我正在测试以检查是否可以使用我的训练数据构建深度神经网络模型。我只使用了 2500 条带转录的录音进行声学模型训练。在使用在线解码进行测试时,我得到了一些话语的附近匹配,而大多数是误认。现在我想用 150-200 小时的录音和转录来运行设置。如果我使用 150-200 小时的训练数据构建声学模型,我是否能够获得更好的识别准确率?使用上述训练数据构建神经网络声学模型的推荐硬件配置是什么。
通常在单个服务器上需要多长时间(150-200 小时的训练数据)?
还是建议使用 Grid Engine 设置?
如果有一个理想的值,我们会把它融入到脚本中。这里 http://kaldi.sourceforge.net/dnn2.html有一些调整建议。我建议使用train_pnorm_simple.sh 脚本——在其他脚本中也有一个--num-epochs-final 数字要配置,这可能会造成混淆。
一个重要的诊断是最终的 (train,valid) probs:do
grep LOG exp/your-dir/log/compute_prob_*.final.log
来查看它们。
它们的差异不应超过 20%,或最多 50%;如果更多,那么你的参数太多了。
用于训练 DNN 的数据非常少。
有了这么多数据,您需要 GPU,否则将花费您很长时间(例如至少一周,但取决于您拥有多少个内核)。
我能够使用我们的印地语训练数据构建印地语声学模型。但是我在识别方面面临以下问题:
1)使用印地语词典中的所有单词构建 1-gram 语言模型并构建图(HCLG.fst)。使用内置的声学模型和图形 (HCLG.fst),我观察到的是,对于包含单个单词的话语,识别是不错的。但是如果话语包含多个单词(例如:指环王),那么识别就很差。如何获得多词识别的高精度?
2)当我使用 online-gmm-decode-faster 进行测试时,我发现我必须大声缓慢地说话才能正确进行识别。此外,有时第一次尝试因误认而失败,而第二次尝试则给出正确的认识。可能是什么原因 ?(例如,我想识别 NATWAR。在我第一次尝试使用 NATWAR 时,它给出了错误的结果,而下一次尝试我以与第一次尝试相同的方式使用 NATWAR,它给出了正确的结果。)
请提供一些有关改进多词的信息识别准确度,因为大多数话语将包含 2 到 5 个单词。
未完待续
https://sourceforge.net/p/kaldi/discussion/1355347/thread/33098413/?limit=25&page=0