use voxudio::*;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let mut stream = SonicStream::new(32000, 1)?;
let (input, _) = load_audio::<32000, f32, _>("../asset/test3.wav", true).await?;
let duration_ms = input.len() * 1000 / (stream.get_sample_rate() * stream.get_channels());
println!(
"输入样本数: {} ({}ms @ {}Hz)",
input.len(),
duration_ms,
stream.get_sample_rate()
);
println!("\n=== 使用 SonicStream::change_speed 便捷方法 ===");
let mut player = AudioPlayer::new()?;
player.play()?;
for &speed in &[0.5, 0.75, 1.0, 1.5, 2.0] {
stream.set_speed(speed);
let output = stream.change_speed(&input)?;
let output_ms = output.len() * 1000 / (stream.get_sample_rate() * stream.get_channels());
println!(
" 速度 {:.2}x: 输出 {} 样本 (~{}ms)",
speed,
output.len(),
output_ms
);
player.write::<32000, f32>(&output, 1).await?;
}
println!("\n=== 使用流式 API ===");
stream.set_speed(1.5);
println!("当前速度: {:.2}x", stream.get_speed());
let chunk_size = 1600;
let mut total_output = Vec::new();
for chunk in input.chunks(chunk_size) {
stream.write::<f32>(chunk)?;
let available = stream.get_samples_available();
if available > 0 {
total_output.extend(stream.read::<f32>(available));
}
}
stream.flush()?;
let available = stream.get_samples_available();
if available > 0 {
total_output.extend(stream.read::<f32>(available));
}
println!("流式处理 1.5x: 输出 {} 样本", total_output.len());
println!("\n=== Pitch 和 Rate ===");
let mut stream = SonicStream::new(16000, 1)?;
stream.set_pitch(2.0);
stream.write::<f32>(&input)?;
stream.flush()?;
let output = stream.read::<f32>(stream.get_samples_available());
println!(
"Pitch 2.0x: 输出 {} 样本(长度不变,音高升高)",
output.len()
);
let mut stream = SonicStream::new(16000, 1)?;
stream.set_rate(2.0);
stream.write::<f32>(&input)?;
stream.flush()?;
let output = stream.read::<f32>(stream.get_samples_available());
println!("Rate 2.0x: 输出 {} 样本(变速变调)", output.len());
Ok(())
}