#![allow(dead_code)]
use std::path::PathBuf;
use std::sync::Once;
fn ensure_backends() {
static INIT: Once = Once::new();
INIT.call_once(|| {
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())
.expect("could not locate repo root from CARGO_MANIFEST_DIR")
.to_path_buf()
}
pub fn smoke_model() -> Option<PathBuf> {
ensure_backends();
let path = std::env::var_os("TRANSCRIBE_SMOKE_MODEL")
.map(PathBuf::from)
.unwrap_or_else(|| repo_root().join("models/whisper-tiny.en/whisper-tiny.en-Q5_K_M.gguf"));
path.is_file().then_some(path)
}
pub fn smoke_audio() -> Option<Vec<f32>> {
let path = std::env::var_os("TRANSCRIBE_SMOKE_AUDIO")
.map(PathBuf::from)
.unwrap_or_else(|| repo_root().join("samples/jfk.wav"));
path.is_file().then(|| load_wav(&path))
}
pub fn smoke_streaming_model() -> Option<PathBuf> {
ensure_backends();
let path = std::env::var_os("TRANSCRIBE_SMOKE_STREAMING_MODEL")
.map(PathBuf::from)
.unwrap_or_else(|| {
repo_root().join("models/moonshine-streaming-tiny/moonshine-streaming-tiny-Q8_0.gguf")
});
path.is_file().then_some(path)
}
fn family_model(env_var: &str, default_rel: &str) -> Option<PathBuf> {
ensure_backends();
let path = std::env::var_os(env_var)
.map(PathBuf::from)
.unwrap_or_else(|| repo_root().join(default_rel));
path.is_file().then_some(path)
}
pub fn smoke_parakeet_stream_model() -> Option<PathBuf> {
family_model(
"TRANSCRIBE_SMOKE_PARAKEET_STREAM_MODEL",
"models/nemotron-speech-streaming-en-0.6b/nemotron-speech-streaming-en-0.6b-Q8_0.gguf",
)
}
pub fn smoke_parakeet_buffered_model() -> Option<PathBuf> {
family_model(
"TRANSCRIBE_SMOKE_PARAKEET_BUFFERED_MODEL",
"models/parakeet-unified-en-0.6b/parakeet-unified-en-0.6b-Q8_0.gguf",
)
}
pub fn smoke_voxtral_model() -> Option<PathBuf> {
family_model(
"TRANSCRIBE_SMOKE_VOXTRAL_MODEL",
"models/Voxtral-Mini-4B-Realtime-2602/Voxtral-Mini-4B-Realtime-2602-Q4_K_M.gguf",
)
}
pub fn smoke_pnc_model() -> Option<PathBuf> {
family_model(
"TRANSCRIBE_SMOKE_PNC_MODEL",
"models/canary-180m-flash/canary-180m-flash-Q8_0.gguf",
)
}
pub fn smoke_itn_model() -> Option<PathBuf> {
family_model(
"TRANSCRIBE_SMOKE_ITN_MODEL",
"models/SenseVoiceSmall/SenseVoiceSmall-Q8_0.gguf",
)
}
pub fn smoke_fixtures(test: &str) -> Option<(PathBuf, Vec<f32>)> {
match (smoke_model(), smoke_audio()) {
(Some(m), Some(a)) => Some((m, a)),
_ => {
eprintln!(
"skip {test}: smoke model/audio not present (set TRANSCRIBE_SMOKE_MODEL / _AUDIO)"
);
None
}
}
}
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()
}