//! 音频重采样模块 use anyhow::Result; /// 重采样音频 /// /// 使用线性插值进行重采样 pub fn resample_audio(samples: &[f32], from_rate: u32, to_rate: u32) -> Result> { if from_rate == to_rate { return Ok(samples.to_vec()); } let ratio = to_rate as f32 / from_rate as f32; let new_len = (samples.len() as f32 * ratio) as usize; if new_len == 0 { return Ok(vec![]); } let mut resampled = Vec::with_capacity(new_len); for i in 0..new_len { let src_idx = i as f32 / ratio; let src_idx_floor = src_idx.floor() as usize; let src_idx_ceil = src_idx.ceil() as usize; if src_idx_ceil >= samples.len() { resampled.push(*samples.last().unwrap_or(&0.0)); } else if src_idx_floor >= samples.len() { resampled.push(*samples.first().unwrap_or(&0.0)); } else { let frac = src_idx - src_idx_floor as f32; let sample = samples[src_idx_floor] * (1.0 - frac) + samples[src_idx_ceil] * frac; resampled.push(sample); } } Ok(resampled) } /// 使用更高品质的重采样算法 (可选) pub fn resample_audio_high_quality(_samples: &[f32], _from_rate: u32, _to_rate: u32) -> Result> { // TODO: 实现基于 sinc 插值的高品质重采样 // 可以使用 rubato crate 实现 todo!("高品质重采样待实现") }