问题: - 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
38 lines
728 B
Go
38 lines
728 B
Go
package audio
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/ebitengine/oto/v3"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
var (
|
|
otoCtx *oto.Context
|
|
otoOnce sync.Once
|
|
)
|
|
|
|
const (
|
|
UniversalSampleRate = 44100 // 通用采样率(高质量音频)
|
|
DefaultChannelCount = 2 // 声道数(立体声)
|
|
)
|
|
|
|
func initContext() (*oto.Context, error) {
|
|
var initErr error
|
|
otoOnce.Do(func() {
|
|
op := &oto.NewContextOptions{}
|
|
op.SampleRate = UniversalSampleRate
|
|
op.ChannelCount = DefaultChannelCount
|
|
op.Format = oto.FormatSignedInt16LE
|
|
|
|
var ready <-chan struct{}
|
|
otoCtx, ready, initErr = oto.NewContext(op)
|
|
if initErr != nil {
|
|
return
|
|
}
|
|
<-ready
|
|
zap.S().Infof("oto/v3 音频系统就绪 (%d Hz)", UniversalSampleRate)
|
|
})
|
|
return otoCtx, initErr
|
|
}
|