§
    ’Þj5^  ã            	       óR  — d dl mZmZ ddlmZmZ d dlZd dlZd dlZd dl	m
Z
 d dlmZ ddlmZmZ dZd	Zd
ZdZdZdZdZdZdZddgZg d¢ZdZg d¢Zg d¢ZdddddddœZg d¢dddddœd d!d"œZ d#Z!d$Z"d%Z#g Z$d&d'd(d)d*d+d,d-d.œd/d0d0d1d2d3d4gd5œgZ%g d6¢Z&d7„ Z'd8„ Z(d9„ Z)d:„ Z* G d;„ d<¦  «        Z+dS )=é    )Ú
merge_helpÚspecialitiesé   )ÚINDEX25_HELPÚINDEX_VOICE_INPUTSN)Úmps_device_or)Úfiles_locator)ÚTTS_MONOLOGUE_PROMPTÚTTS_QWEN3_DIALOGUE_PROMPTzDeepBeepMeep/TTSÚ
index_tts2zindex_tts2_gpt_fp16.safetensorsÚindex_tts25zIndexTTS25_GPT_bf16.safetensorszqwen0.6bemo4-mergeÚbigvgan_v2_22khz_80band_256xzw2v-bert-2.0úconfig.jsonzbigvgan_generator.pt)r   zpreprocessor_config.jsonúmodel_fp16.safetensorsF)z	bpe.modelúfeat1.ptúfeat2.ptzs2mel.safetensorsúwav2vec2bert_stats.ptúcampplus_cn_common.binz%index_tts2_semantic_codec.safetensors)Ú	Modelfilezadded_tokens.jsonzchat_template.jinjar   zgeneration_config.jsonz
merges.txtúmodel.safetensorszspecial_tokens_map.jsonztokenizer.jsonztokenizer_config.jsonz
vocab.jsonzMax duration (seconds)zMax DurationiX  é   )ÚlabelÚnameÚminÚmaxÚ	incrementÚdefault)ÚAÚABÚAB2ÚABD2z!Voice cloning (1 reference audio)z$Voice + emotion (2 reference audios)z%Dialogue (2 speaker reference audios)z%Dialogue (3 speaker reference audios)r!   r   )Ú	selectionÚlabelsÚletters_filterr   Úauto_split_every_sg      @g     €V@Úspeech_speedzSpeech Speed (0.5-2.0)zSpeech SpeedÚfloatç      ð?ç      à?ç       @gš™™™™™©?)Úidr   r   Útyper   r   r   ÚincÚtext_normalizationzText NormalizationÚdropdownÚYes)r0   r0   )ÚNor1   )r+   r   r   r,   r   Úchoices)r   r   z"index_tts25_codec_fp32.safetensorsz"index_tts25_s2mel_fp32.safetensorsz(multilingual_zh_ja_yue_char_del.tiktokenr   r   c                 óò  — | t           k    }i dd“dd“dd“dd“dd“d	d“d
d“dd“dd“dd“dd“d| g“dt          t          ¦  «        “dd“dd“dt          t          ¦  «        “dd„ |rt          nt
          D ¦   «         “ddddddddddœt          t          ddd d!gd"d#d$œd d%œd&ddd'œ¥}|s"|                     d(d)d*t          z   d+d,œ¦  «         |r*|                     d-g d.¢d/d0œd1t          z   d2z   d3d4œ¦  «         |S )5NÚ
