- 实现 Orchestrator 接口(4.1) - 实现 Sender 接口(4.2) - 实现 STT → LLM → TTS 流式并行管道(4.3) - 实现句子切分器(4.4) - 实现错误降级处理(4.5) - 实现 Interrupt 支持(4.6) - 编写完整的单元测试(4.7)
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()
|
||
}
|