问题描述
在听觉设置页面中,点击主「开始监测」按钮后,麦克风有拾音,但始终不会触发对 Whisper 网关的 POST 请求,转录功能完全无反应。
而同一页面中的「Speech-to-Text Test」功能可以正常使用(点击 Start → 说话 → Stop → 成功 POST 到 Whisper 网关并返回结果)。
版本信息
- AIRI v0.10.2(Windows x64)
- 同样存在于 v0.9.0
复现步骤
- 打开设置 → 听觉
- 选择正确的麦克风设备和转录 Provider(如 OpenAI-compatible / Whisper)
- 点击主「开始监测」按钮 → 指示灯正常,音量条有跳动
- 说话 → 没有 POST 请求发送到 Whisper 网关
- 切换到下方「Speech-to-Text Test」区域
- 点击 Start → 说话 → 点击 Stop → 成功发出 POST 请求并返回转录结果
根因分析(阅读源码后)
主监测流程的调用链是:
开始监测 → setupAudioMonitoring() → startStream() → initVAD() → startVAD(stream) → VAD 检测到语音 → onSpeechStart → handleSpeechStart() → transcribeForMediaStream() → POST 到 Whisper
而 STT Test 的调用链是:
Start Test → startStream() → startRecord() → Stop → transcribeForRecording() → POST 到 Whisper
关键差异:
- 主监测必须经过
initVAD() 初始化语音活动检测模型(HuggingFace 上的 onnx-community/silero-vad,~16MB ONNX 模型)
- 只有 VAD 的
onSpeechStart 回调才会触发 handleSpeechStart(),进而调用 transcribeForMediaStream()
- 如果 VAD 模型加载失败(国内网络无法访问 HuggingFace、超时、CORS 问题),
initVAD() 抛出异常,整个监测流程静默失败
- 即使关闭「Model Based」切换到音量检测模式,
isSpeechVolume 也仅仅用于显示指示灯,不会触发 transcribeForMediaStream()
STT Test 不依赖 VAD,直接录音后调用 transcribeForRecording(),因此正常工作。
建议修复方向
- 在 VAD 模型加载失败时提供降级方案:fallback 到
transcribeForMediaStream() 并使用音量检测代替 VAD 触发
- 或让音量检测模式也能触发
handleSpeechStart() 或 startRecord()
- 或显示明确的 VAD 加载失败错误信息,而不是静默失败
- 建议将 silero-vad 模型做本地打包或提供离线加载选项,避免依赖在线 HuggingFace 下载
环境
- OS: Windows 10 x64
- AIRI: v0.10.2(v0.9.0 同样存在)
- 转录 Provider: OpenAI-compatible (Whisper)
问题描述
在听觉设置页面中,点击主「开始监测」按钮后,麦克风有拾音,但始终不会触发对 Whisper 网关的 POST 请求,转录功能完全无反应。
而同一页面中的「Speech-to-Text Test」功能可以正常使用(点击 Start → 说话 → Stop → 成功 POST 到 Whisper 网关并返回结果)。
版本信息
复现步骤
根因分析(阅读源码后)
主监测流程的调用链是:
开始监测 → setupAudioMonitoring() → startStream() → initVAD() → startVAD(stream) → VAD 检测到语音 → onSpeechStart → handleSpeechStart() → transcribeForMediaStream() → POST 到 Whisper而 STT Test 的调用链是:
Start Test → startStream() → startRecord() → Stop → transcribeForRecording() → POST 到 Whisper关键差异:
initVAD()初始化语音活动检测模型(HuggingFace 上的onnx-community/silero-vad,~16MB ONNX 模型)onSpeechStart回调才会触发handleSpeechStart(),进而调用transcribeForMediaStream()initVAD()抛出异常,整个监测流程静默失败isSpeechVolume也仅仅用于显示指示灯,不会触发transcribeForMediaStream()STT Test 不依赖 VAD,直接录音后调用
transcribeForRecording(),因此正常工作。建议修复方向
transcribeForMediaStream()并使用音量检测代替 VAD 触发handleSpeechStart()或startRecord()环境