audio_onlyTÚimage_outputsFÚsliding_windowÚguidance_max_phasesr   Úno_negative_promptÚinference_stepsÚtemperatureÚtop_p_sliderÚtop_k_sliderÚimage_prompt_types_allowedÚ Úsupports_early_stopÚprofiles_dirÚduration_sliderÚany_audio_promptÚaudio_prompt_choicesÚaudio_prompt_type_sourcesÚcustom_settingsc                 ó6   — g | ]}|                      ¦   «         ‘ŒS © )Úcopy)Ú.0Úones     úEC:\Users\johnn\OneDrive\Documents\AI\models\TTS\index_tts2_handler.pyú
<listcomp>z-_get_index_tts2_model_def.<locals>.<listcomp>�   s    € ÐzÐzÐz¨3˜CŸHšH™JœJÐzÐzÐzó    zSpeaker reference voicez.Speaker 2 voice / emotion reference (optional)zSpeaker 3 voice referencezjDefault Emotion Instruction (empty preserves emotion from the speaker reference; [] overrides per segment)zDefault Emotion Instructionz;happy,angry,sad,afraid,disgusted,melancholic,surprised,calmé   )r   r   ÚplaceholderÚlinesi   ÚTÚT1z A Speech based on current Promptz5A Dialogue between two People based on current Prompt)rQ   rR   )r"   r#   r   ÚWrite)Úpreserve_empty_prompt_linesÚpause_between_sentencesÚaudio_guide_labelÚaudio_guide2_labelÚaudio_guide3_labelÚ
alt_promptÚ!text_prompt_enhancer_instructionsÚ"text_prompt_enhancer_instructions1Útext_prompt_enhancer_max_tokensÚ text_prompt_enhancer_max_tokens1Úprompt_enhancer_defÚprompt_enhancer_button_labelÚ
lm_decoderÚcompilea%  `prompt` = speech; `audio_guide` = required speaker sample. `audio_prompt_type`: `A` uses its voice/emotion; `AB` adds emotion from `audio_guide2`; `AB2` uses that second sample as speaker 2; `ABD2` adds `audio_guide3` as speaker 3. `alt_prompt` sets default emotion. Max duration caps output.a[  Write exact English/Chinese speech. Inline cues persist until replaced: '[happy] Hello. [calm] We have time.' `alt_prompt` applies where no inline cue exists; text emotion overrides audio emotion. Keep delivery directions in cues or `alt_prompt`. For `AB2` / `ABD2`, label dialogue `Speaker 1:` / `Speaker 2:` / `Speaker 3:` matching sample order.z## IndexTTS 2.0

a  Write the exact words to speak, with natural punctuation, in English or Chinese. WanGP reads `[happy] Hello there. [calm] We have time.` as emotion cues followed by speech; each cue stays active until replaced. `alt_prompt` supplies the default emotion where no inline cue applies. Keep directions inside these cues or the emotion field. For `AB2` / `ABD2` dialogue, use `Speaker 1:`, `Speaker 2:` (and `Speaker 3:`) sections matching the samples. Inline/text emotion overrides the audio emotion for that segment.)Údeepy_infosÚdeepy_prompt_infosÚinfosÚprompt_infosÚLanguage))ÚEnglishÚEN)ÚChineseÚZH)zChinese / English MixedÚZHEN)ÚJapaneseÚJA)ÚSpanishÚES)ÚArabicÚARrh   )r   r2   r   z## IndexTTS 2.5

ae  

### Improvements over IndexTTS 2.0

- Supports **Chinese, English, Japanese, Spanish, and Arabic**.
- Supports **cross-lingual voice cloning**.
- Offers faster speech generation.
- Adds native speech-speed control and Pinyin, CMU phoneme, and Kana pronunciation annotations.

### Language

Select the language matching the text; **English** is the default.

### Emotion control

- Put an emotion instruction in square brackets immediately before the text it controls, for example: `[happy]` or `[calm and reassuring]`.
- An inline emotion remains active until another bracketed instruction appears.
- **Default Emotion Instruction** applies to segments without an inline emotion.
- If neither is provided, WanGP preserves emotion from the speaker reference.

### Speech Speed

- **1.0** is normal speed.
- Values above **1.0** speak faster.
- Values below **1.0** speak slower.

### Text Normalization

Text Normalization expands supported written forms such as numbers and symbols into spoken words. Disable it when the prompt is already written exactly as it should be spoken or when testing precise pronunciation markup.u~  ### Speech and Emotion

Write the exact speech with natural punctuation in the selected language. For dialogue, use `Speaker 1:`, `Speaker 2:` and `Speaker 3:` in reference order.

**Emotion example:** `[fear] I heard something outside. [calm] It was only the wind.`

### Pronunciation

