#[path = "common/mod.rs"]
mod common;
use transcribe_cpp::{
backend_available, devices, init_backends_default, Backend, Model, ModelOptions,
};
fn main() -> Result<(), Box<dyn std::error::Error>> {
init_backends_default()?;
println!("registered compute devices:");
for d in devices() {
println!(" {} [{}] — {}", d.name, d.kind, d.description);
}
println!("\nbackend availability:");
for b in [Backend::Cpu, Backend::Metal, Backend::Vulkan, Backend::Cuda] {
println!(" {b:?} = {}", backend_available(b));
}
let unavailable = [Backend::Cuda, Backend::Vulkan, Backend::Metal]
.into_iter()
.find(|&b| !backend_available(b));
let mut args = std::env::args().skip(1);
let Some(model_path) = common::model_path(args.next().as_deref()) else {
eprintln!("\nskip the model half of backend-select: no model found");
return Ok(());
};
let model = Model::load_with(
&model_path,
&ModelOptions {
backend: Backend::Auto,
..Default::default()
},
)?;
println!(
"\nloaded with Backend::Auto -> bound backend: {}",
model.backend()
);
drop(model);
match unavailable {
Some(b) => match Model::load_with(
&model_path,
&ModelOptions {
backend: b,
..Default::default()
},
) {
Ok(_) => println!("requesting {b:?} unexpectedly succeeded"),
Err(e) => println!("requesting {b:?} failed cleanly: {e}"),
},
None => println!("every optional backend is available on this build"),
}
Ok(())
}