@@ -15,10 +15,12 @@ pub enum Event {
1515 MicAudioChunk ( Vec < i16 > ) ,
1616 MicAudioEnd ,
1717 MicInterrupt ( Vec < i16 > ) ,
18+ MicInterruptWaitTimeout ,
1819}
1920
2021#[ allow( dead_code) ]
2122impl Event {
23+ pub const IDLE : & ' static str = "idle" ;
2224 pub const GAIA : & ' static str = "gaia" ;
2325 pub const NO : & ' static str = "no" ;
2426 pub const YES : & ' static str = "yes" ;
@@ -41,6 +43,7 @@ async fn select_evt(
4143 server : & mut Server ,
4244 notify : & tokio:: sync:: Notify ,
4345 wait_notify : bool ,
46+ timeout : std:: time:: Duration ,
4447) -> Option < Event > {
4548 let s_fut = async {
4649 if wait_notify {
@@ -50,38 +53,52 @@ async fn select_evt(
5053 server. recv ( ) . await
5154 }
5255 } ;
56+ let timeout_event = if timeout == INTERNAL_TIMEOUT {
57+ Some ( Event :: MicInterruptWaitTimeout )
58+ } else {
59+ Some ( Event :: Event ( Event :: IDLE ) )
60+ } ;
61+
62+ let timeout_f = tokio:: time:: sleep ( timeout) ;
5363
5464 tokio:: select! {
65+ _ = timeout_f => {
66+ log:: info!( "Event select timeout" ) ;
67+ timeout_event
68+ }
5569 Some ( evt) = evt_rx. recv( ) => {
5670 match & evt {
5771 Event :: Event ( _) => {
58- log:: info!( "Received event: {:?}" , evt) ;
72+ log:: info!( "[Select] Received event: {:?}" , evt) ;
5973 } ,
6074 Event :: MicAudioEnd => {
61- log:: info!( "Received MicAudioEnd" ) ;
75+ log:: info!( "[Select] Received MicAudioEnd" ) ;
6276 } ,
6377 Event :: MicAudioChunk ( data) => {
64- log:: debug!( "Received MicAudioChunk with {} bytes" , data. len( ) ) ;
78+ log:: debug!( "[Select] Received MicAudioChunk with {} bytes" , data. len( ) ) ;
6579 } ,
6680 Event :: ServerEvent ( _) => {
67- log:: info!( "Received ServerEvent: {:?}" , evt) ;
81+ log:: info!( "[Select] Received ServerEvent: {:?}" , evt) ;
6882 } ,
6983 Event :: MicInterrupt ( data) => {
70- log:: info!( "Received MicInterrupt with {} samples" , data. len( ) ) ;
84+ log:: info!( "[Select] Received MicInterrupt with {} samples" , data. len( ) ) ;
85+ } ,
86+ Event :: MicInterruptWaitTimeout => {
87+ log:: info!( "[Select] Received MicInterruptWaitTimeout" ) ;
7188 }
7289 }
7390 Some ( evt)
7491 }
7592 Ok ( msg) = s_fut => {
7693 match msg {
7794 Event :: ServerEvent ( ServerEvent :: AudioChunk { .. } ) =>{
78- log:: debug!( "Received AudioChunk" ) ;
95+ log:: debug!( "[Select] Received AudioChunk" ) ;
7996 }
8097 Event :: ServerEvent ( ServerEvent :: HelloChunk { .. } ) =>{
81- log:: debug!( "Received HelloChunk" ) ;
98+ log:: debug!( "[Select] Received HelloChunk" ) ;
8299 }
83100 _=> {
84- log:: debug!( "Received message: {:?}" , msg) ;
101+ log:: debug!( "[Select] Received message: {:?}" , msg) ;
85102 }
86103 }
87104 Some ( msg)
@@ -131,6 +148,8 @@ impl DownloadMetrics {
131148}
132149
133150const SPEED_LIMIT : f64 = 1.5 ;
151+ const INTERNAL_TIMEOUT : std:: time:: Duration = std:: time:: Duration :: from_secs ( 1 ) ;
152+ const NORMAL_TIMEOUT : std:: time:: Duration = std:: time:: Duration :: from_secs ( 60 ) ;
134153
135154pub async fn main_work < ' d > (
136155 mut server : Server ,
@@ -170,8 +189,10 @@ pub async fn main_work<'d>(
170189 let mut wait_notify = false ;
171190 let mut init_hello = false ;
172191 let mut allow_interrupt = false ;
192+ let mut timeout = NORMAL_TIMEOUT ;
173193
174- while let Some ( evt) = select_evt ( & mut evt_rx, & mut server, & notify, wait_notify) . await {
194+ while let Some ( evt) = select_evt ( & mut evt_rx, & mut server, & notify, wait_notify, timeout) . await
195+ {
175196 match evt {
176197 Event :: Event ( Event :: GAIA | Event :: K0 ) => {
177198 log:: info!( "Received event: gaia" ) ;
@@ -235,6 +256,14 @@ pub async fn main_work<'d>(
235256 gui. display_flush ( ) . unwrap ( ) ;
236257 }
237258 Event :: Event ( Event :: YES | Event :: K1 ) => { }
259+ Event :: Event ( Event :: IDLE ) => {
260+ if state == State :: Listening {
261+ state = State :: Idle ;
262+ gui. state = "Idle" . to_string ( ) ;
263+ gui. display_flush ( ) . unwrap ( ) ;
264+ server. close ( ) . await ?;
265+ }
266+ }
238267 Event :: Event ( Event :: NOTIFY ) => {
239268 log:: info!( "Received notify event" ) ;
240269 wait_notify = false ;
@@ -259,15 +288,7 @@ pub async fn main_work<'d>(
259288 log:: info!( "Submitted StartChat command" ) ;
260289 }
261290 start_submit = true ;
262- let audio_buffer_u8 = unsafe {
263- std:: slice:: from_raw_parts (
264- audio_buffer. as_ptr ( ) as * const u8 ,
265- audio_buffer. len ( ) * 2 ,
266- )
267- } ;
268- server
269- . send_client_audio_chunk ( bytes:: Bytes :: from ( audio_buffer_u8) )
270- . await ?;
291+ server. send_client_audio_chunk_i16 ( audio_buffer) . await ?;
271292 audio_buffer = Vec :: with_capacity ( 8192 ) ;
272293 }
273294 }
@@ -279,15 +300,7 @@ pub async fn main_work<'d>(
279300 }
280301 if submit_audio > 0.5 {
281302 if !audio_buffer. is_empty ( ) {
282- let audio_buffer_u8 = unsafe {
283- std:: slice:: from_raw_parts (
284- audio_buffer. as_ptr ( ) as * const u8 ,
285- audio_buffer. len ( ) * 2 ,
286- )
287- } ;
288- server
289- . send_client_audio_chunk ( bytes:: Bytes :: from ( audio_buffer_u8) )
290- . await ?;
303+ server. send_client_audio_chunk_i16 ( audio_buffer) . await ?;
291304 audio_buffer = Vec :: with_capacity ( 8192 ) ;
292305 }
293306 server
@@ -321,10 +334,11 @@ pub async fn main_work<'d>(
321334 continue ;
322335 }
323336
324- if ( interrupt_data. len ( ) as f32 / 16000.0 ) < 1.2 {
337+ let interrupt_audio_sec = interrupt_data. len ( ) as f32 / 16000.0 ;
338+ if interrupt_audio_sec < 1.2 {
325339 log:: info!(
326340 "Interrupt audio too short ({} s), ignoring" ,
327- interrupt_data . len ( ) as f32 / 16000.0
341+ interrupt_audio_sec
328342 ) ;
329343 continue ;
330344 }
@@ -340,12 +354,40 @@ pub async fn main_work<'d>(
340354 server. reconnect_with_retry ( 3 ) . await ?;
341355
342356 start_submit = false ;
343- submit_audio = 0.0 ;
344- audio_buffer = Vec :: with_capacity ( 8192 ) ;
357+ submit_audio = interrupt_audio_sec ;
358+ audio_buffer = interrupt_data ;
345359
346360 state = State :: Listening ;
347361 gui. state = "Listening..." . to_string ( ) ;
348362 gui. display_flush ( ) . unwrap ( ) ;
363+ timeout = INTERNAL_TIMEOUT ;
364+ }
365+ Event :: MicInterruptWaitTimeout => {
366+ log:: info!( "Received MicInterruptWaitTimeout" ) ;
367+ timeout = NORMAL_TIMEOUT ;
368+ if start_submit {
369+ log:: info!( "Already started submit, ignoring timeout" ) ;
370+ continue ;
371+ }
372+ server
373+ . send_client_command ( protocol:: ClientCommand :: StartChat )
374+ . await ?;
375+ log:: info!( "Submitted StartChat command due to interrupt timeout" ) ;
376+
377+ server. send_client_audio_chunk_i16 ( audio_buffer) . await ?;
378+ server
379+ . send_client_command ( protocol:: ClientCommand :: Submit )
380+ . await ?;
381+ log:: info!( "Submitted audio" ) ;
382+ need_compute = metrics. is_timeout ( ) ;
383+
384+ audio_buffer = Vec :: with_capacity ( 8192 ) ;
385+ submit_audio = 0.0 ;
386+ start_submit = false ;
387+ wait_notify = false ;
388+ state = State :: Waiting ;
389+ gui. state = "Waiting..." . to_string ( ) ;
390+ gui. display_flush ( ) . unwrap ( ) ;
349391 }
350392 Event :: ServerEvent ( ServerEvent :: ASR { text } ) => {
351393 log:: info!( "Received ASR: {:?}" , text) ;
0 commit comments