Chinese: `<è¡Œ|XING2>`; English: `<minute|M IH1 . N AH0 T>`; Japanese: `<ä¸Šæ‰‹|ã�˜ã‚‡ã�†ã�š>`.)Úmodel_modesrd   re   )
ÚINDEX_TTS25_ARCHITECTUREÚdictÚINDEX_TTS2_DURATION_SLIDERÚINDEX_TTS2_AUDIO_PROMPT_TYPESÚINDEX_TTS25_CUSTOM_SETTINGSÚINDEX_TTS2_CUSTOM_SETTINGSr
   r   Úupdater   )Úbase_model_typeÚis_v25Ú	model_defs      rK   Ú_get_index_tts2_model_defr}   n   sA  € ØÕ 8Ò8€Fð,Ø�dð,à˜ð,ð 	˜%ð,ð 	˜qð	,ð
 	˜dð,ð 	˜5ð,ð 	�tð,ð 	˜ð,ð 	˜ð,ð 	% bð,ð 	˜tð,ð 	˜Ð)ð,ð 	�4Õ :Ñ;Ô;ð,ð 	˜Dð,ð 	 ð,ð  	$¥TÕ*GÑ%HÔ%Hð!,ð" 	ÐzÐzÐRXÐ3xÕ3NÐ3NÕ^xÐzÑzÔzð#,ð$ (,Ø#'Ø6ØNØ9ð BØ1ØXØð	
ð 
õ .BÝ.GØ+.Ø,/à˜t˜à7ØMðð ð ð 
ð  
ð )0ØØðW,ð ,ð ,€IðZ ð Ø×Òð Cð #@Ø*Õ-?Ñ?ð `ð	
ð 
ñ 	ô 	ð 	ð ð $Ø×Òà#ð `ð  `ð  `Øðð ð &Õ(:Ñ:ð >(ñ (ð.Gð=#
ð #
ñ #	ô #	ð #	ðH ÐrM   c                 ó$  — | t           k    rKd„ t          D ¦   «         dgz   }t          t          t          t
          t          gt          |t          t          gdœS t          t          t          t
          t          gt          t          t          t          gdœS )Nc                 ó   — g | ]
}|d k    ¯|‘ŒS )r   rG   ©rI   r   s     rK   rL   z0_get_index_tts2_download_def.<locals>.<listcomp>Î   s#   € Ð`Ð`Ð`˜tÀDÐL_ÒD_ÐD_�dÐD_ÐD_ÐD_rM   zmodel_int8_convrot.safetensors)ÚrepoIdÚsourceFolderListÚfileList)rs   ÚINDEX_TTS2_QWEN_EMO_FILESÚINDEX_TTS2_REPO_IDÚINDEX_TTS25_FOLDERÚINDEX_TTS2_QWEN_EMO_FOLDERÚINDEX_TTS2_BIGVGAN_FOLDERÚINDEX_TTS2_W2V_BERT_FOLDERÚINDEX_TTS25_ROOT_FILESÚINDEX_TTS2_BIGVGAN_FILESÚINDEX_TTS2_W2V_BERT_FILESÚINDEX_TTS2_FOLDERÚINDEX_TTS2_ROOT_FILES)rz   Ú
qwen_filess     rK   Ú_get_index_tts2_download_defr�   Ì   s¦   € ØÕ2Ò2Ð2Ø`Ð`Õ'@Ð`Ñ`Ô`ð  eEð  dFñ  Fˆ
å(Ý!3Õ5OÕQjõ  mGð  !HÝ/°Õ=UÕWpÐqð
ð 
ð 	
õ %õ Ý&Ý%Ý&ð	
õ "Ý%Ý$Ý%ð	
ðð ð rM   c                  óò   — t          j        t          d¬¦  «        } | �| S t          j                             t          j        ¦   «         t          ¦  «        }t          j                             |¦  «        r|S d S )NF©Úerror_if_none)ÚflÚlocate_folderr‰   ÚosÚpathÚjoinÚget_download_locationÚisdir)ÚlocatedÚfallbacks     rK   Ú_resolve_w2v_bert_dirr�   æ   sb   € ÝÔÕ9ÈÐOÑOÔO€GØÐØˆÝŒw�|Š|�BÔ4Ñ6Ô6Õ8RÑSÔS€HÝ	„w‡}‚}�XÑÔð ØˆØˆ4rM   c                  ó&  — t          ¦   «         } | €t          dt          › d�¦  «        ‚t          j                             | d¦  «        }t          j                             |¦  «        r|S ddlm} t          j
                             |d¬¦  «        }|S )NzIndexTTS2 semantic folder 'z;' is missing. WanGP must download it from DeepBeepMeep/TTS.r   r   )ÚoffloadÚcpu)Údevice)r�   ÚFileNotFoundErrorr‰   r–   r—   r˜   ÚisfileÚmmgprŸ   Úsafetensors2ÚlÚload_)Úw2v_dirÚ	fp16_pathrŸ   Úsrcs       rK   Ú_ensure_w2v_bert_fp16_filer«   ð   s£   € Ý#Ñ%Ô%€GØ€Ýð<Õ*Dð <ð <ð <ñ
