@@ -9,7 +9,7 @@ use tracing::{error, info};
99use crate :: Host ;
1010use context_switch_core:: {
1111 BillingRecord , Service ,
12- conversation:: { BillingSchedule , Conversation , Input } ,
12+ conversation:: { BillingSchedule , Conversation , ConversationOutput , Input } ,
1313 speech_gate:: make_speech_gate_processor_soft_rms,
1414} ;
1515
@@ -46,13 +46,35 @@ impl Service for AzureTranscribe {
4646 }
4747 } ;
4848
49+ let languages = params
50+ . language
51+ . split ( ',' )
52+ . map ( str:: trim)
53+ . filter ( |x| !x. is_empty ( ) )
54+ . map ( str:: to_owned)
55+ . collect :: < Vec < _ > > ( ) ;
56+
57+ if languages. is_empty ( ) {
58+ bail ! ( "language must contain at least one locale code" ) ;
59+ }
60+ let include_detected_language = languages. len ( ) > 1 ;
61+
4962 let config = recognizer:: Config :: default ( )
5063 // Disable profanity filter.
51- . set_profanity ( recognizer:: Profanity :: Raw )
52- // short-circuit language filter.
53- // TODO: may actually use the filter to check for supported languages?
54- . set_language ( recognizer:: Language :: Custom ( params. language ) )
55- . set_output_format ( recognizer:: OutputFormat :: Detailed ) ;
64+ . set_profanity ( recognizer:: Profanity :: Raw ) ;
65+
66+ let config = if languages. len ( ) == 1 {
67+ config. set_language ( recognizer:: Language :: Custom ( languages[ 0 ] . clone ( ) ) )
68+ } else {
69+ config. set_detect_languages (
70+ languages
71+ . into_iter ( )
72+ . map ( recognizer:: Language :: Custom )
73+ . collect ( ) ,
74+ recognizer:: LanguageDetectMode :: Continuous ,
75+ )
76+ }
77+ . set_output_format ( recognizer:: OutputFormat :: Detailed ) ;
5678
5779 let client = recognizer:: Client :: connect ( host. auth . clone ( ) , config) . await ?;
5880
@@ -108,13 +130,36 @@ impl Service for AzureTranscribe {
108130 | Event :: StartDetected ( _, _)
109131 | Event :: EndDetected ( _, _) => { }
110132 Event :: Recognizing ( _, recognized, _, _, _) => {
111- output. text ( false , recognized. text ) ?
133+ output_recognized_text ( & output, recognized, false , include_detected_language) ?
134+ }
135+ Event :: Recognized ( _, recognized, _, _, _) => {
136+ output_recognized_text ( & output, recognized, true , include_detected_language) ?
112137 }
113- Event :: Recognized ( _, recognized, _, _, _) => output. text ( true , recognized. text ) ?,
114138 Event :: UnMatch ( _, _, _, _) => { }
115139 }
116140 }
117141
118142 Ok ( ( ) )
119143 }
120144}
145+
146+ fn output_recognized_text (
147+ output : & ConversationOutput ,
148+ recognized : recognizer:: Recognized ,
149+ is_final : bool ,
150+ include_detected_language : bool ,
151+ ) -> Result < ( ) > {
152+ let recognizer:: Recognized {
153+ text,
154+ primary_language,
155+ ..
156+ } = recognized;
157+
158+ let language = if include_detected_language {
159+ primary_language. map ( |x| x. language . to_string ( ) )
160+ } else {
161+ None
162+ } ;
163+
164+ output. text ( is_final, text, language)
165+ }
0 commit comments