threaded something i guess
parent
0667b5b5c6
commit
479cfb055f
101
src/main.rs
101
src/main.rs
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue