fix(tts): 修复 TTS 播放卡死问题并增强日志
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/tag/woodpecker Pipeline was successful
- 添加 SoundWithContext 方法,使用请求 context 而非全局 context - 修复 TTS 使用服务器全局 context 导致无法取消的问题 - 添加详细的诊断日志(解码、播放、TTS 合成各阶段) - 检测并记录 TTS 合成数据为空的情况 修复前 TTS 播放使用全局 context,当播放卡住时无法通过超时 或取消机制中断,导致后续任务永远无法执行。 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -22,6 +22,7 @@ func init() {
|
||||
}
|
||||
|
||||
func PlayWav(c context.Context, r io.Reader) {
|
||||
zap.S().Debugln("开始 WAV 解码")
|
||||
streamer, format, err := wav.Decode(r)
|
||||
if err != nil {
|
||||
zap.S().Errorln("WAV解码失败: ", err)
|
||||
@@ -29,20 +30,25 @@ func PlayWav(c context.Context, r io.Reader) {
|
||||
}
|
||||
defer streamer.Close()
|
||||
|
||||
zap.S().Debugln("WAV解码成功,采样率:", format.SampleRate)
|
||||
s := beep.Resample(4, format.SampleRate, DefaultSampleRate, streamer)
|
||||
|
||||
ctrl := &beep.Ctrl{Streamer: s}
|
||||
done := make(chan struct{})
|
||||
speaker.Play(beep.Seq(ctrl, beep.Callback(func() {
|
||||
zap.S().Debugln("音频播放完成")
|
||||
close(done)
|
||||
})))
|
||||
|
||||
zap.S().Debugln("等待音频播放完成...")
|
||||
for {
|
||||
select {
|
||||
case <-done:
|
||||
zap.S().Infoln("音频播放正常结束")
|
||||
return
|
||||
case <-c.Done():
|
||||
{
|
||||
zap.S().Infoln("音频播放被 context 取消")
|
||||
speaker.Lock()
|
||||
ctrl.Streamer = nil
|
||||
speaker.Unlock()
|
||||
|
||||
Reference in New Issue
Block a user