impress_asr_input_rust/src/audio/resampler.rs
impressionyang ceb2df18c4
Some checks are pending
Build Windows GUI / build-windows (push) Waiting to run
Build Windows GUI / release (push) Blocked by required conditions
初始提交:Windows 跨平台语音识别应用
功能:
- Tauri v2 GUI 应用
- 系统托盘支持
- 日志输出到文件
- 带时间戳的版本号
- 前端资源嵌入

修复:
- 前端路径使用相对路径
- 移除 devUrl 配置
- 窗口置顶设置
2026-05-21 17:58:18 +08:00

47 lines
1.4 KiB
Rust

//! 音频重采样模块
use anyhow::Result;
/// 重采样音频
///
/// 使用线性插值进行重采样
pub fn resample_audio(samples: &[f32], from_rate: u32, to_rate: u32) -> Result<Vec<f32>> {
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<Vec<f32>> {
// TODO: 实现基于 sinc 插值的高品质重采样
// 可以使用 rubato crate 实现
todo!("高品质重采样待实现")
}