Ask which language the content is written in
The Instruction agent now confirms the output language before the plan is
ready: Bahasa Indonesia, English or 中文, the languages the engine writes
in. It can also be named in the instruction ("pakai bahasa Inggris"), is
read from short replies, and can be changed in the plan. Research alone
is not asked about.
The engine's content production has no language field, so the choice
goes into the agent's instructions; video schedules also set
video_options.language. ruleOf reads it back, so editing a topic keeps
it. The audio player recognises Chinese scripts and uses a zh-CN voice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -11,7 +11,8 @@ export function sentencesOf(text: string): string[] {
|
||||
return text
|
||||
.replace(/^\s*(?:#{1,6}|[-*•>]|\d+[.)])\s+/gm, '') // headings, bullets, numbered items, quotes
|
||||
.replace(/[*_`]+/g, '')
|
||||
.split(/(?<=[.!?…])\s+|\n+/)
|
||||
// Chinese ends sentences with 。!? and no space after them.
|
||||
.split(/(?<=[.!?…])\s+|(?<=[。!?])|\n+/)
|
||||
.map(s => s.replace(/\s+/g, ' ').trim())
|
||||
.filter(s => /\p{L}/u.test(s))
|
||||
}
|
||||
@@ -19,7 +20,12 @@ export function sentencesOf(text: string): string[] {
|
||||
// The script's language decides the voice; the UI language may differ from the content's.
|
||||
const ID_WORDS = /\b(yang|dan|dengan|untuk|adalah|ini|itu|kita|anda|tidak|dalam|akan|bisa|dari)\b/gi
|
||||
const EN_WORDS = /\b(the|and|with|for|is|this|that|we|you|not|in|will|can|from)\b/gi
|
||||
export const scriptLang = (text: string) => ((text.match(ID_WORDS)?.length ?? 0) > (text.match(EN_WORDS)?.length ?? 0) ? 'id' : 'en')
|
||||
// Chinese has no spaces, so it is told apart by its characters before the word counts.
|
||||
export function scriptLang(text: string): 'id' | 'en' | 'zh' {
|
||||
if ((text.match(/\p{Script=Han}/gu)?.length ?? 0) > (text.match(/[a-z]/gi)?.length ?? 0)) return 'zh'
|
||||
return (text.match(ID_WORDS)?.length ?? 0) > (text.match(EN_WORDS)?.length ?? 0) ? 'id' : 'en'
|
||||
}
|
||||
const SPEECH_LANG = { id: 'id-ID', en: 'en-US', zh: 'zh-CN' }
|
||||
|
||||
const supported = typeof window !== 'undefined' && 'speechSynthesis' in window
|
||||
|
||||
@@ -44,7 +50,7 @@ export function AudioPlayer({ title, text }: { title: string; text: string }) {
|
||||
at.current = i
|
||||
setIndex(i)
|
||||
const u = new SpeechSynthesisUtterance(sentences[i])
|
||||
u.lang = lang === 'id' ? 'id-ID' : 'en-US'
|
||||
u.lang = SPEECH_LANG[lang]
|
||||
u.voice = voice()
|
||||
u.rate = rate
|
||||
u.onend = () => { if (playing.current && current.current === u) speak(at.current + 1) }
|
||||
|
||||
Reference in New Issue
Block a user