package orchestrator import "strings" // sentenceDelimiters 句子分隔符集合。 var sentenceDelimiters = map[rune]bool{ '。': true, '!': true, '?': true, '\n': true, '.': true, '!': true, '?': true, } // Splitter 句子切分器。 // 将流式文本按句子边界切分,发送到 channel 供 TTS 合成。 type Splitter struct { ch chan<- string buffer strings.Builder } // NewSplitter 创建句子切分器。 // ch 用于接收切分后的句子文本。 func NewSplitter(ch chan<- string) *Splitter { return &Splitter{ ch: ch, } } // Feed 输入增量文本,遇到句子分隔符时发送完整句子。 func (s *Splitter) Feed(delta string) { for _, r := range delta { s.buffer.WriteRune(r) if sentenceDelimiters[r] { s.flushBuffer() } } } // Flush 刷新缓冲区中的剩余文本(即使没有句子分隔符)。 func (s *Splitter) Flush() { if s.buffer.Len() > 0 { s.flushBuffer() } } // flushBuffer 将缓冲区内容发送到 channel 并清空。 func (s *Splitter) flushBuffer() { text := strings.TrimSpace(s.buffer.String()) if text != "" { s.ch <- text } s.buffer.Reset() }