
    ?i                        U d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dl	m
Z
mZmZmZ d dlmZ d dlmZ d dlmZ daee   ed<   ed	e
fd
       Z e
dde      Z e e j2                  dd            Zdededee   fdZej;                  d       ed      fdedefd       Zedk(  rd dl Z  e jB                  ddd       yy)    N)asynccontextmanager)ListOptional)FastAPIFileHTTPException
UploadFile)JSONResponse)AudioSegment)Qwen3ASRModelMODEL_c                  K   t        d       t        j                         }t        j                  j	                         st        d      t        j                  ddt        j                  dddddd	t        t        j                  d
      
      at        j                         |z
  }t        d|dd       d  y w)Nu-   【1 开始加载 Qwen3-ASR-0.6B 模型...】u?   未检测到 GPU（CUDA），请确认容器已正确启用 GPUzQwen/Qwen3-ASR-0.6Bz/app/hf_cachecudaT       zQwen/Qwen3-ForcedAligner-0.6Bzcuda:0)dtype
device_map)		cache_dirtorch_dtyper   low_cpu_mem_usageuse_safetensorsmax_inference_batch_sizemax_new_tokensforced_alignerforced_aligner_kwargsu!   ✅ 模型加载完成！耗时: z.2fu    秒
)printtimetorchr   is_availableRuntimeErrorr   from_pretrainedfloat16dictbfloat16r   )r   
start_load	load_times      /app/qwen_asr_demo.pylifespanr)      s      

9:J::""$\]]))!MM!"6"..
E 		j(I	-i_F
CD	s   B<B>zQwen3 ASR APIz1.0.0)titleversionr)   ASR_CHUNK_SECONDS15	file_pathchunk_secondsreturnc                 d   t        j                  |       }t        d|      dz  }g }t        dt	        |      |      D ]d  }||z   }||| }t        j                  dd      5 }|j                  |j                  d       |j                  |j                         d d d        f |S # 1 sw Y   rxY w)	Nr   i  r   F.wavdeletesuffixwav)format)
r   	from_filemaxrangelentempfileNamedTemporaryFileexportnameappend)	r.   r/   audiochunk_mschunksstartendsegmenttmps	            r(   split_audio_to_chunksrH   0   s    ""9-E1m$t+HFq#e*h/hc"((fENN388EN2MM#((# FE 0 M FEs   !9B&&B/	z/transcribe.filec                 l  K   t         t        dd      | j                  xs dj                         }|j	                  d      s|j	                  d      st        dd      |j	                  d      rdnd}t        j                  d	|
      5 }|j                  | j                          d {          |j                  }d d d        	 t        j                         }t        t              }g }d }|D ]M  }	t         j                  |	d       }
|
s|xs |
d   j                  }|j                  |
d   j                          O t        j                         |z
  }|st        dd      t#        |dj%                  |      j'                         t)        |d      t+        |      d      	 t-        j.                  |       	 t3               j5                  dg       D ]  }		 t-        j.                  |	        S 7 J# 1 sw Y   :xY w# t0        $ r Y Rw xY w# t0        $ r Y Fw xY w# t6        $ r Y S w xY w# 	 t-        j.                         n# t0        $ r Y nw xY w	 t3               j5                  dg       D ]'  }		 t-        j.                  |	       # t0        $ r Y %w xY w w # t6        $ r Y w w xY wxY ww)Ni  u   模型尚未加载完成)status_codedetail r2   z.mp3i  u   仅支持 wav 或 mp3 文件Fr3   )rA   languager   i  u   识别失败    )rN   texttime_secrC   chunk_paths)r   r   filenamelowerendswithr<   r=   writereadr?   r   rH   CHUNK_SECONDS
transcriberN   r@   rQ   r
   joinstriproundr;   osremoveOSErrorlocalsget	Exception)rI   rT   r5   rG   tmp_pathstart_inferrS   textsrN   
chunk_pathresults
infer_times               r(   transcribe_audiorj   =   sg    }4NOO#**,Hf%):):6)B4RSS((0VfF		$	$E&	AS				#$88 
B%iik+HmD"&%J&&Z$&GG#:wqz':':WQZ__-	 & YY[;.
CGG$--/!*a0k*	
	IIh	$hll="=
IIj) >E $ 
B	A@  		   			IIh 			$hll="=
IIj)  >
  		s  BJ4G;.G8
/G;J4AH5 BH5 ,HH& H5H&7J48G;;H J4	HJ4HJ4	H# H&"H##H&&	H2/J41H22J45J17IJ1	IJ1IJ1J";JJ"	J	J"J	J"!J1"	J.+J1-J..J11J4__main__zqwen_asr_demo:appz0.0.0.0i@  )hostport)"r^   r   r<   
contextlibr   typingr   r   r   fastapir   r   r   r	   fastapi.responsesr
   pydubr   qwen_asrr   r   __annotations__r)   appintgetenvrY   strrH   postrj   __name__uvicornrun     r(   <module>r      s    	   * !  < < *  "!%x % 
g 
 
4 OWxHIBII1489
S 
 
c 
 -.23i 2 2L 2 2j zGKK#)$? r~   