Some checks failed
ci/woodpecker/tag/woodpecker Pipeline failed
统一音频输出采样率为 44100Hz,使用 go-audio-resampler 库实现 Windowed Sinc + Polyphase FIR 算法(VeryHigh 28-bit 精度), 替代原有的线性插值透传方案。 主要变更: - 新增 sincResampler:三阶段 Read 循环(填充→处理→Flush) - 双缓冲区架构避免输出样本丢失,复用内存减少 GC 压力 - WAV/MP3/BGM 播放管线全部接入 Sinc 重采样器 - 移除旧的 linearResampler 和透传模式 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
36 lines
1.2 KiB
Go
36 lines
1.2 KiB
Go
// Package audio 提供基于 oto/v3 的音频播放功能。
|
||
//
|
||
// 播放模式:
|
||
// - 一次性播放: PlayWav(), PlayMP3() - 阻塞直到完成或 context 取消
|
||
// - 循环播放: PlayMP3Loop() - 非阻塞,返回 player 和清理函数
|
||
//
|
||
// 使用示例:
|
||
//
|
||
// // 一次性播放 WAV
|
||
// err := audio.PlayWav(ctx, wavReader)
|
||
// if err != nil && !errors.Is(err, context.Canceled) {
|
||
// log.Printf("播放失败: %v", err)
|
||
// }
|
||
//
|
||
// // 循环播放 MP3
|
||
// player, cleanup, err := audio.PlayMP3Loop(mp3Reader)
|
||
// if err != nil {
|
||
// return err
|
||
// }
|
||
// defer cleanup()
|
||
// // ... 播放中 ...
|
||
//
|
||
// 采样率说明:
|
||
// - 统一采样率:固定使用 16000 Hz(TTS 原生采样率)
|
||
// - oto/v3 只支持一个全局 Context,统一采样率可避免冲突
|
||
// - 其他采样率会自动重采样到 16000 Hz(线性插值)
|
||
// - 16000 Hz 音频(TTS):正常速度 ✅
|
||
// - 44100 Hz 音频(BGM):自动重采样,正常速度 ✅
|
||
// - 其他采样率:自动重采样,正常速度 ✅
|
||
//
|
||
// 资源管理:
|
||
// - 一次性播放: 函数内部自动管理所有资源
|
||
// - 循环播放: 调用者必须调用 defer cleanup() 清理资源
|
||
//
|
||
package audio
|