Files
CamTalk/backend/internal/orchestrator/splitter.go

56 lines
1.1 KiB
Go
Raw Normal View History

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()
}