如何在AssemblyAi实时转录中可靠检测2秒及以上语音停顿?
可靠检测AssemblyAI实时转录中2秒以上语音停顿的方案
当前实现的缺陷
仅依赖finalTranscript的audio_start和audio_end计算停顿的逻辑存在以下问题:
finalTranscript是经过AssemblyAI合并、修正后的结果,相邻短语音片段会被合并,中间的短停顿会被“忽略”,导致两个finalTranscript之间的时间间隔无法准确反映实际停顿时长。- 实时转录过程中,
finalTranscript输出存在延迟,中间会产生多个partialTranscript,仅跟踪finalTranscript会丢失连续时间节点,导致接近2秒的短停顿检测误差增大。
优化方案
方案1:结合Partial Transcript跟踪连续时间线
partialTranscript是实时流回的中间转录结果,时间戳更连续,能反映每一段语音的精确起止时间。通过跟踪所有partialTranscript和finalTranscript的时间戳,计算相邻转录结果的时间间隔,可准确检测停顿。
示例代码:
// 维护最近一次有效转录(partial或final)的结束时间戳 let lastTranscriptEnd = null; const PAUSE_THRESHOLD = 2000; socket.on('message', (message) => { const transcript = JSON.parse(message); // 处理所有包含转录内容的消息(partial或final) if (transcript.partial_transcript || transcript.final_transcript) { const currentAudioStart = transcript.audio_start; if (lastTranscriptEnd !== null) { const pauseDuration = currentAudioStart - lastTranscriptEnd; if (pauseDuration >= PAUSE_THRESHOLD) { console.log("pause greater than 2 seconds detected"); } } // 更新最近的转录结束时间 lastTranscriptEnd = transcript.audio_end; } });
方案2:基于无转录反馈的定时器检测
当用户停止说话后,AssemblyAI会停止返回任何partial或final转录结果。通过设置定时器,若超过阈值时长未收到转录消息,即可判定为停顿。这种方式直接对应沉默的实际时长,准确性更高。
示例代码:
let pauseTimer = null; const PAUSE_THRESHOLD = 2000; // 启动停顿检测定时器 const startPauseTimer = () => { if (pauseTimer) clearTimeout(pauseTimer); pauseTimer = setTimeout(() => { console.log("pause greater than 2 seconds detected"); pauseTimer = null; }, PAUSE_THRESHOLD); }; socket.on('message', (message) => { const transcript = JSON.parse(message); // 收到任何转录消息,重置定时器 if (transcript.partial_transcript || transcript.final_transcript) { startPauseTimer(); } }); // 音频流启动时初始化定时器(可选,根据业务场景调整) startPauseTimer();
方案3:双逻辑互补检测
将上述两种方案结合,既跟踪转录结果的时间间隔,又通过定时器检测无反馈的沉默时段,进一步提升检测的稳定性和准确性。
内容的提问来源于stack exchange,提问作者Mohammed Mehdi
相关产品推荐
相关产品推荐