ô 
ð 	
õ ”—’˜WÐ&>Ñ?Ô?€IÝ	„w‡~‚~�iÑ Ô ð ØÐØÐÐÐÐÐå
Œ.×
Ò
 °5Ð
Ñ
9Ô
9€Cð ÐrM   c                   ó.  — e Zd Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	edd„¦   «         Z
e	 	 	 	 	 	 	 	 	 	 dd„¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         ZdS )Úfamily_handlerc                  ó   — dt           gS ©Nr   ©rs   rG   rM   rK   Úquery_supported_typesz$family_handler.query_supported_types  s   € àÕ6Ð7Ð7rM   c                  ó
   — i i fS ©NrG   rG   rM   rK   Úquery_family_mapsz family_handler.query_family_maps  s   € à�2ˆvˆrM   c                  ó   — dS )NÚttsrG   rG   rM   rK   Úquery_model_familyz!family_handler.query_model_family  s   € àˆurM   c                  ó
   — ddiS )Nr¶   )i˜  ÚTTSrG   rG   rM   rK   Úquery_family_infosz!family_handler.query_family_infos  s   € à�}Ð%Ð%rM   c                 ó*   — | t           k    rt           S dS r¯   r°   )rz   s    rK   Úget_lora_dirzfamily_handler.get_lora_dir  s   € àÕ6Ò6Ð6Ý+Ð+Øˆ|rM   c                 ó¢   — t          i t          | ¦  «        ¥| dk    t          dd¦  «        d„ dD ¦   «         z   dœ¥| dk    rt          ni ¦  «        S )Nr   zvoice cloningzspeech dialoguec                 ó   — g | ]}d |i‘ŒS )r   rG   r€   s     rK   rL   z2family_handler.query_model_def.<locals>.<listcomp>&  sH   € ð  AGð  AGð  AGð  UYð  CIð  KOð  BPð  AGð  AGð  AGrM   )zexpressive speechzemotion transfer)Údevice_explicitr   r   )r   r}   r   r   )rz   r|   s     rK   Úquery_model_defzfamily_handler.query_model_def$  sÎ   € åð  HÕ6°ÑGÔGð  HÐ\kÐo{Ò\{õ  NZð  [jð  l}ñ  N~ô  N~ð  AGð  AGð  ]Fð  AGñ  AGô  AGñ  NGð  Hð  Hð  Hð  Zið  mzò  Zzð  Zzõ  JVð  JVð  @Bñ  Cô  Cð  	CrM   Nc                 ó    — t          |¦  «        S r³   )r�   )ÚcomputeListrz   r|   s      rK   Úquery_model_filesz family_handler.query_model_files(  s   € å+¨OÑ<Ô<Ð<rM   Fr   c                 óÀ  — ddl m} |t          k    }|rt          nt          }d }t          | t          t          f¦  «        rt          | ¦  «        dk    r| d         }n| }d }|rt          j
        |d¬¦  «        p|}|€t          j
        |d¬¦  «        }|�gt          j                             |¦  «        }d|v rD|                     dd¦  «                             d	d
¦  «        }t          j
        |d¬¦  «        }|�|}|€t          d|› d�¦  «        ‚t!          t#          j        d¦  «        ¦  «        } |t          j        ¦   «         ||t(          ||¬¦  «        }t"          j                             ¦   «         rd|j        _        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        j        dœ}|r|j        j        |d<   |i |j        rdgnddœ}tA          |¦  «        dv rddi|d<   |	rU|rSddl!m"} t          j         #                    |j$        dd¦  «        } ||j        j        |||pt"          j%        |d¬¦  «         ||fS )Nr   )ÚIndexTTS2Pipeliner   Fr’   Ú_quanto_Ú_quanto_fp16_int8Ú_fp16Ú_quanto_int8r>   z IndexTTS main transformer file 'z9' is missing. It must be provided in defaults model.URLs.r    )Ú	ckpt_rootr¡   Úgpt_weights_pathÚshow_load_logsÚlm_featuresÚarchitecturezcuda:0)ÚtransformerÚtransformer2ÚvocoderÚsemantic_modelÚcampplus_modelÚqwen_emo_modelÚsemantic_codecrÏ   )ÚpipeÚcoTenantsMapÚ
