之前前端 TTSPlayer 攒齐所有音频片段后才播放,导致文字全部显示后才开始语音。 改为后端每句 TTS 发送 is_last: true,前端收到每句即加入播放队列,第一句到达即开始播放。 - 后端 Chunk 结构体新增 Final 字段,区分句子结束和整轮结束 - 前端 TTSPlayer 重写为队列式播放,onended 回调自动衔接下一句 - 同步更新接口文档和测试用例
27 lines
906 B
Go
27 lines
906 B
Go
package tts
|
||
|
||
import "context"
|
||
|
||
// Service 语音合成服务契约。
|
||
type Service interface {
|
||
// SynthesizeStream 流式合成。
|
||
// textStream 接收句子级文本(由 Orchestrator 的句子切分器产出),
|
||
// 返回的 channel 持续输出 MP3 音频 chunk。
|
||
SynthesizeStream(ctx context.Context, textStream <-chan string, opts Options) (<-chan Chunk, error)
|
||
}
|
||
|
||
// Options 合成参数。
|
||
type Options struct {
|
||
Voice string // "alloy" | "nova" | "shimmer" 等
|
||
Speed float64 // 1.0 为正常语速
|
||
OutputFmt string // "mp3" — 固定使用 MP3
|
||
SampleRate int // 24000
|
||
}
|
||
|
||
// Chunk 一个音频片段。
|
||
type Chunk struct {
|
||
Audio []byte // MP3 音频数据(未 Base64 编码)
|
||
IsLast bool // 当前句子是否为最后一片(每句结束时为 true)
|
||
Final bool // 整轮 TTS 是否结束(所有句子合成完毕后为 true,此时 Audio 为 nil)
|
||
}
|