2626logger = logging .getLogger ("funasr.server" )
2727
2828
29+ _LANGUAGE_TAG_RE = re .compile (r"<\|(zh|en|yue|ja|ko)\|>" )
30+
31+
32+ def extract_language_from_asr_text (text ):
33+ """Extract a SenseVoice language code before special tokens are removed."""
34+ if not isinstance (text , str ):
35+ return None
36+ match = _LANGUAGE_TAG_RE .search (text )
37+ return match .group (1 ) if match else None
38+
39+
40+ def resolve_transcription_language (requested_language , result ):
41+ """Prefer the caller's language hint, then backend detection, else unknown."""
42+ if requested_language and requested_language .strip ().lower () != "auto" :
43+ return requested_language
44+ detected_language = result .get ("language" )
45+ if isinstance (detected_language , str ) and detected_language :
46+ return detected_language
47+ return "unknown"
48+
49+
2950def _split_text_for_openai_segments (text : str , max_chars : int = 80 ):
3051 """Split unsegmented ASR text into readable OpenAI-compatible cues."""
3152 text = text .strip ()
@@ -255,7 +276,9 @@ def _process_fallback(model_name, audio_path, language=None):
255276 if language :
256277 kwargs ["language" ] = language
257278 result = model .generate (** kwargs )
258- text = re .sub (r'<\|[^|]*\|>' , '' , result [0 ]["text" ]).strip ()
279+ raw_text = result [0 ]["text" ]
280+ detected_language = extract_language_from_asr_text (raw_text )
281+ text = re .sub (r'<\|[^|]*\|>' , '' , raw_text ).strip ()
259282 segments = []
260283 if "sentence_info" in result [0 ]:
261284 for s in result [0 ]["sentence_info" ]:
@@ -267,7 +290,12 @@ def _process_fallback(model_name, audio_path, language=None):
267290 })
268291 if not segments and text :
269292 segments = build_openai_fallback_segments (text , duration )
270- return {"text" : text , "segments" : segments , "duration" : duration }
293+ return {
294+ "text" : text ,
295+ "segments" : segments ,
296+ "duration" : duration ,
297+ "language" : detected_language ,
298+ }
271299
272300 # Pre-load
273301 if app .state .model_path :
@@ -322,7 +350,7 @@ async def transcribe(
322350 if response_format == "verbose_json" :
323351 return JSONResponse ({
324352 "task" : "transcribe" ,
325- "language" : language or "zh" ,
353+ "language" : resolve_transcription_language ( language , result ) ,
326354 "duration" : result .get ("duration" , 0 ),
327355 "text" : result ["text" ],
328356 "segments" : [
0 commit comments