cudaGraphs)r   rN   é   é   rÐ   éú   Úbudgets)Úsave_quantized_modelÚconfigszgpt_runtime_config.json)Úsubmodel_no)&Úindex_tts2.pipelinerÅ   rs   ÚINDEX_TTS25_MAIN_GPT_FILENAMEÚINDEX_TTS2_MAIN_GPT_FILENAMEÚ
isinstanceÚlistÚtupleÚlenr”   Úlocate_filer–   r—   ÚbasenameÚreplacer¢   r   Útorchr¡   r™   ÚINDEX_TTS2_SHOW_LOAD_LOGSÚcudaÚis_availableÚmodelÚgptÚs2melÚbigvganrÒ   rÓ   Úqwen_emorÕ   ÚgraphsÚintÚwgprÝ   r˜   Ú	model_dirÚfloat16)Úmodel_filenameÚ
model_typerz   r|   ÚquantizeTransformerÚtext_encoder_quantizationÚdtypeÚ	VAE_dtypeÚmixed_precision_transformerÚsave_quantizedÚsubmodel_no_listÚtext_encoder_filenameÚprofilerÍ   ÚkwargsrÅ   r{   Úmain_gpt_filenameÚweights_candidaterË   Úgpt_nameÚnon_quanto_nameÚnon_quanto_pathÚruntime_deviceÚpipelinerÖ   Úload_defrÝ   Úgpt_config_paths                                rK   Ú
load_modelzfamily_handler.load_model,  sò  € ð$ 	;Ð:Ð:Ð:Ð:Ð:à Õ$<Ò<ˆØ=CÐeÕ9Ð9ÕIeÐà ÐÝ�n¥t­U mÑ4Ô4ð 	/Ý�>Ñ"Ô" QÒ&Ð&Ø$2°1Ô$5Ð!øà .ÐØÐØð 	kÝ!œ~Ð.?ÈuÐUÑUÔUÐjÐYjÐØÐ#Ý!œ~Ð.?ÈuÐUÑUÔUÐØÐ'Ý”w×'Ò'Ð(8Ñ9Ô9ˆHØ˜XÐ%Ð%Ø"*×"2Ò"2Ð3FÈÑ"PÔ"P×"XÒ"XÐYgÐikÑ"lÔ"l�Ý"$¤.°ÐPUÐ"VÑ"VÔ"V�Ø"Ð.Ø'6Ð$ØÐ#Ý#ð>Ð3Dð >ð >ð >ñô ð õ
 '¥u¤|°EÑ':Ô':Ñ;Ô;ˆØ$Ð$ÝÔ.Ñ0Ô0Ø!Ø-Ý4Ø#Ø(ð
ñ 
ô 
ˆõ Œ:×"Ò"Ñ$Ô$ð 	-Ø$,ˆHŒNÔ!ð $œ>Ô-Ø$œNÔ0Ø”~Ô-Ø&œnÔ;Ø&œnÔ;Ø&œnÔ5Ô;ð
ð 
ˆð ð 	CØ%-¤^Ô%BˆDÐ!Ñ"àØà-8Ô-?ÐJ˜=˜/˜/ÀUð	
ð 
ˆõ ˆw‰<Œ<˜<Ð'Ð'Ø#1°3Ð"7ˆH�YÑàð 	KÐ.ð 	KØ0Ð0Ð0Ð0Ð0Ð0å œgŸlšl¨8Ô+=¸yÐJcÑdÔdˆOØ Ð  ¤Ô!3°ZÐAQÐSXÐSiÕ\aÔ\iÐkzð  IJð  Kñ  Kô  Kð  Kà˜Ð!Ð!rM   c                 ó    — d|vrd|d<   ddi}| t           k    rd|d<   |                     ¦   «         D ]\  }}|                     ||¦  «         Œd S )NrY   r>   Úaudio_prompt_typer   rh   Ú
model_mode)rs   ÚitemsÚ
setdefault)rz   Úsettings_versionr|   Úui_defaultsÚdefaultsÚkeyÚvalues          rK   Úfix_settingszfamily_handler.fix_settings‚  s{   € à˜{Ð*Ð*Ø(*ˆK˜Ñ%à ð
ˆð Õ6Ò6Ð6Ø%)ˆH�\Ñ"Ø"Ÿ.š.Ñ*Ô*ð 	/ð 	/‰JˆC�Ø×"Ò" 3¨Ñ.Ô.Ð.Ð.ð	/ð 	/rM   c                 óê   — |                      di ¦  «        }|                     dddd|                      dd¦  «        dd	d	dd
d
dddœ¦  «         | t          k    r|                     dddœ¦  «         d S d S )NrA   a`  [fear] At the very beginning I was so afraid to speak.
[sadness] Nobody would talk to me. I felt so alone.
[disgust] They would just ignore me and pretend that I didnt exist
[happy] By chance I discovered this wonderful App, and now everything is different.
[anger] I have a new voice and now everybody will have no choice but to listen to my words !!!r   r>   r   r   r   gš™™™™™É?r   gš™™™™™é?é   ÚFG)Úpromptr  rY   Úrepeat_generationÚduration_secondsÚpause_secondsÚvideo_lengthÚnum_inference_stepsÚnegative_promptr:   Útop_pÚtop_kÚmulti_prompts_gen_typerh   )r  r  )Úgetry   rs   )rz   r|   r  Úduration_defs       rK   Úupdate_default_settingsz&family_handler.update_default_settingsŽ  s½   € à —}’}Ð%6¸Ñ;Ô;ˆØ×Òð AØ%(Ø Ø%&Ø$0×$4Ò$4°YÀÑ$CÔ$CØ!$Ø !Ø'(Ø#%Ø"ØØØ*.ðð ñ	
ô 	
ð 	
ð" Õ6Ò6Ð6Ø×ÒØ"ðqð ð  ñ ô ð ð ð ð 7Ð6rM   c                 óB  ‡— |�2t          t          |¦  «                             ¦   «         ¦  «        dk    rdS ‰                     d¦  «        €dS t          ‰                     dd¦  «        pd¦  «                             ¦   «         }d|v rd}nd|v rd	}n	d|v rd}nd
S t          |¦  «        }t          j        d|t
          j        ¬¦  «        d u}|d	k    r‰                     d¦  «        €dS |dk    r©d|v rdnd}t          ˆfd„dd |dz
  …         D ¦   «         ¦  «        r|› d|› d�S t          t          j
        d|t
          j        ¬¦  «        ¦  «        }	|	s|› d|› d|› d�S t          d„ |	D ¦   «         ¦  «        }
t          |
¦  «        |k    r|› d|› d|› d�S n|rdS d S ) Nr   z*Prompt text cannot be empty for IndexTTS2.Úaudio_guidez2IndexTTS2 requires one reference voice audio file.r  r   Ú2ÚBr   z,Unsupported audio prompt mode for IndexTTS2.zSpeaker\s*\d+\s*:)ÚflagsÚaudio_guide2z4Emotion mode requires a second reference audio file.ÚDé   rN   c              3   óF   •K  — | ]}‰                      |¦  «        d u V — Œd S r³   )r&  )rI   r  Úinputss     €rK   ú	<genexpr>z<family_handler.validate_generative_prompt.<locals>.<genexpr>Á  s2   øè è € ÐkÐk¨s�6—:’:˜c‘?”? dÐ*ÐkÐkÐkÐkÐkÐkrM   )r.  Úaudio_guide3r   z-speaker mode requires z speaker reference audio files.zSpeaker\s*(\d+)\s*:z@-speaker mode requires prompt lines using Speaker 1: to Speaker z
: (or any zx numeric speaker IDs). For headless settings, keep 'multi_prompts_gen_type' = 'FG' so dialogue lines stay in one prompt.c                 óR   — h | ]$}t          |                     d ¦  «        ¦  «        ’Œ%S )r   )rô   Úgroup)rI   Úmatchs     rK   ú	<setcomp>z<family_handler.validate_generative_prompt.<locals>.<setcomp>Ê  s*   € Ð!SÐ!SÐ!S¸%¥# e§k¢k°!¡n¤nÑ"5Ô"5Ð!SÐ!SÐ!SrM   z-speaker mode requires exactly z( speaker IDs. Use Speaker 1: to Speaker z?:. For headless settings, keep 'multi_prompts_gen_type' = 'FG'.z;Speaker-tag dialogue requires a Dialogue audio prompt mode.)ræ   ÚstrÚstripr&  ÚupperÚreÚsearchÚ
IGNORECASEÚanyrä   ÚfinditerÚsorted)rz   r|   r2  Ú
one_promptÚraw_audio_prompt_typer  Úprompt_textÚhas_speaker_syntaxÚspeaker_countÚspeaker_matchesÚspeaker_idss     `        rK   Úvalidate_generative_promptz)family_handler.validate_generative_prompt¬  sf  ø€ àÐ¥¥S¨¡_¤_×%:Ò%:Ñ%<Ô%<Ñ!=Ô!=ÀÒ!BÐ!BØ?Ð?Ø�:Š:�mÑ$Ô$Ð,ØGÐGÝ # F§J¢JÐ/BÀCÑ$HÔ$HÐ$OÈCÑ PÔ P× VÒ VÑ XÔ XÐØÐ'Ð'Ð'Ø #ÐÐØÐ)Ð)Ð)Ø $ÐÐØÐ)Ð)Ð)Ø #ÐÐàAÐAÝ˜*‘o”oˆÝœYÐ';¸[ÕPRÔP]Ð^Ñ^Ô^ÐfjÐjÐØ Ò$Ð$¨¯ª°NÑ)CÔ)CÐ)KØIÐIØ Ò#Ð#Ø!$Ð(=Ð!=Ð!=˜A˜AÀ1ˆMÝÐkÐkÐkÐkÐ6VÐWiÐXeÐhiÑXiÐWiÔ6jÐkÑkÔkÑkÔkð oØ'ÐnÐnÀÐnÐnÐnÐnÝ"¥2¤;Ð/EÀ{ÕZ\ÔZgÐ#hÑ#hÔ#hÑiÔiˆOØ"ð à$ð \ð \Ðfsð \ð \Ø,ð\ð \ð \ðõ
 !Ð!SÐ!SÀ?Ð!SÑ!SÔ!SÑTÔTˆKÝ�;ÑÔ =Ò0Ð0à$ð Sð SÀ]ð Sð Sð  }Jð Sð Sð Sðð 1ð
  ð 	QØPÐPØˆtrM   c                 ó*  — |                      dd¦  «        }	 t          |¦  «        }n# t          $ r Y dS w xY w|dk    rdS |                      dd ¦  «        }| t          k    rÁt	          |t
          ¦  «        sdS t          |                      dd¦  «        pd¦  «                             ¦   «         }|d	vrd
