threaded something i guess

master
Bel LaPointe 2023-11-30 09:39:43 -07:00
parent 0667b5b5c6
commit 479cfb055f
1 changed files with 74 additions and 47 deletions

View File

@ -4,6 +4,7 @@ use signal_hook::{iterator::Signals, consts::signal::SIGINT};
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use chrono; use chrono;
use clap::Parser; use clap::Parser;
use std::thread;
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
struct Flags { struct Flags {
@ -41,30 +42,10 @@ fn main() {
println!("{}", result); println!("{}", result);
}, },
None => { None => {
let host = cpal::default_host();
let device = host.default_input_device().unwrap();
let cfg = device.supported_input_configs()
.unwrap()
.filter(|x| x.sample_format() == cpal::SampleFormat::F32)
.nth(0)
.unwrap()
.with_max_sample_rate();
let downsample_ratio = cfg.channels() as f32 * (cfg.sample_rate().0 as f32 / 16000.0);
let mut buffer = vec![]; let mut buffer = vec![];
let mut last = Instant::now(); let mut last = Instant::now();
let stream = device.build_input_stream( new_listener().listen(move |data: Vec<f32>| {
&cfg.clone().into(), data.iter().for_each(|x| buffer.push(*x));
move |data: &[f32], _: &cpal::InputCallbackInfo| {
let mut downsampled_data = vec![];
for i in 0..(data.len() as f32 / downsample_ratio) as usize {
let mut upsampled = i as f32 * downsample_ratio;
if upsampled > (data.len()-1) as f32 {
upsampled = (data.len()-1) as f32
}
downsampled_data.push(data[upsampled as usize]);
}
downsampled_data.iter().for_each(|x| buffer.push(*x));
if Instant::now() - last > stream_step { if Instant::now() - last > stream_step {
let result = w.transcribe(&buffer).unwrap(); let result = w.transcribe(&buffer).unwrap();
eprintln!("{}", chrono::Local::now()); eprintln!("{}", chrono::Local::now());
@ -77,21 +58,7 @@ fn main() {
buffer.truncate(retain); buffer.truncate(retain);
last = Instant::now(); last = Instant::now();
} }
}, });
move |err| {
eprintln!("input error: {}", err)
},
None,
).unwrap();
stream.play().unwrap();
eprintln!("listening on {}", device.name().unwrap());
let mut signals = Signals::new(&[SIGINT]).unwrap();
for sig in signals.forever() {
eprintln!("sig {}", sig);
break;
}
stream.pause().unwrap();
}, },
}; };
} }
@ -144,3 +111,63 @@ impl Whisper {
Ok(result) Ok(result)
} }
} }
struct Listener {
}
fn new_listener() -> Listener {
Listener{}
}
impl Listener {
fn listen(self, mut cb: impl FnMut(Vec<f32>)) {
let (send, recv) = std::sync::mpsc::channel();
thread::spawn(move || { self._listen(send); });
loop {
match recv.recv() {
Ok(msg) => cb(msg),
Err(msg) => return,
};
}
}
fn _listen(self, ch: std::sync::mpsc::Sender<Vec<f32>>) {
let host = cpal::default_host();
let device = host.default_input_device().unwrap();
let cfg = device.supported_input_configs()
.unwrap()
.filter(|x| x.sample_format() == cpal::SampleFormat::F32)
.nth(0)
.unwrap()
.with_max_sample_rate();
let downsample_ratio = cfg.channels() as f32 * (cfg.sample_rate().0 as f32 / 16000.0);
let stream = device.build_input_stream(
&cfg.clone().into(),
move |data: &[f32], _: &cpal::InputCallbackInfo| {
let mut downsampled_data = vec![];
for i in 0..(data.len() as f32 / downsample_ratio) as usize {
let mut upsampled = i as f32 * downsample_ratio;
if upsampled > (data.len()-1) as f32 {
upsampled = (data.len()-1) as f32
}
downsampled_data.push(data[upsampled as usize]);
}
ch.send(downsampled_data).unwrap();
},
move |err| {
eprintln!("input error: {}", err)
},
None,
).unwrap();
stream.play().unwrap();
eprintln!("listening on {}", device.name().unwrap());
let mut signals = Signals::new(&[SIGINT]).unwrap();
for sig in signals.forever() {
eprintln!("sig {}", sig);
break;
}
stream.pause().unwrap();
}
}