use std::env;
use hound::WavReader;
use vosk::{DecodingState, Model, Recognizer};
fn main() {
let mut args = env::args();
args.next();
let model_path = args.next().expect("A model path was not provided");
let wav_path = args
.next()
.expect("A path for the WAV file to be read was not provided");
let mut reader = WavReader::open(wav_path).expect("Could not create the WAV reader");
let samples = reader
.samples()
.collect::<hound::Result<Vec<i16>>>()
.expect("Could not read WAV file");
let model = Model::new(model_path).expect("Could not create the model");
let mut recognizer = Recognizer::new_with_grammar(
&model,
reader.spec().sample_rate as f32,
&["one two three four five six seven eight nine zero", "[unk]"],
)
.expect("Could not create the recognizer");
for sample in samples.chunks(4000) {
let state = recognizer.accept_waveform(sample).unwrap();
match state {
DecodingState::Finalized => {
println!("{:#?}", recognizer.result().single().unwrap());
}
DecodingState::Running => {
println!("{:#?}", recognizer.partial_result());
}
DecodingState::Failed => {
eprintln!("an error occurred")
}
}
}
println!("{:#?}", recognizer.final_result().single().unwrap());
}