diff --git a/src/main.rs b/src/main.rs index bfb4504..6db8415 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,7 +46,10 @@ fn main() { new_listener().listen(move |data: Vec| { data.iter().for_each(|x| buffer.push(*x)); if Instant::now() - last > stream_step { - w.transcribe(&buffer); + match w.transcribe_async(&buffer) { + Ok(_) => (), + Err(msg) => eprintln!("{}", msg), + }; for i in stream_retain..buffer.len() { buffer[i - stream_retain] = buffer[i] @@ -82,13 +85,19 @@ fn new_whisper(model_path: String, threads: i32, handler: Handler) -> Result) { - self.transcribe_async(data).unwrap(); - // TODO block + let (send, recv) = std::sync::mpsc::sync_channel(1); + self._transcribe_async(data, Some(send)).unwrap(); + recv.recv().unwrap(); } fn transcribe_async(&self, data: &Vec) -> Result<(), String> { + self._transcribe_async(data, None) + } + + fn _transcribe_async(&self, data: &Vec, ack: Option>) -> Result<(), String> { match self.jobs.try_send(AWhisper{ data: data.clone().to_vec(), + ack: ack, }) { Ok(_) => Ok(()), Err(msg) => Err(format!("failed to enqueue transcription: {}", msg)), @@ -109,8 +118,20 @@ impl WhisperEngine { match recv.recv() { Ok(job) => { match self.transcribe(&job.data) { - Ok(result) => self.handler.on_success(result), - Err(msg) => self.handler.on_error(format!("failed to transcribe: {}", msg)), + Ok(result) => { + self.handler.on_success(result); + match job.ack { + Some(ack) => { let _ = ack.send(true); }, + None => (), + }; + }, + Err(msg) => { + self.handler.on_error(format!("failed to transcribe: {}", msg)); + match job.ack { + Some(ack) => { let _ = ack.send(false); }, + None => (), + }; + }, }; }, Err(_) => return, @@ -146,6 +167,7 @@ impl WhisperEngine { struct AWhisper { data: Vec, + ack: Option>, } struct Handler {}