use std::path::Path;
use wavekat_turn::audio::PipecatSmartTurn;
use wavekat_turn::{AudioFrame, TurnController};
fn load_wav(path: &Path) -> Vec<f32> {
let mut reader = hound::WavReader::open(path)
.unwrap_or_else(|e| panic!("failed to open {}: {}", path.display(), e));
let spec = reader.spec();
match spec.sample_format {
hound::SampleFormat::Int => reader
.samples::<i16>()
.map(|s| s.unwrap() as f32 / 32768.0)
.collect(),
hound::SampleFormat::Float => reader.samples::<f32>().map(|s| s.unwrap()).collect(),
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let fixtures = Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.parent()
.unwrap()
.join("tests/fixtures");
let speech_mid = load_wav(&fixtures.join("speech_mid.wav"));
let speech_finished = load_wav(&fixtures.join("speech_finished.wav"));
let detector = PipecatSmartTurn::new()?;
let mut ctrl = TurnController::new(detector);
println!(">> VAD: speech started");
ctrl.reset_if_finished();
println!(">> Pushing speech_mid.wav (cut mid-sentence)");
ctrl.push_audio(&AudioFrame::new(&speech_mid[..], 16_000));
println!(">> VAD: speech ended");
let result_a = ctrl.predict()?;
println!(
" predict → {:?} (confidence: {:.3})",
result_a.state, result_a.confidence
);
println!("\n>> VAD: speech started again");
let did_reset = ctrl.reset_if_finished();
println!(
" reset_if_finished → {}",
if did_reset {
"reset (turn was finished)"
} else {
"skipped (turn unfinished, keeping buffer)"
}
);
println!(">> Pushing speech_finished.wav (complete sentence)");
ctrl.push_audio(&AudioFrame::new(&speech_finished[..], 16_000));
println!(">> VAD: speech ended");
let result_b = ctrl.predict()?;
println!(
" predict → {:?} (confidence: {:.3}, ran on A+B combined)",
result_b.state, result_b.confidence
);
println!("\n>> Assistant finished responding");
ctrl.reset(); println!(" hard reset, last_state: {:?}", ctrl.last_state());
println!("\n>> VAD: speech started (new turn)");
ctrl.reset_if_finished();
println!(">> Pushing speech_finished.wav");
ctrl.push_audio(&AudioFrame::new(&speech_finished[..], 16_000));
println!(">> VAD: speech ended");
let result_c = ctrl.predict()?;
println!(
" predict → {:?} (confidence: {:.3})",
result_c.state, result_c.confidence
);
Ok(())
}