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!("用法: asr_offline <citrinet-asr-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:?}");
let has_asr = families.iter().any(|f| f == "citrinet_asr");
if !has_asr {
eprintln!(
"警告: citrinet_asr 未编译进引擎。请用 `--features custom-models`,\
并设置 AUDIOCPP_MODELS=citrinet_asr 重新构建。"
);
}
let model = registry.load(model_path, Some("citrinet_asr"), None)?;
println!("模型加载成功: {model_path}");
println!("元数据: {:?}", model.metadata()?);
let session = model.create_task_session(
TaskKind::Asr,
RunMode::Offline,
Backend::Cpu,
0, 4, None,
)?;
println!("会话: family={} task={} mode={}", session.family(), session.task_kind(), session.run_mode());
let request = format!(
r#"{{"audio_path":"{}"}}"#,
wav_path.replace('\\', "\\\\").replace('"', "\\\"")
);
let result = session.run_offline(&request)?;
match &result.text_output {
Some(text) => println!("=== 转录结果 ===\n{}\n语言: {}", text.text, text.language),
None => println!("=== 转录结果 ===\n(无文本输出;报告信息: {result:?})"),
}
for seg in &result.speech_segments {
println!(
" 片段 {}..{} 置信度={} 文本=\"{}\"",
seg.span.start_sample, seg.span.end_sample, seg.confidence, seg.text
);
}
Ok(())
}