From 7de1bdf82452d4e11e3951169a07dac5ae95b571 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Wed, 30 Apr 2025 15:36:51 +0800 Subject: [PATCH] fix: more robust method to detect language for TTS (#1003) --- apps/readest-app/src/utils/ssml.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/apps/readest-app/src/utils/ssml.ts b/apps/readest-app/src/utils/ssml.ts index 0bbfb774..0ecb25df 100644 --- a/apps/readest-app/src/utils/ssml.ts +++ b/apps/readest-app/src/utils/ssml.ts @@ -57,14 +57,24 @@ export const findSSMLMark = (charIndex: number, marks: TTSMark[]) => { }; export const parseSSMLLang = (ssml: string): string | null => { + let lang = null; const match = ssml.match(/xml:lang\s*=\s*"([^"]+)"/); - if (/[\p{Script=Han}]/u.test(ssml)) { - return 'zh'; - } else if (match && match[1]) { + if (match && match[1]) { const parts = match[1].split('-'); - return parts.length > 1 - ? `${parts[0]!.toLowerCase()}-${parts[1]!.toUpperCase()}` - : parts[0]!.toLowerCase(); + lang = + parts.length > 1 + ? `${parts[0]!.toLowerCase()}-${parts[1]!.toUpperCase()}` + : parts[0]!.toLowerCase(); } - return null; + if (!lang || lang.startsWith('en')) { + if (/[\p{Script=Hangul}]/u.test(ssml)) { + lang = 'ko'; + } else if (/[\p{Script=Hiragana}\p{Script=Katakana}]/u.test(ssml)) { + lang = 'ja'; + } else if (/[\p{Script=Han}]/u.test(ssml)) { + lang = 'zh'; + } + } + + return lang; };