use audio_cpp::{Backend, ModelFamily, Registry, Request, RunMode, TaskKind};
fn main() -> Result<(), audio_cpp::Error> {
let args: Vec<String> = std::env::args().collect();
if args.len() < 3 {
eprintln!("用法: diar_offline <sortformer-diar-4spk-v1-q8_0.gguf> <input.wav>");
std::process::exit(1);
}
let model_path = &args[1];
let wav_path = &args[2];
let registry = Registry::new()?;
let families = registry.families()?;
println!("模型族: {families:?}");
if !families
.iter()
.any(|f| f == ModelFamily::SortformerDiar.as_str())
{
eprintln!(
"警告: sortformer_diar 未编译进引擎。请用 `--features model-sortformer-diar` 重新构建。"
);
}
let model = registry.load(model_path, Some(ModelFamily::SortformerDiar), None)?;
println!("模型加载成功: {model_path}");
println!("元数据: {:?}", model.metadata()?);
let session = model.create_task_session(
TaskKind::Diar,
RunMode::Offline,
Backend::Cpu,
0, 4, None,
)?;
println!(
"会话: family={} task={} mode={}",
session.family(),
session.task_kind(),
session.run_mode()
);
let result = session.run_offline(Request::diar(wav_path))?;
println!("=== 说话人分离结果 ===");
if result.speaker_turns.is_empty() {
println!("(无 speaker_turns 输出;报告信息: {result:?})");
}
for turn in &result.speaker_turns {
let start_sec = turn.span.start_sample as f64 / 16000.0;
let end_sec = turn.span.end_sample as f64 / 16000.0;
println!(
"{} {:6.2}s..{:6.2}s 采样 {}..{} 置信度={:.3}",
turn.speaker_id,
start_sec,
end_sec,
turn.span.start_sample,
turn.span.end_sample,
turn.confidence
);
}
Ok(())
}