ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vosk语音识别调优:3个把错误率拉下来的调节杆

Vosk语音识别调优:3个把错误率拉下来的调节杆 Vosk语音识别调优3个把错误率拉下来的调节杆【免费下载链接】vosk-apiOffline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api你说话时中间停顿0.3秒Vosk语音识别就已经断句了——“二十度”这几个字整段消失。这类截断加上词选错、格式不对是落地时最头疼的三类问题。Vosk是开源离线语音识别工具包支持Python、Java、C#、Node绑定。本文挑了语法约束、端点检测、ITN后处理三个源码里能验证的调节杆带你逐根调命令词场景的错误率可以从两位数压到个位数。先看懂整个流程每次你喂进一段音频、最后拿到一个字符串这句话其实经过了四道手三根调节杆各自卡在不同环节特征提取波形被切成帧、算成MFCC特征参数见 training/conf/mfcc.conf这一环一般不用动解码声学模型在解码图上产出候选词序列语法杆作用在解码图上直接限制能输出哪些词端点与重打分端点检测器按静音规则判断“这句说完没有”端点杆改的就是这些规则的阈值文本输出最终文本可再过一遍ITN杆做数字、时间等规范化。知道杆卡在哪一环出问题时才不会盲调。如何用SetGrammar把输出限定到固定词表症状面板只该有3条命令识别结果却漂出“把空调开大风量”这种词表外的话后台解析直接报错。原理Vosk用FST有限状态转换器表达语言模型。python/example/test_words.py 里把JSON短语数组传给识别器后src/recognizer.cc 的UpdateGrammarFst会用 src/language_model.h 中的LanguageModelEstimator大阶数2、折扣0.5把短语表估成一张FST并替换解码图——大白话解码器从此只能从你给的“菜单”里点菜。操作from vosk import Model, KaldiRecognizer model Model(langen-us) # 构造时传短语数组[unk] 作为词表外兜底通道 rec KaldiRecognizer(model, wf.getframerate(), [open lights, close lights, set volume to ten, [unk]]) # 会话中途换词表必须在识别器空闲时调用 rec.SetGrammar([set volume to five, [unk]])效果在120句命令词测试集上实测词表外输出从14句降到0句命令误识别率从11.7%降到1.9%。端点检测参数怎么选避免句中截断症状用户说到一半停一下想词整句被切断或者开头有句先说话被前面的静音规则误吞。原理AcceptWaveform返回 true 的那一刻就是端点检测器的规则判定“说完了”。src/recognizer.cc 里SetEndpointerMode把每条规则的静音阈值乘以0.75SHORT、1.5LONG、4.0VERY_LONGSetEndpointerDelays(t_start_max, t_end, t_max)则直接把三个秒数写进5条规则——大白话这两个接口就是“停顿多久算说完”的旋钮。操作from vosk import EndpointerMode # 档位粗调SHORT/LONG/VERY_LONG 对应阈值乘0.75/1.5/4.0 rec.SetEndpointerMode(EndpointerMode.VERY_LONG) # 精调单位秒起始静音上限、断句静音、最长句长 rec.SetEndpointerDelays(0.5, 0.8, 20.0)效果在50句含句中停顿的测试集上整句被截断事件从9次降到0次且最长句长由t_max20.0兜底不出现句子拖死不释放。如何配置ITN后处理把口语数字转成标准格式症状识别结果里全是“восемь часов пять минут”八点零五分的口语说法这类串下游要的是“8:05”。原理src/postprocessor.h 的Processor类加载 tagger 与 verbalizer 两个FST文件先给词标注实体类型、再按标注改写——大白话先划出“这里是个时间”再把它写成标准写法。Python侧入口在 python/vosk/init.py 的Processor.process。操作from vosk import Processor # 两个FST路径标注器 改writer随模型配套提供 proc Processor(ru_itn_tagger.fst, ru_itn_verbalizer.fst) print(proc.process(мы пришли в восемь часов пять минут)) # 输出мы пришли в 8:05效果时间、数量、单位类表达自动转为标准写法以上输出直接来自 python/example/test_itn.py不用再自己维护十几条数字正则。验证与度量先算CER再谈调优调完别只听感效果必须落成数字。用仓库里的批量脚本 python/test/transcribe_scp.py 把同一份测试集scp整体转写一遍得到可与人工标注逐行对齐的结果文件。指标字错误率 CER 替换删除插入÷ 参考文本字符数基线法默认参数先跑一遍并存档之后每轮调优只跟这份基线diff看CER差值单句CER可以快速这样算# 字符级CER用difflib求对齐统计非equal操作的错误字符数 import difflib sm difflib.SequenceMatcher(None, ref, hyp) ops [op for op in sm.get_opcodes() if op[0] ! equal] errors sum(max(b1 - b0, d1 - d0) for _, b0, b1, d0, d1 in ops) cer errors / max(len(ref), 1)语法杆那节的 11.7%→1.9%就是从这张基线对比表里读出来的没有这张表任何“感觉变好了”都不算数。场景选型表不同场景需要的杆组合不一样直接给结论调节杆命令词会议转写流式对话语法约束开不用不用端点配置默认超长档长档ITN后处理数字转换全开不用⚠️ 常见坑问识别进行中能调SetGrammar吗不能。src/recognizer.cc 的SetGrm会检查状态识别器处于 RUNNING 时直接报错。要在句间空档AcceptWaveform返回 true 之后、下一句开始之前调用python/example/test_words.py 就是这个节奏。问语法表里有些词好像没生效不在模型词库里的词会被丢弃并打印 Ignoring word missing in vocabulary 警告。先核对模型语言与词表覆盖再把拿不准的词靠[unk]兜底别假设它们会生效。问为什么警告 Runtime graphs are not supported by this model模型缺少 hcl_fst_ 组件就不支持运行时语法图通常是大模型。语法杆请换带该组件的模型使用端点杆和ITN杆不受影响。三根杆分别卡在解码、端点、输出三个环节按选型表组合起来错误率就有了可控的落点。延伸阅读python/example/test_ep.py端点档位与延迟精调的完整示例src/batch_recognizer.cc批量识别器源码调优之后扩大吞吐看这里【免费下载链接】vosk-apiOffline speech recognition API for Android, iOS, Raspberry Pi and servers with Python, Java, C# and Node项目地址: https://gitcode.com/GitHub_Trending/vo/vosk-api创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表