Google Cloud Speech-to-text不同麦克风下韩语识别不返回isFinal=true问题
问题分析与解决方案
问题核心
使用Node.js + Google Cloud Speech-to-Text + node-record-lpcm16(sox录音器)时,仅在**AirPods Pro + 韩语(ko-KR)**组合下无法返回isFinal: true的识别结果,其他组合(内置麦克风+韩语、AirPods Pro+英语)均正常。
可能原因
- AirPods Pro默认双声道输出,韩语语音断句检测对单声道音频的兼容性更好
- 韩语模型对音频信噪比、静音时长的判断逻辑与英语不同,AirPods的音频输入特性触发了检测异常
- sox录音参数未适配AirPods的硬件特性
具体解决方案
1. 强制录制单声道音频
修改node-record-lpcm16的配置,强制使用单声道录制,匹配Google Speech-to-Text的最优输入格式:
let recording = record .record({ sampleRate: 16000, threshold: 0, recordProgram: 'sox', channels: 1, // 新增:强制单声道录制 });
2. 优化Google Speech配置
调整韩语识别的参数,启用自动标点、更换更适合短句的模型,辅助断句检测:
const request = { config: { encoding: 'LINEAR16', sampleRateHertz: 16000, languageCode: 'ko-KR', enableAutomaticPunctuation: true, // 启用自动标点帮助断句 model: 'command_and_search', // 切换为更适合短句的识别模型 // 可选:添加常用韩语短语,提升识别精度与断句准确性 speechContexts: [{ phrases: ['안녕하세요', '감사합니다', '네', '아니요'] }] }, interimResults: true, };
3. 指定AirPods为录音设备
通过sox -L命令查看系统音频设备列表,找到AirPods的设备名称,在配置中指定,避免sox自动选择设备导致的参数不匹配:
let recording = record .record({ sampleRate: 16000, threshold: 0, recordProgram: 'sox', channels: 1, device: 'AirPods Pro', // 替换为你的AirPods实际设备名 });
4. 手动监测静音触发停止录制
如果以上方法无效,可在代码中添加静音监测逻辑,当检测到超过设定时长的静音时,主动停止录制,强制Google返回最终结果:
// 在startListening函数内新增变量 let lastAudioTime = Date.now(); const SILENCE_THRESHOLD = 1500; // 1.5秒静音后停止 let silenceTimeout; // 修改recording.stream的data事件处理 recording.stream() .on('data', buf => { totalSize += buf.length; lastAudioTime = Date.now(); // 更新最后有音频输入的时间 if (!expireTime) { // 原有初始化逻辑... }; // 新增静音监测 if (!stopped) { clearTimeout(silenceTimeout); silenceTimeout = setTimeout(() => { recording.stop(); console.log('[speech] Stop (silence detected)'); stopped = true; }, SILENCE_THRESHOLD); } }) // 修改stop函数,清除静音定时器 return { stop() { clearTimeout(stopTimeout); clearTimeout(silenceTimeout); // 新增 if (!stopped) { recording.stop(); console.log('[speech] Stop (user)'); stopped = true; } } };
内容的提问来源于stack exchange,提问作者devonnuri
相关产品推荐
相关产品推荐

