moved to a callback BUT costed me a global so lets iterate to someTrait
parent
5f47b2c88b
commit
091958e08d
47
src/main.rs
47
src/main.rs
|
|
@ -31,14 +31,17 @@ struct Flags {
|
||||||
debug: bool,
|
debug: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static mut G_HANDLER: Handler = new_handler(&0.0, &0.0);
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let flags = Flags::parse();
|
let flags = Flags::parse();
|
||||||
|
|
||||||
let handler = Handler{
|
unsafe {
|
||||||
head: flags.stream_head,
|
G_HANDLER.head = flags.stream_head.clone();
|
||||||
tail: flags.stream_tail,
|
G_HANDLER.tail = flags.stream_tail.clone();
|
||||||
};
|
}
|
||||||
let w = new_whisper(flags.model, flags.threads, handler).unwrap();
|
|
||||||
|
let w = new_whisper(flags.model, flags.threads, new_handler(&flags.stream_head, &flags.stream_tail)).unwrap();
|
||||||
let stream_retain = (flags.stream_retain * 16_000.0) as usize;
|
let stream_retain = (flags.stream_retain * 16_000.0) as usize;
|
||||||
let stream_step = Duration::new(flags.stream_step, 0);
|
let stream_step = Duration::new(flags.stream_step, 0);
|
||||||
match flags.wav {
|
match flags.wav {
|
||||||
|
|
@ -63,9 +66,11 @@ fn main() {
|
||||||
new_listener().listen(move |data: Vec<f32>| {
|
new_listener().listen(move |data: Vec<f32>| {
|
||||||
data.iter().for_each(|x| buffer.push(*x));
|
data.iter().for_each(|x| buffer.push(*x));
|
||||||
if Instant::now() - last > stream_step {
|
if Instant::now() - last > stream_step {
|
||||||
//match w.transcribe_async(&buffer) {
|
match w.transcribe_async(&buffer, |result| {
|
||||||
match w.transcribe_callback(&buffer, |x| {
|
match result {
|
||||||
println!("CALLBACK: {:?}", &x);
|
Ok(whispered) => unsafe { G_HANDLER.on_success(&whispered) },
|
||||||
|
Err(msg) => unsafe { G_HANDLER.on_error(msg) },
|
||||||
|
};
|
||||||
}) {
|
}) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(msg) => eprintln!("{}", msg),
|
Err(msg) => eprintln!("{}", msg),
|
||||||
|
|
@ -124,15 +129,11 @@ impl Whisper {
|
||||||
recv.recv().unwrap();
|
recv.recv().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transcribe_callback(&self, data: &Vec<f32>, callback: fn(&Whispered)) -> Result<(), String> {
|
fn transcribe_async(&self, data: &Vec<f32>, callback: fn(Result<Whispered, String>)) -> Result<(), String> {
|
||||||
self._transcribe_async(data, None, Some(callback))
|
self._transcribe_async(data, None, Some(callback))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn transcribe_async(&self, data: &Vec<f32>) -> Result<(), String> {
|
fn _transcribe_async(&self, data: &Vec<f32>, ack: Option<std::sync::mpsc::SyncSender<bool>>, callback: Option<fn(Result<Whispered, String>)>) -> Result<(), String> {
|
||||||
self._transcribe_async(data, None, None)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn _transcribe_async(&self, data: &Vec<f32>, ack: Option<std::sync::mpsc::SyncSender<bool>>, callback: Option<fn(&Whispered)>) -> Result<(), String> {
|
|
||||||
match self.jobs.try_send(AWhisper{
|
match self.jobs.try_send(AWhisper{
|
||||||
data: data.clone().to_vec(),
|
data: data.clone().to_vec(),
|
||||||
ack: ack,
|
ack: ack,
|
||||||
|
|
@ -164,16 +165,20 @@ impl WhisperEngine {
|
||||||
None => (),
|
None => (),
|
||||||
};
|
};
|
||||||
match job.callback {
|
match job.callback {
|
||||||
Some(foo) => foo(&result),
|
Some(foo) => foo(Ok(result)),
|
||||||
None => (),
|
None => (),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
Err(msg) => {
|
Err(msg) => {
|
||||||
self.handler.on_error(format!("failed to transcribe: {}", msg));
|
self.handler.on_error(format!("failed to transcribe: {}", &msg));
|
||||||
match job.ack {
|
match job.ack {
|
||||||
Some(ack) => { let _ = ack.send(false); },
|
Some(ack) => { let _ = ack.send(false); },
|
||||||
None => (),
|
None => (),
|
||||||
};
|
};
|
||||||
|
match job.callback {
|
||||||
|
Some(foo) => foo(Err(format!("failed to transcribe: {}", &msg))),
|
||||||
|
None => (),
|
||||||
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
@ -213,7 +218,7 @@ impl WhisperEngine {
|
||||||
struct AWhisper {
|
struct AWhisper {
|
||||||
data: Vec<f32>,
|
data: Vec<f32>,
|
||||||
ack: Option<std::sync::mpsc::SyncSender<bool>>,
|
ack: Option<std::sync::mpsc::SyncSender<bool>>,
|
||||||
callback: Option<fn(&Whispered)>,
|
callback: Option<fn(Result<Whispered, String>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
|
@ -283,11 +288,19 @@ impl Whispered {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
struct Handler {
|
struct Handler {
|
||||||
head: f32,
|
head: f32,
|
||||||
tail: f32,
|
tail: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fn new_handler(seconds_head: &f32, seconds_tail: &f32) -> Handler {
|
||||||
|
Handler{
|
||||||
|
head: *seconds_head,
|
||||||
|
tail: *seconds_tail,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Handler {
|
impl Handler {
|
||||||
fn on_success(&self, result: &Whispered) {
|
fn on_success(&self, result: &Whispered) {
|
||||||
eprintln!("{}: {:?}", chrono::Local::now(), &result);
|
eprintln!("{}: {:?}", chrono::Local::now(), &result);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue