56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
|
|
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()
|
|||
|
|
}
|