#![allow(dead_code)]
use std::path::PathBuf;
fn ensure_backends() {
transcribe_cpp::init_backends_default().expect("init_backends_default");
}
pub fn repo_root() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.ancestors()
.find(|p| p.join("include/transcribe.h").is_file() && p.join("ggml").is_dir())
.map(|p| p.to_path_buf())
.unwrap_or_else(|| PathBuf::from("."))
}
pub fn model_path(arg: Option<&str>) -> Option<PathBuf> {
ensure_backends();
resolve(
arg,
"TRANSCRIBE_SMOKE_MODEL",
"models/whisper-tiny.en/whisper-tiny.en-Q5_K_M.gguf",
)
}
pub fn streaming_model_path(arg: Option<&str>) -> Option<PathBuf> {
ensure_backends();
resolve(
arg,
"TRANSCRIBE_SMOKE_STREAMING_MODEL",
"models/moonshine-streaming-tiny/moonshine-streaming-tiny-Q8_0.gguf",
)
}
pub fn audio_path(arg: Option<&str>) -> Option<PathBuf> {
resolve(arg, "TRANSCRIBE_SMOKE_AUDIO", "samples/jfk.wav")
}
fn resolve(arg: Option<&str>, env: &str, default_rel: &str) -> Option<PathBuf> {
let path = arg
.map(PathBuf::from)
.or_else(|| std::env::var_os(env).map(PathBuf::from))
.unwrap_or_else(|| repo_root().join(default_rel));
path.is_file().then_some(path)
}
pub fn load_wav(path: &std::path::Path) -> Vec<f32> {
let mut reader = hound::WavReader::open(path).expect("open wav");
let spec = reader.spec();
assert_eq!(spec.channels, 1, "{path:?} must be mono");
assert_eq!(spec.sample_rate, 16_000, "{path:?} must be 16 kHz");
assert_eq!(spec.bits_per_sample, 16, "{path:?} must be 16-bit");
reader
.samples::<i16>()
.map(|s| s.expect("wav sample") as f32 / 32768.0)
.collect()
}