
    =i                        U d Z ddlZddlZddlZddlmZ ddlZddlZddlm	Z	 ddl
Z
ddlmZ ddlmZ ddlmZ  ee                                          j        d         d	z  Z	 e                    d
d          5 Z e
j        e          Zddd           n# 1 swxY w Y   n# e$ r i ZY nw xY w ee                    dd                                                    Z ej         eeeej                               ej!        e"          Z#e#$                     eeeej                              da%ee	         e&d<   da'da(defdZ)de*ddfdZ+de,de-de-fdZ.de	fdZ/dee	         fdZ0dS )u   模型加载与全局单例管理。

职责概览：
- 按配置和运行环境选择 ASR 设备（cpu/cuda/npu）。
- 初始化并缓存全局 Qwen3ASR 模型实例。
- 对外提供 `init_model` 与 `get_model` 供接口层复用。
    N)Optional)Qwen3ASRModel)Path   )choose_device)preload_speaker_modelgzzm_config.jsonrutf-8encoding	log_levelINFO)levelMODELFreturnc                      t          t                                                    j        dz  dz  } 	 |                     d                              d          S # t          $ r Y dS w xY w)Nbrandzgzzm_ascii.txtr   r   
 )r   __file__resolveparent	read_textrstrip	Exception)banner_paths    src\gzzm\model.py_read_startup_bannerr   (   ss    x..((**1G;>NNK$$g$66==dCCC   rrs   (A 
A*)A*total_secondsc           	      .   t                      }|sd S t          t                              dd                                                                                    dv }d| dd}|rt          t                              dd          pd                                          }	 |                    d	          r
|d
d          }t          |          dk    rt          d          t          |dd         d          }t          |dd         d          }t          |dd         d          }d| d| d| d}n# t          $ r d}Y nw xY wd}	t                              d| d| |	 d|            d S t                              d||           d S )Ngzzm_banner_color1r#   trueyesonzstartup_time: .2fsgzzm_banner_hexz#3a96dd#r      zinvalid hexr            z[38;2;;mz[96mz[0mz%sr   z
%s
%s)r   str_GZZM_CONFIG_TOPgetstriplower
startswithlen
ValueErrorintr   loggerinfo)
r    bannercolor_enabledfooterhex_coder
   gbcolor_escaperesets
             r   _render_startup_bannerrE   0   s   !##F (,,-@#FFGGMMOOUUWW[uuM2m2222F 0'++,=yIIVYWW]]__	&""3'' (#ABB<8}}!! ///HQqSM2&&AHQqSM2&&AHQqSM2&&A444A44444LL 	& 	& 	&%LLL	& D\FFVFUFFfFFGGGGGJ/////s   (BD> >EEvaluedefaultc                 t    | |S t          |                                                                           dv S )Nr$   )r2   r5   r6   )rF   rG   s     r   _parse_boolrI   L   s6    }u::##%%)CCC    c                  j
   t          j                    } t          t                                                    j        d         dz  }	 |                    dd          5 }t          j        |          }ddd           n# 1 swxY w Y   n# t          $ r i }Y nw xY wt          |                    dd          d	          }t          |                    d
          pd                                          }t          |          }|dk    rd}n|dk    rd}nd}t          |rt           s	 t#          |           dat$                              d|           nW# t(          $ r t$                              d           Y n1t          $ r%}t$                              d|           Y d}~nd}~ww xY wt           r,t,          s%t/          t          j                    | z
             dat          S t          |                    dd                                                    }	t          |                    dd                                                    }
t$                              d|	|
           t          j                     }t          |                    d          pd                                          }|}t          |          }t3          |                    dd                    }t3          |                    dd                    }|dk    rDt$                              d           d}t4          j        }t9          t4          j        d           }nY|dk    r*d}t4          j        }t9          t4          j        d           }n)d}t4          j        }t9          t4          j        d           }t?          j         |	|                    d!d"          ||dd|||
