use aec_rs::Aec;
use hound::{WavReader, WavWriter};
fn main() {
let rec_path = std::env::args().nth(1).expect("Please specify rec path");
let echo_path = std::env::args().nth(2).expect("Please specify echo path");
let out_path = std::env::args().nth(3).expect("Please specify out path");
let mut rec_reader = WavReader::open(rec_path).unwrap();
let mut echo_reader = WavReader::open(echo_path).unwrap();
let spec = rec_reader.spec();
let mut out_writer = WavWriter::create(&out_path, spec).unwrap();
let config = aec_rs::AecConfig {
sample_rate: 16000, filter_length: 1600, frame_size: 160, enable_preprocess: true, };
let aec = Aec::new(&config);
let mut rec_buffer = vec![0i16; config.frame_size];
let mut echo_buffer = vec![0i16; config.frame_size];
let mut out_buffer = vec![0i16; config.frame_size];
let rec_samples: Vec<i16> = rec_reader
.samples::<i16>()
.collect::<Result<_, _>>()
.unwrap();
let echo_samples: Vec<i16> = echo_reader
.samples::<i16>()
.collect::<Result<_, _>>()
.unwrap();
let num_samples = rec_samples.len().min(echo_samples.len());
for i in 0..(num_samples / config.frame_size) {
rec_buffer
.copy_from_slice(&rec_samples[i * config.frame_size..(i + 1) * config.frame_size]);
echo_buffer
.copy_from_slice(&echo_samples[i * config.frame_size..(i + 1) * config.frame_size]);
aec.cancel_echo(&mut rec_buffer, &mut echo_buffer, &mut out_buffer);
for &sample in &out_buffer {
out_writer.write_sample(sample).unwrap();
}
}
println!("Created {}", out_path);
}