From 02423b1e6089dbbb07b6dc8ffa95abbeb0715c04 Mon Sep 17 00:00:00 2001 From: PyDevDeep Date: Thu, 2 Jul 2026 13:47:32 +0300 Subject: [PATCH] fix(audio): eliminate echo loopback and handle websocket disconnect --- backend/api/ws_voice.py | 5 +++++ frontend/src/hooks/useVoiceSession.js | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/api/ws_voice.py b/backend/api/ws_voice.py index 6cddd07..cad4d04 100644 --- a/backend/api/ws_voice.py +++ b/backend/api/ws_voice.py @@ -51,6 +51,11 @@ async def client_to_openai() -> None: await openai_client.send_audio_chunk(session_id, message["bytes"]) except WebSocketDisconnect: logger.info("client_disconnected", session_id=session_id) + except RuntimeError as e: + if "Cannot call" in str(e): + logger.info("client_disconnected_abruptly", session_id=session_id) + else: + logger.error("client_to_openai_error", error=str(e)) except Exception as e: logger.error("client_to_openai_error", error=str(e)) diff --git a/frontend/src/hooks/useVoiceSession.js b/frontend/src/hooks/useVoiceSession.js index e4d2512..6952c45 100644 --- a/frontend/src/hooks/useVoiceSession.js +++ b/frontend/src/hooks/useVoiceSession.js @@ -54,7 +54,8 @@ export function useVoiceSession() { source.connect(analyser); analyser.connect(processor); - processor.connect(audioCtx.destination); + // Закоментовано для уникнення відлуння (loopback) мікрофона: + // processor.connect(audioCtx.destination); }; ws.onmessage = async (event) => {