@@ -284,14 +284,25 @@ async fn transcribe_audio(audio_data: Vec<u8>, config: &OpenAiConfig, rate_limit
284284 Ok ( transcription. text )
285285}
286286
287-
288287async fn process_audio (
289288 audio_data : Vec < u8 > ,
290289 config : & Config ,
291290 socket : & UdpSocket ,
292291 rate_limiter : & mut RateLimiter ,
293292 typing_indicator : & TypingIndicator ,
294293) -> Result < ( ) , Box < dyn Error > > {
294+ // Calculate audio duration
295+ let audio_duration = calculate_audio_duration ( & audio_data) ?;
296+
297+ // Check if audio is shorter than the minimum transcription duration
298+ let min_duration = Duration :: from_secs_f32 ( config. audio . min_transcription_duration ) ;
299+ if audio_duration < min_duration {
300+ println ! ( "Audio too short ({:.2}s). Minimum duration is {:.2}s. Skipping transcription." ,
301+ audio_duration. as_secs_f32( ) , min_duration. as_secs_f32( ) ) ;
302+ typing_indicator. set_typing ( false ) . await ;
303+ return Ok ( ( ) ) ;
304+ }
305+
295306 let transcription = transcribe_audio ( audio_data, & config. openai , rate_limiter) . await ?;
296307 println ! ( "Transcription: {}" , transcription) ;
297308
@@ -311,6 +322,13 @@ async fn process_audio(
311322 Ok ( ( ) )
312323}
313324
325+ fn calculate_audio_duration ( audio_data : & [ u8 ] ) -> Result < Duration , Box < dyn Error > > {
326+ let reader = hound:: WavReader :: new ( Cursor :: new ( audio_data) ) ?;
327+ let spec = reader. spec ( ) ;
328+ let duration = Duration :: from_secs_f32 ( reader. duration ( ) as f32 / spec. sample_rate as f32 ) ;
329+ Ok ( duration)
330+ }
331+
314332enum AudioEvent {
315333 StartRecording ,
316334 StopRecording ,
@@ -338,7 +356,6 @@ fn start_audio_recording(
338356 let audio_data_clone = Arc :: clone ( & audio_data) ;
339357
340358 let tx_clone = tx. clone ( ) ;
341- let config_clone = config. clone ( ) ;
342359
343360 let mut noise_gate = NoiseGate :: new (
344361 config. audio . noise_gate_threshold ,
0 commit comments