|#
  
        atB          j"        #                                 t          j                     |z
  }t$                              d$|d%d&           t$                              d'tI          t          d(d                      |rt           s	 t#          |           dat$                              d|           nW# t(          $ r t$                              d           Y n1t          $ r%}t$                              d|           Y d}~nd}~ww xY wt           r,t,          s%t/          t          j                    | z
             dat          S ))u@   加载并返回 Qwen3 ASR 模型到模块全局变量 `MODEL`。r   r	   r
   r   r   Nr   T)rG   model_device_speakerr   npuznpu:0cudazcuda:0cpu)devicez-Speaker model preloaded on startup, device=%sz;Speaker model preload skipped: speechbrain is not availablez7Speaker model preload failed, fallback to lazy load: %smodel_name_asrzQwen/Qwen3-ASR-0.6Bforced_aligner_modelzQwen/Qwen3-ForcedAligner-0.6Bu0   【开始加载 ASR 模型】model=%s aligner=%smodel_device_asrmax_inference_batch_sizer.   max_new_tokens   uX   未检测到可用 CUDA/NPU 或已指定 CPU，使用 CPU 加载模型（可能较慢）)dtype
device_maphf_cache_dirz/app/hf_cache)		cache_dirtorch_dtyperX   low_cpu_mem_usageuse_safetensorsrT   rU   forced_alignerforced_aligner_kwargsu!   ✅ 模型加载完成！耗时: r(   u    秒zforced_aligner: r^   )%timeperf_counterr   r   r   parentsopenjsonloadr   rI   r4   r2   r5   r   r   _SPEAKER_MODEL_PRELOADEDr   r;   r<   ImportErrorwarning_STARTUP_BANNER_PRINTEDrE   r6   r:   torchfloat32dictfloat16bfloat16r   from_pretrainedtransformersloggingset_verbosity_errorgetattr)init_started_at_config_path_f_GZZM_CONFIGpreload_speaker_enabledcfg_speaker_devicespeaker_primaryspeaker_deviceerQ   rR   
start_loadconfig_devicedevice_hintselected_devicerT   rU   rX   rW   r_   	load_times                        r   
init_modelr   R   s    '))O >>))++3A69KKLsW55 	)9R==L	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)    *,*:*:;RTX*Y*Ycghhh \--.DEEKLLRRTT#$677O% 	F	"	"!" 	]+C 	]]%^<<<<+/(K^\\\\ ^ ^ ^\]]]]] ] ] ]XZ[\\\\\\\\]# 	+,C 	+"4#4#6#6#HIII&*#))*:<QRRSSYY[[N|//0FHghhiiooqq
KKBNThiiiJ (();<<BCCIIKKMK#K00O  #<#3#34NPR#S#STT))*:C@@AAN%nooo
 $-!
 !
 !
 
F	"	"
 $.!
 !
 !

 
 $-!
 !
 !

 )"">?CC!9%+3  E ,,...	j(I
KKGIGGGGHHH
KKK752BD#I#IKKLLL Y'? Y	Y!8888'+$KKGXXXX 	Z 	Z 	ZNNXYYYYY 	Y 	Y 	YNNTVWXXXXXXXX	Y   '(? 't022_DEEE"&Lsr   	B  B5B BB B	B BB.-E $F0	F0F++F06-R$ $$S8
	S8S33S8c                      t           S )N)r    rJ   r   	get_modelr      s    LrJ   )1__doc__osr`   rq   typingr   rp   rj   qwen_asrr   rd   pathlibr   utils.device_utilsr   utils.speaker_idr   r   r   rb   _config_path_toprc   rv   re   r3   r   r2   r4   upper	LOG_LEVELbasicConfigrs   r   	getLogger__name__r;   setLevelr   __annotations__rf   ri   r   floatrE   objectboolrI   r   r   r   rJ   r   <module>r      s     
			              " " " " " "        - - - - - - 3 3 3 3 3 34>>))++3A69KK 			sW		5	5 )$49R==) ) ) ) ) ) ) ) ) ) ) ) ) ) )    C $$[&99::@@BB	  '''9glCC D D D D		8	$	$ GL99 : : : "&x % % %   c    0% 0D 0 0 0 08Dv D D D D D DuM u u u up8M*      s6   &B& =BB& BB& !B"B& &B0/B0