diff --git a/frontend/src/hooks/useVisionSession.ts b/frontend/src/hooks/useVisionSession.ts index 0bdab7c..a2ba760 100644 --- a/frontend/src/hooks/useVisionSession.ts +++ b/frontend/src/hooks/useVisionSession.ts @@ -158,6 +158,10 @@ export function useVisionSession() { return; } + // 停止上一轮的 TTS 播放,防止新旧音频重叠 + ttsPlayerRef.current?.stop(); + setIsAudioPlaying(false); + const frame = captureFrame(); if (!frame) { console.warn("[Session] 无法捕获图像帧"); diff --git a/frontend/src/lib/ttsPlayer.ts b/frontend/src/lib/ttsPlayer.ts index a7f283f..3228b12 100644 --- a/frontend/src/lib/ttsPlayer.ts +++ b/frontend/src/lib/ttsPlayer.ts @@ -47,6 +47,19 @@ export class TTSPlayer { this._isPlaying = false; } + /** + * 停止当前正在播放的音频(不清空 chunks) + * 用于 play() 开始前,防止新旧音频重叠 + */ + private stopCurrentAudio(): void { + if (this.audio) { + this.audio.pause(); + this.audio.removeAttribute("src"); + this.audio = null; + } + this._isPlaying = false; + } + /** 暂停播放 */ pause(): void { this.audio?.pause(); @@ -61,6 +74,9 @@ export class TTSPlayer { private play(mimeType: string): void { if (this.chunks.length === 0) return; + // 停止当前正在播放的音频,防止重叠 + this.stopCurrentAudio(); + // 拼接所有 Base64 片段 const combined = this.chunks.join(""); this.chunks = [];