S 	 t          |                      dd¦  «        ¦  «        }n# t          $ r Y dS w xY w|dk     s|dk    rdS t          |                      dd¦  «        ¦  «        }|dvrdS |€d S t	          |t
          ¦  «        sdS |                      t          d ¦  «        }|€d S t	          |t          ¦  «        r^| 	                    ¦   «         }t          |¦  «        dk    r7|                     t          d ¦  «         t          |¦  «        dk    r|nd |d<   d S 	 t	          |t          ¦  «        rt          ¦   «         ‚t          |¦  «        }	n=# t          $ r0 dt          t          ¦  «        › dt          t           ¦  «        › d�cY S w xY w|	t          k     s|	t           k    r-dt          t          ¦  «        › dt          t           ¦  «        › d�S |	|t          <   ||d<   d S )Nr  r   zMax duration must be a number.z$Max duration must be greater than 0.rE   z)IndexTTS 2.5 custom settings are missing.r  rh   )rh   rj   rk   rm   ro   rq   z"Unsupported IndexTTS 2.5 language.r&   r(   z2Speech Speed must be a number between 0.5 and 2.0.r)   r*   z)Speech Speed must be between 0.5 and 2.0.r.   r0   )r0   r1   z%Text Normalization must be Yes or No.z%Custom settings must be a dictionary.z,Auto Split Every s must be a number between z and z	 seconds.z#Auto Split Every s must be between )r&  r'   Ú	Exceptionrs   rã   rt   r9  r;  Ú INDEX_TTS2_AUTO_SPLIT_SETTING_IDr:  ræ   ÚpopÚboolÚ
