diff --git a/tts_bridge.js b/tts_bridge.js index 22db2c3..bfaadd6 100644 --- a/tts_bridge.js +++ b/tts_bridge.js @@ -189,9 +189,13 @@ function spellWord(word) { } // ── English punctuation → Japanese pause equivalents ────────────────── +// Characters AquesTalk1 can safely pronounce (kana + limited punctuation). +// Anything else (!「」・  etc.) is collapsed to a 、 pause in synthesize(). +const AQTK_SAFE_RE = /[\u3040-\u309F\u30A0-\u30FF\uFF65-\uFF9F\u3001\u3002\uFF1F\u301C\u30FC\u309B\u309C]/; + const PUNCT_MAP = { - ",": "、", ".": "。", "!": "!", "?": "?", - ",": "、", "。": "。", "!": "!", "?": "?", + ",": "、", ".": "。", "!": "、", "?": "?", + ",": "、", "。": "。", "!": "、", "?": "?", " ": "、", // AquesTalk truncates on space; use 、 pause instead }; @@ -269,6 +273,14 @@ function synthesize(kanaText) { // Collapse consecutive pauses; strip any residual spaces (AquesTalk truncates on space) result = result.replace(/ +/g, "、").replace(/、+/g, "、").replace(/^、|、$/g, ""); + // Replace any remaining chars AquesTalk1 cannot pronounce with a 、 pause + // (covers !「」・  etc. that slipped through from user templates) + let cleaned = ""; + for (const ch of result) { + cleaned += AQTK_SAFE_RE.test(ch) ? ch : "、"; + } + result = cleaned.replace(/、+/g, "、").replace(/^、|、$/g, ""); + console.error(`[bridge] SYNTH IN: ${trimmed}`); console.error(`[bridge] SYNTH OUT: ${result}`);