use audio_cpp::{Backend, Registry, RunMode, TaskKind};
fn main() -> Result<(), audio_cpp::Error> {
let args: Vec<String> = std::env::args().collect();
if args.len() < 3 {
eprintln!("用法: vad_offline <权重.safetensors> <input.wav> [family_hint]");
std::process::exit(1);
}
let model_path = &args[1];
let wav_path = &args[2];
let family_hint = args.get(3).map(String::as_str);
let registry = Registry::new()?;
println!("模型族: {:?}", registry.families()?);
println!("设备: {:?}", Registry::devices()?);
let model = registry.load(model_path, family_hint, None)?;
println!("模型加载成功: {model_path} family_hint={family_hint:?}");
let session = model.create_task_session(
TaskKind::Vad,
RunMode::Offline,
Backend::Cpu,
0, 4, None,
)?;
println!("会话: family={} task={} mode={}", session.family(), session.task_kind(), session.run_mode());
let threshold_key = if session.family() == "marblenet_vad" { "threshold" } else { "vad_threshold" };
let request = format!(
r#"{{"audio_path":"{}","options":{{"{}":0.5}}}}"#,
wav_path,
threshold_key
);
let result = session.run_offline(&request)?;
println!("=== 语音片段 ===");
for seg in &result.speech_segments {
println!(
" {}..{} 置信度={}",
seg.span.start_sample, seg.span.end_sample, seg.confidence
);
}
Ok(())
}