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!("用法: 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 == ModelFamily::CitrinetAsr.as_str());
if !has_asr {
eprintln!(
"警告: citrinet_asr 未编译进引擎。请用 `--features custom-models`,\
并设置 AUDIOCPP_MODELS=citrinet_asr 重新构建。"
);
}
let model = registry.load(model_path, Some(ModelFamily::CitrinetAsr), 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 result = session.run_offline(Request::asr(wav_path))?;
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(())
}