ValueErrorrô   Ú!INDEX_TTS2_AUTO_SPLIT_MIN_SECONDSÚ!INDEX_TTS2_AUTO_SPLIT_MAX_SECONDS)
rz   r|   r2  ÚdurationrE   Úlanguager&   ÚnormalizationÚ	raw_valueÚauto_split_secondss
             rK   Úvalidate_generative_settingsz+family_handler.validate_generative_settingsÔ  s/  € à—:’:Ð0°!Ñ4Ô4ˆð	4Ý˜X‘”ˆHˆHøÝð 	4ð 	4ð 	4Ø3Ð3Ð3ð	4øøøà�qŠ=ˆ=Ø9Ð9Ø Ÿ*š*Ð%6¸Ñ=Ô=ˆØÕ6Ò6Ð6Ý˜o­tÑ4Ô4ð CØBÐBÝ˜6Ÿ:š: l°DÑ9Ô9ÐA¸TÑBÔB×HÒHÑJÔJˆHØÐEÐEÐEØ;Ð;ðLÝ$ _×%8Ò%8¸ÈÑ%MÔ%MÑNÔN��øÝð Lð Lð LØKÐKÐKðLøøøà˜cÒ!Ð! \°CÒ%7Ð%7ØBÐBÝ × 3Ò 3Ð4HÈ%Ñ PÔ PÑQÔQˆMØ MÐ1Ð1Ø>Ð>ØÐ"Ø�4Ý˜/­4Ñ0Ô0ð 	;Ø:Ð:Ø#×'Ò'Õ(HÈ$ÑOÔOˆ	ØÐØ�4Ý�i¥Ñ%Ô%ð 	Ø!ŸšÑ)Ô)ˆIÝ�9‰~Œ~ Ò"Ð"Ø×#Ò#Õ$DÀdÑKÔKÐKÝ?BÀ?Ñ?SÔ?SÐVWÒ?WÐ?W¨O¨OÐ]a�Ð(Ñ)Ø�tð	Ý˜)¥TÑ*Ô*ð #Ý ‘l”lÐ"Ý!& yÑ!1Ô!1ÐÐøÝð 	ð 	ð 	ðrÝÕ8Ñ9Ô9ðrð rÝ@CÕDeÑ@fÔ@fðrð rð rðð ð ð	øøøð Õ!BÒBÐBØ!Õ$EÒEÐEðrÝÕ8Ñ9Ô9ðrð rÝ@CÕDeÑ@fÔ@fðrð rð rðð =OˆÕ8Ñ9Ø$3ˆÐ Ñ!Øˆts0   ˜( ¨
6µ6Â7#C Ã
C)Ã(C)Ç2H È7H>È=H>r³   )
FNNNFFNNr   N)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr±   r´   r·   rº   r¼   rÀ   rÃ   r  r  r(  rI  rW  rG   rM   rK   r­   r­     s‰  € € € € € Øð8ð 8ñ „\ð8ð ðð ñ „\ðð ðð ñ „\ðð ð&ð &ñ „\ð&ð ðð ñ „\ðð
 ðCð Cñ „\ðCð ð=ð =ð =ñ „\ð=ð ð "Ø"&ØØØ$)ØØØ"ØØðS"ð S"ð S"ñ „\ðS"ðj ð	/ð 	/ñ „\ð	/ð ðð ñ „\ðð: ð%ð %ñ „\ð%ðN ð8ð 8ñ „\ð8ð 8ð 8rM   r­   ),Úmodels.help_sharedr   r   Úhelpr   r   r–   r<  rê   Ú
