
    7GjJ                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSK	rSSK
Jr  S rS rSgS jr\" \5      R                   r\R$                  R'                  S\" \5      5        SSKrSSKrSSKr\S-  r\" \S	5       r\R9                  S
5        \R:                  " \R9                  5       5      rSSS5        Sr\R@                  RC                  \S\" \5      S9r"\R@                  RG                  \"5      r$\%" \\$RL                  5        \$\RN                  \'   \(" SSS9  SSKJ)r*  \*RV                  r,S r-\-\*l+        \(" SSS9  \-r.S r/\/\*l+        \(" SSS9  \$R`                  r1ShS jr2S r3S r4\2\$l0        \5" \$S5      (       a  \3\$l6        \(" SSS9  O\(" SSS9  \$Rn                  Rp                  r9  SiS jr:\:\$Rn                  l8        \(" SSS9  \$Rn                  Rv                  r<    SjS jr=\=\$Rn                  l;        \(" SSS9  \$R|                  R~                  r@S rAS rB\$R|                  R                  rDS  rE\:rF  SkS! jrG\G\$Rn                  l8        \(" S"SS9  \A\$R|                  l?        \B\$R|                  lB        \E\$R|                  lE        \(" S#SS9  \$R                  R                  rJ SlS$ jrK\K\$R                  lI        \(" S%SS9  S& rL\L\$R|                  lM        \(" S'SS9  SrN\5" \$R|                  S(5      (       a  \$R|                  R                  rN\N(       a  S) rP\P\$R|                  lO        \(" S*SS9  O\(" S+SS9  \5" \$Rn                  S,5      (       at  \$Rn                  R                  rRS- rS\S\$Rn                  lQ        \5" \$Rn                  S.5      (       a*  \$Rn                  R                  rUS/ rV\V\$Rn                  lT        \(" S0SS9  O\(" S1SS9  \(" S2SS9  SSK
JrW  SSKXrY\$R                  r[\W" \R$                  R                  \[5      5      r]S3 r^\^" \]5      r_\`" \$S4S5      ra\a(       a  S5 rb\b\$lc        \(" S6SS9  \_(       ao  \(" S7\] S83SS9  \[rd\W" \YR                  " 5       5      S9-  S:-  rf\fR                  5       (       a/  SSKhri \iR                  " \" \f5      \" \]S:-  5      5        \(" S;SS9  OO\W" \YR                  " 5       5      S9-  r] \]R                  SSS=9  \" \]S?-  5      rdSSKhri \iR                  " \[\d5        \(" S@\[ 3SS9  \d\$lZ        \(" SB\d 3SS9  SC HB  u  rorp\5" \$\o5      (       d  M  \]\p-  rq\qR                  SSS=9  \r" \$\o\q5        \(" SD\o SE\q 3SS9  MD     \(" SFSS9  SSKrsSSKJ)rt  \$Rn                  R                  rvSG rw\w\$Rn                  lu        \(" SHSS9  \(" SISS9  \5" \$SJ5      (       a  \W" \$R                  5      O\]S:-  ry\yR                  5       (       Ga   \yR                  SKSL9r{\R:                  " \{5      r|/ r}/ r~\" \|GR                  5       5       GHH  u  rr\GR                  SMS5      r\(       a  \R$                  R                  \5      (       dw  \GR                  SNS5      r\(       a>  \R$                  R                  \5      (       a  \(" SO\ SP3SS9  \~GR                  \5        O\(" SQ\ SR\ 3SS9  \}GR                  \5        \GR                  SS/ 5      r\=(       d    /  V s/ s H'  n \R$                  R                  U 5      (       d  M%  U PM)     sn r\" \5      \" \=(       d    / 5      :w  d  GM'  \\SS'   \(" ST\ SE\" \5       SU\" \5       3SS9  GMK     \} H  r\|\	 M     \}(       d  \~(       a<  \yGR                  \GR                  " \|SVSWSX9SKSL9  \(" SY\" \}5       SZ\" \~5       3SS9  O\(" S[\" \|5       S\3SS9  O\(" S^SS9  \(" S_SS9  \(" S`SS9  \(" S`SS9  \Sa:X  a  \$R                  5       r\$GR                  Sb\$GR                  4\$R|                  5      r\\l        \\$l        \(" ScSS9  \(" Sd\GR$                  " \GR&                  " 5       5       Se\$GR                   3SS9   \GR)                  5         gg! , (       d  f       GN= f! \k a  rl\(" S<\l 3SS9   SrlClGNUSrlClff = f! \k a.    \W" \R                  " 5       5      S>-  r]\]R                  SSS=9   GNf = f! \k a  rl\(" SA\l 3SS9   SrlClGN
SrlClff = fs  sn f ! \k a  rl\(" S]\l 3SS9   SrlClGNWSrlClff = f! \ a,    \(" SfSS9  \GR-                  5         \GR-                  5          gf = f)mu  
Wrapper script for digital_human_server_v2.pyc
v11.5: Voice library 100% clone - echo removal, single ASR, mandatory sample_text

CRITICAL CHANGES (v11.5):
1. Audio echo removal + de-reverb: afftdn(om=f) subtracts noise floor from spectrum
   - Removes room echo/reverb without altering voice timbre
   - Combined with highpass(80) + moderate nr for noise suppression
2. Single ASR call: removed duplicate _transcribe_audio in patched_train_voice
   - Original train_voice already does ASR → no need to repeat
3. sample_text (试听文本) mandatory: extracted from frontend JSON, saved to voice_info
   - Voice preview uses user's sample_text instead of hardcoded default
   - Fallback to system default only if sample_text missing
4. Clone quality: temp=0.3, top_k=5, top_p=0.5 (unchanged from v11.4)
5. Audio cleaning: smart noise detection preserved from v11.4 + echo removal added

Previous fixes:
- v11.4: Training auto-clone removed; smart noise detection + minimal processing
- v11.3: ref_text auto-transcription + two-pass denoising + clone quality mode
- v11.2: Fixed voice_id mismatch (vc_{timestamp} vs vc_{digital_id})
- v11.0: highpass(80Hz) + afftdn + loudnorm audio cleaning
- v10.2: Direct GPT-SoVITS API call (UTF-8 safe, bypasses GBK bug)
    N)Pathc                     [        U 5      $ )z3Legacy wrapper - delegates to clean_audio_for_clone)clean_audio_for_clone)
audio_paths    &D:/AI-Ad-Agent/portal/dh_v2_startup.pydenoise_audior   (   s     ,,    c           	      :   U (       a$  [         R                  R                  U 5      (       d  g[         R                  R                  [         R                  R	                  [         R                  R	                  [         R                  R                  [        5      5      5      SSS5      n[         R                  R                  U5      (       d  Sn USU SSS/n[        R                  " US	S	S
S9nSnUR                  R                  S5       H  nSU;   d  M  UR                  5       R                  S5      S   R                  5       R                  S5      S   R                  5       nUR                  S5      u  pxn	[        U5      S-  [        U5      S-  -   [        U	5      -   n  O   USU SSSSS/n
[        R                  " U
S	S	S
S9nSu  pUR                  R                  S5       H  nSU;   a<  [        UR                  S5      S   R                  5       R                  5       S   5      nSU;   d  MM  [        UR                  S5      S   R                  5       R                  5       S   5      nM     USU SSSSS/n[        R                  " US	S	SS9nSnSnUR                  R                  S5       H  nSU;   d  SU;   d  M  US-  nM     US:  a  SnOUS:  a  S nOS!nUXU4$ !    N= f!    GM  = f! [         a  n[        S"U 3S	S#9   S$nAgS$nAff = f)%z
Analyze audio for noise floor and volume level.
Returns: (noise_floor_db, mean_volume_db, peak_volume_db, duration_s)
noise_floor is estimated from the quietest segments.
)NNNNffmpegbin
ffmpeg.exe-i-fnull-T
   capture_outputtexttimeoutr   
	Duration:   ,:  <   -afvolumedetect)imean_volume
max_volumezsilencedetect=n=-50dB:d=0.1   isilence_startsilence_endr    iz&[AudioAnalyze v11.5] Analysis failed: flushN)ospathexistsjoindirnameabspath__file__
subprocessrunstderrsplitstripfloat	Exceptionprint)r   _ffmpeg_exe_dur_cmd_dur_r_dur_line_parts_h_m_s_vol_cmd_vol_r_mean_peak
_noise_cmd_noise_r_noise_floor_silence_count_es                      r   _analyze_audio_noiserK   ,   s    RWW^^J77%'',,rwwrwwrwwx?X/YZ'>K77>>+&&-&z4EDRTU]]((.Ee#,,[9!<BBDJJ3OPQRXXZ#\\#.
Ry4'%)b.859D /  z5.$PVX[\DRTU]]((.E%"5;;s#3A#6#<#<#>#D#D#Fq#IJUu$"5;;s#3A#6#<#<#>#D#D#Fq#IJU / "4:D&#O
>>*TVXY__**40E%'=E+A!# 1 ALS[LLU4//-  *  &6rd;4H%&sW   AK9 CK9 2<K).K9 6<K02AK9 !K9 )K-+K9 0K62K9 9
LLL c                  	   U (       a$  [         R                  R                  U 5      (       d  U $ [         R                  R                  [         R                  R	                  [         R                  R	                  [         R                  R                  [        5      5      5      SSS5      n[         R                  R                  U5      (       d  SnS[         R                  R                  U 5      ;   d#  S[         R                  R                  U 5      ;   a  U $ [         R                  R	                  U 5      n[         R                  R                  [         R                  R                  U 5      5      S   n[         R                  R                  X4 S35      nU(       a  SU S	3OS
n[        U 5      u  pxpUc  [        SU S3SS9  U $ US:  a  Ub  US:  a   USSU SSSSSSU/n[        R                  " USSSS9nUR                  S:X  a[  [         R                  R                  U5      (       a7  [         R                  R                  U5      S:  a  [        SU SUS S3SS9  U$ [        SU S U S!3SS9  U $ S"nS#nUb  US:  a
  US$-  nUS%-  n USSU SUSSSSU/n[        R                  " USSS&S9nUR                  S:w  dG  [         R                  R                  U5      (       a#  [         R                  R                  U5      S:  a  [        SU S'3SS9  U $ [        R                  " USUSS(S)S*S+/SSS,S9nS-nUR                   R#                  S.5       HG  nS/U;   d  M  [%        UR#                  S05      S1   R'                  5       R#                  5       S   5      nMI     US2:  a  [        SU S3US S43SS9  U $ [         R                  R                  U 5      n[         R                  R                  U5      n[        SU S5U S6[         R                  R                  U 5       S7U S8U S9U S:US S;3SS9  U$ ! [         a     GNf = f!    M  = f! [         a  n[        SU S<U S=3SS9  U s SnA$ SnAff = f)>u  
v11.5: Smart audio cleaning with echo removal for 100% voice cloning.

Strategy:
  1. Analyze noise floor first
  2. Clean audio (noise_floor < -55dB) → skip processing (preserve timbre)
  3. Any noise → highpass(80Hz) + afftdn(om=f, nr=8) echo removal + noise suppression
     - om=f: subtract noise floor from spectrum (effectively removes steady echo/reverb)
     - nr=8: moderate noise reduction that won't affect voice harmonics
  4. Volume normalization ONLY if mean < -25dB (preserve dynamics)

Key insight: afftdn om=f mode estimates the noise spectral floor and subtracts it
from the signal spectrum. This removes steady noise AND room echo/reverb without
affecting the voice's formant structure, transients, or pitch.

Returns: path to cleaned audio, or original if clean enough
r   r   r   _cleaned	_denoisedr   z_cleaned.wavz []rL   Nz[AudioClean v11.5]z& Analysis failed, using original audioTr(   r&   i-yr   r   z)loudnorm=I=-18:TP=-1.5:LRA=11:linear=true-ar16000z-ac1r   r   i  z Clean audio, volume boost (z.1fzdB -> -18dB)z Audio is clean (noise=z!dB), raw original for 100% timbrez(highpass=f=80,afftdn=nr=8:nt=w:bn=1:om=fzecho+denoisez*,loudnorm=I=-18:TP=-1.5:LRA=11:linear=truez+normZ   z" Processing failed, using originalr   r   r   r   r   r    r   r!   r   r   r'   z Output too quiet (zdB), using original : z (z->z bytes, noise=z	dB, mean=zdB)z Error: z, using original)r*   r+   r,   r-   r.   r/   r0   basenamesplitextrK   r8   r1   r2   
returncodegetsizer7   r3   r4   r6   r5   )r   labelr9   _dir_base_out_labelrH   	_mean_vol	_peak_volr<   _cmd_result_af_desc
_vol_check	_out_meanr=   
_orig_size	_new_sizerJ   s                        r   r   r   i   sY   $ RWW^^J77'',,rwwrwwrwwx?X/YZ'>K77>>+&& RWW%%j11[BGGDTDTU_D`5`77??:&DGGRWW--j9:1=E77<<|45D#r%]F 0DJ/O,LY"6(*PQY]^ c Y_	#T4JwsD: %..dWYZ%%*rww~~d/C/CX\H]`dHd.vh6RS\]`Raamnvz{K 	"6(*A,Opqy}~ 5CE S;;T4sE7E3>..drR""''..*>*>"''//RVBWZ^B^&vh.PQY]^  ^^$e^T63OdB

 	&&,,T2E%!&u{{3'7':'@'@'B'H'H'J1'M!NY 3
 s?&vh.A)CPcdlpqWW__Z0
GGOOD)	"6(!E7"RWW5E5Ej5Q4R SR	{.iPYZ]^acjn	pY  D   "6((2$6FGtTsX   BP= B
Q AQ %<Q!Q ?A=Q =
Q
QQQ 
Q= Q82Q=8Q=zdigital_human_server_v2.pycrb   digital_human_server_v2)loaderoriginz^[Patch v11.5] Echo removal (afftdn om=f) + smart cleaning + single ASR + mandatory sample_textTr(   c            	          [        U 0 UD6$ ! [         Ga    SSKnSSKnU (       a  U S   OUR	                  SS5      n[        US5      (       a  UR                  nO[        US5      (       a  UR                  nSSKnUR                  R                  [        U5      5      nUR                  R                  UR                  UR                  =(       d    SUR	                  SS	5      S
9nSn0 n	[        U S   S5      (       a(  U S   R                   n[#        U S   R$                  5      n	O'[        U S   S5      (       a  U S   R'                  5       nSn
[        U S   S5      (       a#  U S   R(                  (       a  U S   R(                  n
UR+                  XR,                  UR.                  (       a  SUR.                  -   OS-   XS9  UR1                  5       nUR3                  5       n " S S5      nU" X5      s $ f = f)z:Wrap urlopen to handle non-UTF-8 responses from GPT-SoVITSr   NurlrL   full_urlselectorP   r      r   GETmethod
get_methoddata?)bodyheadersc                   ,    \ rS rSrS rS rS rS rSrg)#_safe_urlopen.<locals>.SafeResponsei  c                 `    UR                   U l         UR                  U l        Xl        X l        g N)statusreasonr}   _data)selfrrz   s      r   __init__,_safe_urlopen.<locals>.SafeResponse.__init__  s"    hhhh !
r	   c                     U R                   $ r   )r   r   s    r   read(_safe_urlopen.<locals>.SafeResponse.read  s    zz!r	   c                     U $ r    r   s    r   	__enter__-_safe_urlopen.<locals>.SafeResponse.__enter__  s    r	   c                     g r   r   )r   argss     r   __exit__,_safe_urlopen.<locals>.SafeResponse.__exit__   s    r	   )r   r}   r   r   N)	__name__
__module____qualname____firstlineno__r   r   r   r   __static_attributes__r   r	   r   SafeResponser     s    "
"r	   r   )_original_urlopenUnicodeDecodeErrorhttp.clientiogethasattrrr   rs   urllib.parseparseurlparsestrclientHTTPConnectionhostnameportrx   dictr}   ry   rz   requestr+   querygetresponser   )r   kwargshttpr   rq   urllibparsedconnrx   r}   r|   resp	resp_datar   s                 r   _safe_urlopenr      s   /- $1&11 -- 	d1g6::eR#83
##,,CS*%%,,C&&s3x0{{))&//6;;;L"V\V`V`ajlnVo)p47H%%!W^^F47??+GT!Wl++!W'')F47F##Q7<<DV[[&,,C&,,,>TVW^bt!IIK		 	 D,,[--s   
 G+G;:G;z2[Patch v8.3] urlopen(): UTF-8 safe wrapper appliedc                  "   SnU (       aQ  U S   n[        US5      (       a  UR                  nO@[        US5      (       a  UR                  5       nO[        U5      nOUR	                  SS5      nS[        U5      ;   a  S[        U5      ;   d  S[        U5      ;   ae  [        S	U 3S
S9  U (       aQ  [        U S   S5      (       a=  U S   R                  (       a)   [        U S   R                  5      SS n[        SU 3S
S9  [        U 0 UD6$ !    N= f)z%Log GPT-SoVITS requests for debuggingrL   r   rr   get_full_urlrq   9880ttscontrolz'[Patch v9.1 DEBUG] GPT-SoVITS request: Tr(   rz   N  z$[Patch v9.1 DEBUG] GPT-SoVITS body: )r   rr   r   r   r   r8   rz   _safe_urlopen_v2)r   r   rq   reqdata_strs        r   _debug_urlopenr   -  s     C1g3
##,,CS.))""$Cc(Cjj#SuC0IS4I7u=TJGDGV,,atAw||,Tc2<XJGtT T,V,,s   (D
 
DzC[Patch v9.1] urlopen(): debug logging added for GPT-SoVITS requestsc           	      V   SSK n[        R                  R                  U 5      n[        R                  R	                  US[        R                  R                  U 5      -   S-   5      n[        R                  R	                  US[        R                  R                  U 5      -   S-   5      n [        USSS9 n[        R                  " XS	S
S9  SSS5        [        R                  R                  U 5      (       a   [        R                  " X5        [        R                  " X`5        g! , (       d  f       N`= f! [         a     N4f = f! [         aV  n	[        SU	 3SS9  [        U SSS9 n[        R                  " XS	S
S9  SSS5         Sn	A	g! , (       d  f        Sn	A	g= fSn	A	ff = f)zAtomic write: write to .tmp then rename. Prevents data loss on crash.
v0.6.1: Accepts lock_name (from original _save_json signature) but ignores it;
atomic file replacement provides equivalent thread safety.
r   N.z.tmpz.bakwutf-8encodingF   ensure_asciiindentz-[Patch v0.6] _save_json atomic write failed: Tr(   )tempfiler*   r+   r.   r-   rX   openjsondumpr,   replacer7   r8   )
filepathrz   	lock_namer   _tfr]   	_tmp_path	_bak_pathfes
             r   _safe_save_jsonr   N  s:   
 77??8$DT3)9)9()C#Cf#LMIT3)9)9()C#Cf#LMI=)S73qIIdE!< 4 77>>(##

8/ 	

9' 43    ==aSAN(C'2aIIdE!< 3222=sr   +E 6D',E :D8 E '
D51E 8
EE EE 
F(F#*FF#
F 	F# F##F(c                     [        XSS9$ )z}v0.6.1: Patched replacement for _save_json_nolock (used by _save_task/_update_task).
Uses atomic write instead of file locks.N)r   )r   )r   rz   r   s      r   _safe_save_json_nolockr   g  s     8T::r	   c                 0   [        [        S[        R                  R	                  [        R                  R                  [        R                  R                  [        R                  R                  [        5      5      5      SS5      5      n[        X5        g)z'Helper to save voices with atomic writeVOICES_FILEdigital_human_v2voices.jsonN)	getattrmoduler*   r+   r-   r.   r/   r0   r   )voicesvo_files     r   _safe_save_voicesr   l  sX    fmRWW\\
(ABCM.+ ,G G$r	   _save_json_nolockzM[Patch v0.6.1] _save_json() and _save_json_nolock(): atomic write with backupz3[Patch v0.6] _save_json(): atomic write with backupc           	      ^   [        XX#XE5      u  pXiS'   / U	S'   U	R                  SS5      n
U
(       a  [        R                  R	                  U
5      OSnU
(       Ga  [        R                  R                  U
5      (       Ga   SSKn[        R                  R                  [        R                  R	                  [        R                  R	                  [        R                  R                  [        5      5      5      SSS	5      nUR                  US
[        U
5      SSS/SSSS9nSUR                  ;   nU(       Ga  [        SSS9  UR                  S5      (       a  UR                  SS5      OSnU(       Ga  [        R                  R                  [        R                  R	                  [        R                  R	                  U5      5      SU5      n[        R                  R                  US5      n[        R                  R                  US5      n[        R                  R                  U5      (       a  [!        US5      nUU:w  a  UOUnU
S-   n[        R                  " U
U5        SSKnUR%                  UU
5        [        SU 3SS9  [        R                  R                  U5      (       a  [!        US5      nUU:w  a  UOUn[        R                  R                  US5      nUR%                  UU5        UU	S'   U/U	S'   [        R                  R'                  U5      S-  U	S '   [        S!SS9  S#U	R                  S$S5      ;   a  X)S$'   [        S%U S&3SS9  U	R                  S'5      S(:X  a  S)U	S''   [        S*SS9  U(       a:  UR+                  5       (       a%  UR+                  5       U	S+'   [        S,USS-  S.3SS9  O
[        S/SS9  [,        R/                  5       nU	UU'   [1        U5        [        S0U S1U S2U(       a  S3OS4 S53SS9  X4$ ! [(         a  n[        S"U 3SS9   SnANSnAff = f)6u  v11.5: Voice library 100% cloning with echo removal + sample_text storage

Original train_voice already does: audio conversion → snippet clip → ASR → save voice_info.
v11.5 enhancements:
  - Replace 32000Hz synthetic reference.wav with cleaned original audio
  - Store user's sample_text (试听文本) for preview use
  - Single ASR (original's) — no duplicate transcription
  - Force mode=zero_shot, type=clone
typeaux_ref_audios	ref_audiorL   r   Nr   r   r   r   r   r   r   Tr   r   z32000 HzzX[Patch v11.5] Detected 32000Hz synthetic reference.wav, replacing with original audio...r(   vc_dh_dh_trainedzref_processed.wavztrain_ref_audio.wavvoice_lib_refz.synthetic_bakz&[Patch v11.5] Replaced reference.wav: voice_lib_fullzreference_full.wavref_audio_fulli }  full_durationz"[Patch v11.5] Saved full referencez9[Patch v11.5] Reference audio fix failed (non-critical): u   默认音色namez![Patch v11.5] Fixed voice name: ''modedefault_tts	zero_shotz:[Patch v11.5] Changed voice mode: default_tts -> zero_shotsample_textz"[Patch v11.5] sample_text stored: (   z...zM[Patch v11.5] Warning: no sample_text provided, preview will use default textz+[Patch v11.5] Voice library clone SUCCESS: z (mode=zero_shot, type=, sample_text=YESNO))original_train_voicer   r*   r+   r.   r,   r1   r-   r/   r0   r2   r   r3   r8   
startswithr   r   shutilcopy2r[   r7   r5   r   _load_voicesr   )r   r   
voice_namelanguage
output_dirtask_id
voice_typer   voice_id
voice_infor   	voice_dir_subprocess_sp_ffmpegrd   is_32kvoice_id_short	train_dirprocessed_ref	train_ref
_clean_ref_ref_source_bak_shtl_clean_train_train_sourcefull_ref_pathrJ   r   s                                r   patched_train_voicer    s    0*2<GH $v#%J {B/I /8	*RIRWW^^I..$	`/ggll277??277??277??S[C\3]#^#+ULBG$(('4YvWZ)[7;$PR ) TG7>>1Fpy}~FNFYFYZbFcFc!1!1(E!Bik! "RWW__RWW__Y=W-X,5~!GI$&GGLL<O$PM "Y8M NIww~~m44%:=/%Z
4>-4OjUb(+;;

9d3.K; F{mT\`a77>>)44+@L\+]L<HI<UL[dM,.GGLLDX,YM!KK}E;HJ'78<I?J'78:<''//-:X\e:fJ7!$FtT
 33'61*Q?tL ~~f.(
6JSWX
 {((**$/$5$5$7
=!2;s3C2DCHPTU]fjk   "F!F8f	7zAXYcXddr  }Hsx  NR  sS  ST  U  ]a  b9  	`MbTRZ^_	`s   J/P 
P,P''P,zL[Patch v11.5] train_voice(): echo removal + sample_text storage + single ASRc                    U(       d  U(       a   [         R                  5       nUR                  5        H  u  pUR                  SS5      nU(       d  M   [        R
                  R                  U5      [        R
                  R                  U5      :X  d  Mb  UR                  S/ 5      nU(       a  UnU(       d  UR                  SS5      n  O    / nU(       Ga  [        U[        [        45      (       Ga  [        R
                  R                  [        R
                  R                  [        R
                  R                  [        R
                  R                  [        5      5      5      SSS5      nS	SKnU GHM  nU(       d  M  [!        U5      R#                  5       (       d  M-   US
[%        U5      SSS/nS	SKnUR)                  USSS9nSnUR*                  R-                  S5       H  nSU;   d  M  UR/                  5       R-                  S5      S   R/                  5       R-                  S5      S	   R/                  5       nUR-                  S5      u  nnn[1        U5      S-  [1        U5      S-  -   [1        U5      -   n  O   Ub  US::  a  UR3                  U5        GM+  [        R
                  R                  UR5                  5       S[        R
                  R7                  U5      R9                  SS5      5      n [        R:                  " [        R
                  R                  U 5      SS9  [        R
                  R#                  U 5      (       d'  USS
[%        U5      SSSS S!S"U /n!UR)                  U!SS#S$9  [        R
                  R#                  U 5      (       a  UR3                  U 5        GM<  UR3                  U5        GMP     U(       a  UnU(       a  UR/                  5       (       d  UnU	S%:X  a  S&u  n"n#n$O U	S':X  a  S(u  n"n#n$OU	S):X  a  S*u  n"n#n$OS+u  n"n#n$US%:X  a  U	S,;  a  [=        S-U	 S.3SS/9  S&u  n"n#n$S	S0KJ n%J!n&  UUUU[%        U5      S1S2S3S4[%        U$5      [%        U"5      S5.n'US6:g  =(       a    USL=(       d    Sn(U((       aQ  U(       aJ  UR/                  5       (       a5  UR/                  5       UR/                  5       :w  a  UR/                  5       U'S7'   U(       a  [E        U5       H  u  n)n*U*U'S8U) S93'   M     U RF                  S:-   n+[=        S;U+ S<USS#  3SS/9  S	SK$J%n,  S=n-Sn.[M        U-5       GH]  n/ / n0U'R                  5        H<  u  n1n2U&" [%        U15      SS>9n3U&" [%        U25      SS>9n4U0R3                  U3 S?U4 35        M>     S@R                  U05      n5U+ SAU5 3n6U,RO                  U6SBSC9n7U,RQ                  U7SDSE9 n8U8RR                  SF:X  a  U8RU                  5       n9U(       ae  [        R:                  " [        R
                  R                  U5      SS9  [W        USG5       n:U:RY                  U95        SSS5        UsSSS5        s  $ UsSSS5        s  $ U/U-S-
  :  a"  [Z        R\                  " S=5         SSS5        GMT   SSS5        GM`     U.(       a  U.eg! [         a  n SnAGNSnAff = f! [         a    UR3                  U5         GMg  f = f! , (       d  f       N= f! , (       d  f       GM  = f! [         aA  nUn.[=        SHU/S-    SIU 3SS/9  U/U-S-
  :  a  [Z        R\                  " S=5         SnAGM  e SnAff = f)Ja  
v10.2: Bypass original_synthesize - direct GPT-SoVITS API call
FIXES:
- orig. pyc has GBK encoding bug that garbles Chinese text
- orig. pyc uses ref_processed.wav (synthetic) instead of reference.wav
- v10.2 calls GPT-SoVITS API directly with correct UTF-8 encoding
r   rL   r   r   Nr   r   r   r   r   r   r   r   T)r   r   r   r   r   r   r   r   r   g      $@dh_v2_trimmed.wavz_trim9s.wavexist_okrQ   z-tz9.5z-acodec	pcm_s16lerR   rS   ru   )r   r   clone)g333333?         ?precise)r  r   g333333?balanced)gffffff?r#   g?)      ?   r  )r  z&[Patch v11.5] Auto-switching quality: z -> clone (voice_type=clone)r(   )	urlencodequotewavfalsecut1rT   )r   	text_langref_audio_pathprompt_langspeed_factor
media_typestreaming_modetext_split_method
batch_sizetop_ptemperaturer   prompt_textzaux_ref_audio_paths[rP   z/ttsz&[Patch v10.2] Direct GPT-SoVITS call: z text=   )safe=&r{   rw   )rx   i,  rv      wbz'[Patch v10.2] GPT-SoVITS error attempt rW   )/r   r   itemsr   r*   r+   normpathr7   
isinstancelisttupler-   r.   r/   r0   r   r   r,   r   r1   r2   r3   r4   r5   r6   append
gettempdirrX   r   makedirsr8   r   r!  r"  	enumeratebase_urlurllib.requestr   rangeRequesturlopenr   r   r   writetimesleep);r   r   r'  ref_textr   speedgpt_weightssovits_weightsoutput_pathqualityseedaux_ref_audio_pathsr  r   vidvinfo
stored_refauxr   _trimmed_auxr  	_tempfile_pathr:   _sprd   r<   r=   r>   r?   r@   rA   _trimmed_pathrc   r/  top_kr.  r!  r"  params	_is_cloneiaprq   _ureqmax_retries
last_errorattemptquery_partskvencoded_keyencoded_valquery_stringrr   r   r   
audio_datar   s;                                                              r   patched_synthesizeri    sb    >	((*F$lln
"YY{B7
:"''"2"2:">"''BRBRSaBb"b))$4b9C.1+%%*YYvr%:
 - Lz*=e}MM'',,rwwrwwrwwx?X/YZ'>$(Eue++--/ 's5z4MH,!gght$gOGD!(!5!5d!;&%/%*[[]%8%8%Ea%H%N%N%P%V%VWZ%[\]%^%d%d%fF)/c):JBB#(9t#3eBi"n#DuRy#PD! "< |tt|$++E2 $&GGLL!,,.((/77N%PM KK >N77>>-88 'tSZu );w WT2Fww~~m44$++M:$++E27 )< ". 8>>++ '$/!UE	I	$0!UE	J	$0!UE$0!UE W
!:6wi?[\dhi$/!UE .(E
!#U;'F( },R:T3I3QTIX(.."2"2x~~7G4::<7W ( 0}23EAr24F)!A./ 4 --&
 C	23%vd3Bi[
IQUV #KJ%	 K1#CF4#CF4""k]!K=#AB ' 88K0La~.H---7CsC0D;;#%!%J"BGGOOK$@4P!+t4GGJ/ 5* 10 ' 10 {Q.JJqM 10 / 10 &D Y  		J ! / ''../j 54 10  	J;GAI;bLTXYq(

1	s   A Z( >Z( 5Z( Z( &A
[ 4B,[ #D[ 4[ B
\A&[41[#	[4	\[4	\% [4\\(
Z=8Z= [ [ #
[1-[44
\	>\\
]4]]]zC[Patch v10.2] synthesize(): direct GPT-SoVITS API call (UTF-8 safe)c                     U R                   S:X  a  U R                  5       $ U R                   S:X  a  U R                  5       $ U R                   R                  S5      (       a  [	        U 5      $ [        U 5      $ )zHv8.0: Add /voice/reseed endpoint + intercept /voice/train for voice_typez"/api/digital-human/v2/voice/reseedz!/api/digital-human/v2/voice/trainz#/api/digital-human/v2/voice/preview)r+   _handle_voice_reseed_patched_handle_voice_trainr   patched_handle_voice_previeworiginal_do_POSTr   s    r   patched_do_POSTro    sl     yy88((** yy77//11 yyABB+D11D!!r	   c           	      |    [        U R                  R                  SS5      5      nUS:  a  U R                  R	                  U5      OSn[
        R                  " U5      nUR                  SS5      n[        R                  5       nXE;  a  U R                  SSS05        g	SS	K
nUR                  SS
5      nXuU   S'   [        R                  [        R                  U5        [        SU SU 3SS9  U R                  SSXtS.5        g	! [         a*  nU R                  SSS[!        U5       305         S	nAg	S	nAff = f)z&Generate a new random seed for a voiceContent-Lengthr      {}r  rL     error   声音不存在NirN  z[Patch v8.0] Voice z reseeded: Tr(   r5  )successrN  r  r   u   重新随机种子失败: )intr}   r   rfiler   r   loadsr   r   _json_responserandomrandint
_save_jsonr   r8   r7   r   )	r   content_lengthr|   rz   r  r   r{  new_seedr   s	            r   rk  rk    s#   ST\\--.>BC2@12Dtzz~.%zz$88J+$$&!g/@%AB>>!Z0#+x &,,f5#H:[
C4PCT8!Z[ SC'-GAx+P!QRRSs   BD  A&D 
D; D66D;c                 *   [        U R                  R                  SS5      5      nUS:  a  U R                  R	                  U5      OSnSnSnSn [
        R                  " U5      nUR                  SS5      nUR                  SS5      =(       d    SnUR                  SS5      =(       d    Sn[        S	U S
U(       a  SOS SU(       a  SOS 3SS9  Sn[        U S5      (       a2  [        U R                  S5      (       a  U R                  R                  nO%[        [        S5      (       a  [        R                  nU(       aA  [        US5      (       a0  X7R                  l        XGR                  l        XWR                  l        SSKnU R                  n	UR)                  U5      U l         [+        U 5      n
Xl        U(       aM  [        US5      (       a<  S H6  n[        UR                  U5      (       d  M   [-        UR                  U5        M8     U
$ ! [
        R                  [        4 a     GN]f = f! Xl        U(       aO  [        US5      (       a=  S H6  n[        UR                  U5      (       d  M   [-        UR                  U5        M8     f f f = f)zAv11.5: Extract voice_type + sample_text + ref_text from form datarq  r   rr  r  rL   r  r   rH  z [Patch v11.5] Voice train: type=r   r   r   z, ref_text=Tr(   Nserverengine_global_engine
gpt_sovits)_pending_voice_type_pending_sample_text_pending_ref_text)rw  r}   r   rx  r   r   ry  r8   JSONDecodeError
ValueErrorr   r  r  r   r  r  r  r  r  r   BytesIOoriginal_handle_voice_traindelattr)r   r~  r|   r  r   rH  rz   r  r   original_rfileresult_attrs               r   rl  rl    s8   ))*:A>?N.<q.@4::??>*eDJKHzz$XXlG4
hh}b17R88J+1r0NT_5eiJjju  @Hv{  NR  vS  T  \`  	a FtX74;;#A#A##	)	*	*&&'&,//0:-1<..6+ZZND!DJ6,T2#
gfl33]6,,e44F--u5 ^ M7   *- * $
gfl33]6,,e44F--u5 ^ 46s%   BH ,H4 H10H14=J5Jc                 D   U(       aD  [         R                  R                  U5      (       a   [        US5      nXq:w  a  [	        SU 3SS9  UnUc  [        U SS5      n[        U SS5      =(       d    Sn[        U S	S5      =(       d    Sn	U	(       a  Xl        [        XX#XEUUS
9$ )zQv11.5: Voice library upload with echo removal + sample_text + ref_text extractionvoice_lib_clonez5[Patch v11.5] Using cleaned audio for voice library: Tr(   r  r  r  rL   r  )r   )r*   r+   r,   r   r8   r   _user_ref_text_original_train_voice_for_type)
r   r   r   r   r   r   r  rO   _sample_text	_ref_texts
             r   patched_train_voice_with_typer    s     bggnnZ00)*6GH	"I)U]ab"JT#8'B
 4!7<BL126<"I
 ')$J+5
7CE Er	   zV[Patch v11.5] train_voice_with_type(): echo cleaning + sample_text/ref_text extractionz6[Patch v8.0] do_POST(): reseed + voice_type extractionc                     U
S;  a  Sn
[        SU SU SU
 3SS9  Xl        UR                  SS	5        [        XX#UXVXxU	4
0 UD6$ )
a  
v8.3: Enhanced generate with 100% voice cloning.
- lip_sync_mode is stored in self._lip_sync_mode (NOT passed to original)
  because original _do_generate doesn't accept it as a parameter
- The patched synthesize will auto-load aux_ref_audios from voices.json
)rM  syncrM  z [Patch v8.3] _do_generate: task=z, voice=z, lip_sync=Tr(   lip_sync_modeN)r8   _lip_sync_modepoporiginal_do_generate)r   r   
digital_idr   r  bg_modebg_colorbg_image_pathrI  output_sizer  r   s               r   patched_do_generater    sn     //!	,WIXhZ{S`Ra
bjno (
JJ%z=  r	   zK[Patch v8.3] _do_generate(): lip_sync_mode routed via engine._lip_sync_modec                    [        SSS9  SSKnSSKn [        U R                  R                  SS5      5      nUS:  a  U R                  R                  U5      OSn[        U[        5      (       a   UR                  S5      n[        R                  " U5      nUR                  SS5      nUR                  SS5      nU(       d  U R                  SSS05        g[        R!                  5       nXh;  a  U R                  SSS05        gX   n	U	R                  SS5      =(       d    Sn
U
(       a  U
n[        S[#        U5       S3SS9  O U(       a  Un[        SSS9  OSn[        SSS9  Sn[%        U S5      (       a1  [%        U R&                  S5      (       a  U R&                  R(                  nUc  [+        [        SS5      nUb  [%        US5      (       d  U R                  SSS05        gUR,                  n[%        US5      (       a*  UR/                  5       (       d  U R                  SSS 05        gU	R                  S!S5      nU	R                  S"S5      nU	R                  S#S$5      nU	R                  S%5      nU	R                  S&/ 5      nU(       a  UR1                  5       (       d  Un[        S'SS9  S(nU	R                  S)5      =(       d    SnU	R                  S*5      =(       d    Sn[        S+U S,U S-U S.[#        U5       3SS9  SSKn[4        R6                  R9                  UR;                  5       S/5      n[4        R<                  " USS09  [4        R6                  R9                  US1U S2[        [>        R>                  " 5       5       S335      nURA                  UU(       a&  [4        R6                  RC                  U5      (       a  UOSUUS4UUUUUUU	R                  S5S(5      S69nU(       a  UOUnU(       Ga)  [4        R6                  RC                  U5      (       Ga  [E        US75       nUR                  5       nSSS5        [#        W5      S:  a  URG                  U5      R                  S85      n[4        R6                  RI                  U5      S9   RK                  5       RM                  S:S5      nS;S<S=S>.R                  US;5      n[        S?[#        U5       S@U 3SS9  U R                  SASUUU[#        U5      SB.5        g[        SCSS9  U R                  SDSSE05        g[        SFSS9  U R                  SDSSG05        g! [         a    UR                  SS	S
9n GNf = f! , (       d  f       GN.= f! [N        RP                  RR                  [T        RV                  [X        4 aS  n [        SHU  3SS9  UR[                  5          U R                  SISSJ[]        U 5       305         Sn A g!     Sn A g= fSn A f[^         aS  n [        SKU  3SS9  UR[                  5          U R                  SDSSL[]        U 5       305         Sn A g!     Sn A g= fSn A ff = f)MzOv11.5: Voice preview using user's stored sample_text for 100% accurate auditionz4[VP_ENTER] patched_handle_voice_preview v11.5 calledTr(   r   Nrq  rr  r   r   )errorsr  rL   r     rt  u   缺少 voice_idrs  ru  r   z6[Patch v11.5] VoicePreview: using stored sample_text (z chars)zE[Patch v11.5] VoicePreview: using caller text (no sample_text stored)uH   大家好，我是您的专属数字人主播，欢迎来到直播间！z5[Patch v11.5] VoicePreview: using system default textr  r  r  r       GPT-SoVITS 引擎未就绪check_availableu,   GPT-SoVITS 服务不可用，请稍后重试r   rH  r   zhrN  r   zO[Patch v8.1] VoicePreview: ref_text was empty, using synthesis text as fallbackr  rJ  rK  z"[Patch v11.5] VoicePreview: voice=z, seed=z
, quality=z, text_len=voice_previewsr  preview__r  r  r   r   r'  rH  r   rI  rJ  rK  rL  rM  rN  rO  r  rk   asciir   r   	audio/wavz
audio/mpegz	audio/ogg)r#  mp3oggz&[Patch v11.5] VoicePreview: SUCCESS - z bytes, format=r5  rv  r  audio_base64
audio_mime
audio_sizez/[Patch v11.5] VoicePreview: audio file is emptyr   u0   语音合成失败：生成的音频文件为空z4[Patch v11.5] VoicePreview: no output file generatedu*   语音合成失败：未生成音频文件z+[Patch v11.5] VoicePreview: network error: i  u+   GPT-SoVITS 连接超时，请稍后重试: z#[Patch v11.5] VoicePreview: error: u   试听失败: )0r8   base64	tracebackrw  r}   r   rx  r   r9  bytesdecoder   r   ry  rz  r   r   lenr   r  r  r   r  r  r5   r   r*   r+   r-   r=  r>  rF  
synthesizer,   r   	b64encoderY   lowerr   r   rt  URLErrorsocketr   ConnectionError	print_excr   r7   )!r   b64r  r~  r|   rz   r  _caller_textr   r  _stored_sampler   r  gsr   rH  r   rN  r   rM  rJ  rK  r   preview_dirrL  result_path
final_pathr   audio_bytes	audio_b64extmimer   s!                                    r   rm  rm  3  s   	
@MRT\\--.>BC2@12Dtzz~.%dE"">{{7+ zz$88J+xx+g/@%AB$$&!g/@%AB%
 $r:@b!DJ3t9+U\]eijDYbfg]DIRVW 4""wt{{H'E'E[[''F>V%5t<F>!>!>g/K%LM 2())"2D2D2F2Fg/]%^_ NN;3	>>*b1>>*d3~~f%#(8"= x~~//Hclpq  !nn]3;t#(89AT28*GD6T[S\\ghklphqgrs{  	A 	ggll8#6#6#8:JK
K$/ggll;(8*Ac$))+FVEWW[0\] mm(1bggnnY6O6O9UY#)# .!~~fg6 $ 
  %0[[
"''..44j$'1ffh ( ;!#MM+6==gF	gg&&z215;;=EEc2N*<TXXY\^ij>s;?O>PP_`c_demqr##C# ($-"&"%k"2*  GPTU##C'3e)fgHQUVg/[%\]{ & >{{79{=>P ('. LL!!6>>?C ;A3?tL	g1\]`ab]c\d/e%fgg	 3A37tD	gAx/H%IJJ	s   AU4 2U AU4 -U4 C U4 (AU4 /G;U4 *U";CU4 U4 "U4 UU4 UU4 "
U1,U4 43Y'W5 W**W2,W52W55YY  YYYYYzB[Patch v8.0] _handle_voice_preview(): base64 inline + 100% cloning_handle_voice_synthesizec                     [        U R                  R                  SS5      5      nUS:  a  U R                  R	                  U5      OSn[
        R                  " U5      nUR                  SS5      nUR                  SS5      nU(       a  U(       d  U R                  SSS	05        g
[        R                  5       nXF;  a  U R                  SSS05        g
Xd   nS
n[        U S5      (       a1  [        U R                  S5      (       a  U R                  R                  nUc  [        [        SS
5      nUb  [        US5      (       d  U R                  SSS05        g
UR                  n	UR                  SS5      n
UR                  S/ 5      nUR                  SS5      nU(       a  UR                  5       (       d  UnSS
Kn["        R$                  R'                  UR)                  5       S5      n["        R*                  " USS9  ["        R$                  R'                  USU S[        [,        R,                  " 5       5       S35      nU	R/                  UU
(       a&  ["        R$                  R1                  U
5      (       a  U
OS
UR                  SS5      UR                  SS5      SUR                  S5      =(       d    S
UR                  S 5      =(       d    S
US!UR                  S"5      UUR                  S#S!5      S$9nU(       a  UOUnU(       a  ["        R$                  R1                  U5      (       ak  SS
Kn[5        US%5       nUR	                  5       nS
S
S
5        UR7                  W5      R9                  S&5      nU R                  S'SUUS([;        U5      S).5        g
U R                  S*SS+05        g
! , (       d  f       Ne= f! [<         a>  nSS
KnURA                  5         U R                  S*SS,[C        U5       305         S
nAg
S
nAff = f)-z1v8.0: Enhanced voice synthesize with 100% cloningrq  r   rr  r  rL   r   r  rt  u   缺少 voice_id 或 textNrs  ru  r  r  r  r  r  r  r   r   rH  voice_synthsTr  synth_r  r  r   r  r  rJ  rK  r  rN  r   r  rk   r  r5  r  r  r   u   语音合成失败u   语音合成失败: )"rw  r}   r   rx  r   r   ry  rz  r   r   r   r  r  r   r  r5   r   r*   r+   r-   r=  r>  rF  r  r,   r  r   r  r  r  r7   r  r  r   )r   r~  r|   rz   r  r   r   r  r  r  r   r   rH  r   	synth_dirrL  r  r  r  r   r  r  r   r  s                           r   patched_handle_voice_synthesizer    s]   S	Q !1!12BA!FGN6Dq6H4::??>2eD::d#Dxx
B/H88FB'D4##C'3M)NO((*F%##C'3D)EF)JFtX&&74;;+I+I++~ )94@~WV\%B%B##C'3O)PQ""B
 #{B7I'^^,<bAN!~~j"5H8>>#3#3X%8%8%:NKIKK	D1'',,yF8*Ac$))+FVEWW[2\]K--,5"''..:S:SyY]#
B7#
D9&NN=9AT)~~.>?G4'^^F+$2%>>&': ( K )4JbggnnZ88$*d+q"#&&(K ,MM+6==gF	##C# ($-"-"%k"2*  ##C'3G)HI ,+  	Q!g1Ec!fX/N%OPP	QsK   B$O '-O BO G&O  N0A	O O 0
N>:O 
P	4PP	z=[Patch v8.0] _handle_voice_synthesize(): 100% cloning enabledz:[Patch v8.0] _handle_voice_synthesize: not found, skipping_transcribe_audioc                      [        X5      nU$ ! [         a  n[        SU 3SS9   SnAgSnAf[         a  n[        SU 3SS9   SnAgSnAff = f)z=v8.1: Safe transcription wrapper that catches encoding errorszF[Patch v8.1] _transcribe_audio: UTF-8 decode error (returning empty): Tr(   NrL   z9[Patch v8.1] _transcribe_audio: error (returning empty): )_original_transcribe_audior   r8   r7   )r   r   r  r   s       r   patched_transcribe_audior  ;  s]    	/AFM! 	Z[\Z]^fjk 	MaSQY]^	s    
A+AA

A_try_duix_asrc                 Z     [        X5      $ ! [         a  n[        SU 3SS9  e S nAff = f)Nz)[Patch v8.1] _try_duix_asr: UTF-8 error: Tr(   )_original_try_duix_asrr   r8   )r   r   r   s      r   patched_try_duix_asrr  L  s7    -d??% A!ETRs   
 
*%*zH[Patch v8.1] _transcribe_audio(): safe wrapper with UTF-8 error handlingz2[Patch v8.1] _transcribe_audio not found, skippingz/[Patch v11.5] All patches applied successfully!c                      [        U 5      S-  nUR                  SSS9  UR                  5         g! [         a     gf = f)Nz.write_testtestr   r   TF)_Path
write_textunlinkr7   )r+   	test_files     r   _test_write_permissionr  e  sI    $K-/	Vg6 s   .1 
>>r   c            	      z    [        5       n [        S[        U 5       S[        U R	                  5       5       3SS9  U $ )Nz)[Patch v9.1 DEBUG] _load_voices returned z	 voices: Tr(   )_original_load_voicesr8   r  r:  keys)r   s    r   _debug_load_voicesr  u  s=    &(9#f+iPTU[U`U`UbPcOdemqrr	   z0[Patch v9.1] _load_voices(): debug logging addedz*[Patch v8.5] Original directory writable: z, keeping native paths
dh_v2_datar   z1[Patch v8.5] Restored voices.json from temp cachez*[Patch v8.5] voices.json restore skipped: )parentsr  z.dh_v2_dataz
tasks.jsonz([Patch v8.5] Refreshed tasks.json from: z[Patch v8.5] Copy failed: z[Patch v8.5] TASKS_FILE: ))
UPLOAD_DIRuploads)TEMP_DIRtemp)
OUTPUT_DIRoutputs)
VOICES_DIRr   z[Patch v8.5] rW   z0[Patch v8.5] Sandbox-safe path redirects appliedc                    SSK Jn   U" U R                  5      nUR                  =(       d    SnUR                  =(       d    Sn[
        R                  " [
        R                  [
        R                  5      nUR                  S5        UR                  X445      nUR                  5         US:X  a  gg! [         a     gf = f)zBv9.0: Fast TCP socket check (2s), avoids /docs timeout on CPU moder   )r   z	127.0.0.1i&  r   TF)r   r   r@  r   r   _socketr  AF_INETSOCK_STREAM
settimeout
connect_excloser7   )r   r   r   hostr   sockr  s          r   patched_check_availabler    s    %$--(-+{{"d~~goow/B/BC$.

Q; s   B(B2 2
B?>B?z@[Patch v9.0] check_available(): TCP socket check + HTTP fallbackz1[Patch v10] Running voice file integrity check...r   r   r   r   r   z[Patch v10] Repairable: z( - ref_audio missing but full_ref existsz[Patch v10] Removing: z - ref_audio file missing: r   z'[Patch v10] Cleaned aux_ref_audios for z -> Fr   r   z)[Patch v10] Voices.json cleaned: removed=z, repairable=z[Patch v10] All z voices pass integrity checkz$[Patch v10] Integrity check failed: z*[Patch v10] No voices.json found, skippingzW[Patch v11.5] Digital human training: no auto voice cloning (use voice library instead)z[Patch v8.5] Starting server...__main__z0.0.0.0u=   [服务] 正方元智能广告工作台 - 数字人 v2 (v8.4)u   [服务] 地址: http://r   u   [服务] 正在关闭...)rL   r   )r  NNr  rL   )NrL   r  r  NNN
expressiveNNN)r  NNN)rM  )__doc__sysr*   rF  r  r   r1   rA  r   urllib.errorpathlibr   r   rK   r   r0   parent
PORTAL_DIRr+   insertr   importlib.util	importlibmarshaltypesPYC_PATHr   r   r   ry  codemodule_nameutilspec_from_loaderspecmodule_from_specr   exec__dict__modulesr8   r   _urllib_requestrD  r   r   r   r   r}  _original_save_jsonr   r   r   r   r   GPTSoVITSEnginetrain_voicer   r  r  original_synthesizeri  DigitalHumanV2Handlerdo_POSTrn  ro  rk  _handle_voice_trainr  rl  r  r  DigitalHumanEngineV2_do_generater  r  rm  _handle_voice_preview original_handle_voice_synthesizer  r  r  r  r  r  r  r  r  r   r   
TASKS_FILE_original_tasks_filer.   
_tasks_dirr  _original_dir_writabler   r  r  r   _new_tasks_filer=  _temp_voices_jsonr,   r   _shutilr   r7   rJ   mkdirgetcwdr  _subdir_newsetattrr  _urllibr  _original_check_availabler  r   _voices_file	read_text_voices_raw_voices_data_removed	_repairedr:  r7  _vid_vinfor   _ref	_full_refr<  _aux
_valid_auxr  r  dumpsr   r  ThreadingHTTPServerPORTr  r  gethostbynamegethostnameserve_foreverKeyboardInterruptshutdown)as   0r   <module>r?     s(
  .  	       -;&zgT (^""
 3z? #    55	(DQFF2J=="D 
 (~~&&{4H&V		(	(	. T6?? !K  fnr s
 )#++ 1-f (  :$ G
 ! -2 )  KSW X
 '' =2;
% $ 
6&''5F	
Yaef	
?tL --99 ?CXZW r &9   " T\` a
 ,,77 NRDHEI=AeN %7   ! KSW X
 //77 " S4 %::NN *Z "5 IMMQE6 &C   " ^fj k'6   $4H   1;V   8 >d K
 22??  (12 ,?   ( S[_ `
Xt 6R   2 JRV W
 $(  
6'')CDD'-'C'C'\'\$#UQn =\F  9	
IQUV	
FdS
 6!!#677!'!7!7!I!I
 0HF, v%%77!'!7!7!E!E	 0D,	
T\`a	
>dK 7t D " (( 277??#789
 0
; 
  =  -F	
<DI	6zlBX
Yaef*Ocnn./,>N!! 	QMM#/0#j=6P2QREdS	 " s~~'(<7J65
 *|34O=*O<89M8NOW[\ (F	%o%6
7tDw 65!!'DJJtdJ3FE4(M%4&1> 

<DI   "22BB $ *A   & HPT U 9 F,3FM,J,JuV''(PZ]jPjG",,g,>zz+.	 !3!3!56LD&::k2.DBGGNN400"JJ'7<		!:!:4TF:bckop$$T*24&8STXSYZbfgOOD)::.3D&*jbjGjRWW^^A5F!jGJ:#djb/1+5'(?vRD	{RVWZ[eWfVghptu! 7" DT" y##DJJ|%XY$Zel#m=c(m_MZ]^gZhYijrvw$S%6$77ST\`a 

6dC _gk l 't 4 't 4
 z((*F''FKK(@&B^B^_FFM"F	IRVW	$V%9%9&:L:L:N%O$PPQRXR]R]Q^
_gkl E! V  	Q>rdC4PP	Q  6299;'-7
56  =*2$/t<<=Z H  G4RD9FFG.  (5s   2b	)b+ c	 /d  *Dd# >$d&d,d# A;d# 	d# e 
b(+c1
cc	0c=<c= d
ddd# #d>)
d99d>/e32e3