feat(audio): 添加音频重采样支持,修复播放速度问题

问题:
- TTS 返回 16000 Hz 音频,但 Context 使用 44100 Hz
- 播放速度快 2.75 倍(44100/16000)
- 不同采样率的音频播放速度不正确

解决方案:
- 集成 gomplerate 库(纯 Go,零依赖)
- 自动检测音频采样率并重采样到 44100 Hz
- 支持任意采样率的音频文件正常播放

技术实现:
- resampler.go: 封装 gomplerate,实现流式重采样
- play.go: WAV/MP3 播放自动重采样
- loop.go: BGM 循环播放支持重采样

测试:
- 所有单元测试通过(6/6)
- 支持采样率自动转换(如 16000 Hz → 44100 Hz)

依赖:
- github.com/zeozeozeo/gomplerate v0.0.0
This commit is contained in:
2026-04-08 19:39:58 +08:00
parent baa32fedc3
commit 4ddecb7c30
6 changed files with 174 additions and 21 deletions

View File

@@ -13,15 +13,15 @@ var (
)
const (
DefaultSampleRate = 44100 // 采样率
DefaultChannelCount = 2 // 声道数(立体声)
UniversalSampleRate = 44100 // 通用采样率(高质量音频)
DefaultChannelCount = 2 // 声道数(立体声)
)
func initContext() (*oto.Context, error) {
var initErr error
otoOnce.Do(func() {
op := &oto.NewContextOptions{}
op.SampleRate = DefaultSampleRate
op.SampleRate = UniversalSampleRate
op.ChannelCount = DefaultChannelCount
op.Format = oto.FormatSignedInt16LE
@@ -31,7 +31,7 @@ func initContext() (*oto.Context, error) {
return
}
<-ready
zap.S().Infoln("oto/v3 音频系统就绪")
zap.S().Infof("oto/v3 音频系统就绪 (%d Hz)", UniversalSampleRate)
})
return otoCtx, initErr
}