shared.mpsr   Úshared.utilsr	   r”   Úprompt_enhancersr
   r   r…   r�   râ   rs   r†   rá   r‡   rˆ   r‰   r‹   rŒ   rë   rŽ   r„   ru   rv   rL  rP  rQ  rx   rw   rŠ   r}   r�   r�   r«   r­   rG   rM   rK   ú<module>ra     s^  ðà 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø 	€	€	€	Ø 	€	€	€	à €€€à $Ð $Ð $Ð $Ð $Ð $Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,à MÐ MÐ MÐ MÐ MÐ MÐ MÐ Mð (Ð Ø Ð Ø@Ð Ø(Ð Ø"Ð Ø AÐ Ø1Ð Ø:Ð Ø+Ð àØðÐ ðð ð Ð ð
 "Ð ðð ð Ð ðð ð Ð ð &ØØØØØðð Ð ð ,Ð+Ð+à0Ø4Ø6Ø7ð	ð ð Øð
!ð 
!Ð ð $8Ð  Ø$'Ð !Ø$(Ð !ØÐ ð Ø)ØØØØØØð	ð 	ð #Ø%Ø$ØØØ" LÐ1ðð ðÐ ð(ð ð Ð ð[ð [ð [ð|ð ð ð4ð ð ðð ð ð:@ð @ð @ð @ð @ñ @ô @ð @ð @ð @rM   