Google语音转文本识别单数字异常:单次发音无法识别求助
问题分析
当前代码启用了continuous: true和interimResults: true,这种配置下识别器会持续监听并返回临时转录结果。但单个数字发音时长极短,识别器会判定输入未完成,因此不会返回有效最终结果;只有重复发音后,累积的语音内容才会触发转录输出。
解决方案
针对短数字识别场景,可通过调整配置、过滤有效结果两种方式解决:
1. 单次识别模式(说完即停)
如果只需识别单次数字发音后自动停止,修改continuous和interimResults为false,让识别器在检测到语音结束后直接返回最终结果:
startListening() { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; const recognition = new SpeechRecognition(); recognition.lang = "en-US"; recognition.interimResults = false; // 关闭临时结果,只返回最终确认内容 recognition.continuous = false; // 关闭连续识别,单次发音后自动停止 recognition.maxAlternatives = 1; // 限定返回1个最优候选结果 recognition.onstart = () => { console.log("Start..."); this.isRecording = true; } recognition.onend = () => { console.log('end') this.isRecording = false; } recognition.onresult = (event) => { const transcript = event.results[0][0].transcript.trim(); console.log("Result:", transcript); // 此处可添加数字转阿拉伯数字等业务逻辑 } recognition.start() }
2. 持续监听模式(不自动停止)
如果需要保持持续监听状态,保留continuous: true,但只处理isFinal为true的最终结果,避免临时结果干扰:
startListening() { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; const recognition = new SpeechRecognition(); recognition.lang = "en-US"; recognition.interimResults = false; // 仅返回最终确认结果 recognition.continuous = true; // 保持持续监听 recognition.maxAlternatives = 1; recognition.onstart = () => { console.log("Start..."); this.isRecording = true; } recognition.onend = () => { console.log('end') this.isRecording = false; // 若需持续监听,可在此处重新调用 recognition.start() // recognition.start(); } recognition.onresult = (event) => { // 遍历结果集,仅处理标记为最终结果的内容 for (let i = event.resultIndex; i < event.results.length; i++) { if (event.results[i].isFinal) { const transcript = event.results[i][0].transcript.trim(); console.log("Final Result:", transcript); // 处理识别到的数字 } } } recognition.start() }
3. 额外优化:添加数字语法规则
通过限定识别范围,提升短数字的识别准确率。使用JSGF语法定义数字词汇,让识别器优先匹配目标内容:
startListening() { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; const recognition = new SpeechRecognition(); // 定义数字语法规则 const grammar = '#JSGF V1.0; grammar numbers; public <number> = one | two | three | four | five | six | seven | eight | nine | ten;'; const speechRecognitionList = new window.SpeechGrammarList(); speechRecognitionList.addFromString(grammar, 1); // 权重设为1,强制优先匹配 recognition.lang = "en-US"; recognition.grammars = speechRecognitionList; // 绑定语法规则 recognition.interimResults = false; recognition.continuous = false; recognition.maxAlternatives = 1; // 其余生命周期函数同上述示例... }
内容的提问来源于stack exchange,提问作者Teresa Checa
相关产品推荐
相关产品推荐

