#![cfg_attr(not(feature = "download-model"), allow(dead_code, unused_imports))]
#[cfg(feature = "download-model")]
use aic_sdk::{Model, Processor, ProcessorConfig, ProcessorParameter, VadParameter};
use std::env;
#[cfg(not(feature = "download-model"))]
fn main() -> Result<(), Box<dyn std::error::Error>> {
Err("Enable the `download-model` feature to run this example.".into())
}
#[cfg(feature = "download-model")]
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("ai-coustics SDK version: {}", aic_sdk::get_sdk_version());
println!(
"Compatible model version: {}",
aic_sdk::get_compatible_model_version()
);
let license = env::var("AIC_SDK_LICENSE").expect("AIC_SDK_LICENSE environment variable");
let model_path = Model::download("quail-vf-2.0-l-16khz", "target")?;
let model = Model::from_file(&model_path)?;
println!("Model loaded from {}", model_path.display());
let config = ProcessorConfig::optimal(&model)
.with_num_channels(2)
.with_allow_variable_frames(true);
let mut processor = Processor::new(&model, &license)?.with_config(&config)?;
println!(
"Processor created and initialized successfully with: Sample rate: {} Hz, Frames: {}, Channels: {}",
config.sample_rate, config.num_frames, config.num_channels
);
let mut audio_interleaved = vec![0.0; config.num_channels as usize * config.num_frames];
processor.process_interleaved(&mut audio_interleaved)?;
let mut audio_planar = vec![vec![0.0f32; config.num_frames]; config.num_channels as usize];
processor.process_planar(&mut audio_planar)?;
let mut audio_sequential = vec![0.0; config.num_channels as usize * config.num_frames];
processor.process_sequential(&mut audio_sequential)?;
let proc_ctx = processor.processor_context();
let delay = proc_ctx.output_delay();
println!("Output delay: {} samples", delay);
proc_ctx.set_parameter(ProcessorParameter::EnhancementLevel, 0.7)?;
println!("Parameter set successfully");
let enhancement_level = proc_ctx.parameter(ProcessorParameter::EnhancementLevel)?;
println!("Enhancement level: {}", enhancement_level);
match proc_ctx.reset() {
Ok(()) => println!("Processor reset succeeded"),
Err(e) => println!("Processor reset failed: {}", e),
}
let vad_ctx = processor.vad_context();
vad_ctx.set_parameter(VadParameter::SpeechHoldDuration, 0.08)?;
vad_ctx.set_parameter(VadParameter::Sensitivity, 7.0)?;
let speech_hold_duration = vad_ctx.parameter(VadParameter::SpeechHoldDuration)?;
println!("Speech hold duration: {}", speech_hold_duration);
let sensitivity = vad_ctx.parameter(VadParameter::Sensitivity)?;
println!("Sensitivity: {}", sensitivity);
if vad_ctx.is_speech_detected() {
println!("VAD detected speech");
} else {
println!("VAD did not detect speech");
}
println!("All tests completed");
Ok(())
}