diff --git a/web-ui/voice-call.js b/web-ui/voice-call.js index 75a56fb..0415588 100644 --- a/web-ui/voice-call.js +++ b/web-ui/voice-call.js @@ -239,6 +239,18 @@ case 'error': console.warn('[voice-call] engine error:', msg.message); + // The failed request may have been the one holding ttsBusy — without + // resetting it here, pumpTtsQueue() early-returns forever and the + // call goes silent for the rest of the session. + if (!msg.id || msg.id === currentTtsId) { + ttsBusy = false; + currentTtsId = null; + pumpTtsQueue(); + if (ttsQueue.length === 0) { + state = 'listening'; + setStatus('듣는 중…'); + } + } break; } } @@ -269,6 +281,10 @@ // remaining table rows: "| a | b |" -> "a, b" so cells read as a list .replace(/^\s*\|(.+)\|\s*$/gm, (_m, row) => row.split('|').map((c) => c.trim()).filter(Boolean).join(', ')) .replace(/https?:\/\/\S+/g, ' ') + // OmniVoice chokes on a bare "(" — especially Hangul-adjacent, e.g. + // "영웅(Heroic)" — and stops generating audio entirely instead of just + // mispronouncing it. Drop the parens but keep their contents. + .replace(/[()()]/g, ' ') .replace(/^\s{0,3}#{1,6}\s+/gm, '') .replace(/^\s*[-*+]\s+/gm, '') .replace(/^\s*>\s?/gm, '')