§
    ’Þj`j  ã                   ó   — 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Zd dlm	Z	 d dl
mZ ddlmZmZ dd	d
œddd
œddd
œdœZdZ ee¦  «                             ¦   «         j        dz  dz  ZdZdZdZdZg d¢ZdddegZg d¢Zg d¢Zdddœd ddœd!ddœd"d#dœd$d%dœd&d'dœd(d'dœd)d*dœd+d,dœd-œ	Zd.d/dd0dd1d2œZg d3¢d4d5d6d3œd7d8d9œZ d:Z!d;Z"d<Z#d=Z$e!d>d?d@e"e"e$dAdBœgZ%dCe&dDe&fdE„Z'dFe&dDe&fdG„Z(dHe&dDee&         fdI„Z)dDee&         fdJ„Z*dHe&dDee+         fdK„Z,dHe&dDe-e&         fdL„Z.dHe&dDe-e&         fdM„Z/dHe&dDe-e0e&e&f                  fdN„Z1dHe&dDe-e0e&e&f                  fdO„Z2dHe&dDe+fdP„Z3dDe4fdQ„Z5dHe&dDe-e+         fdR„Z6 G dS„ dT¦  «        Z7dS )Ué    N)ÚPath)ÚOptional)Úmps_device_or)Úfiles_locatoré   )ÚTTS_MONOLOGUE_PROMPTÚTTS_QWEN3_DIALOGUE_PROMPTz$Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoicezqwen3_tts_customvoice.json)ÚrepoÚconfig_filez$Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesignzqwen3_tts_voicedesign.jsonzQwen/Qwen3-TTS-12Hz-1.7B-Basezqwen3_tts_base.json)Úqwen3_tts_customvoiceÚqwen3_tts_voicedesignÚqwen3_tts_basez qwen3_tts_generation_config.jsonÚqwen3ÚconfigsÚqwen3_tts_text_tokenizerÚqwen3_tts_tokenizer_12hzz$qwen3_tts_tokenizer_12hz.safetensorszDeepBeepMeep/TTS)z
merges.txtz
vocab.jsonztokenizer_config.jsonúpreprocessor_config.jsonzconfig.jsonzconfiguration.jsonr   )ÚautoÚchineseÚenglishÚjapaneseÚkoreanÚgermanÚfrenchÚrussianÚ
portugueseÚspanishÚitalian)	ÚserenaÚvivianÚuncle_fuÚryanÚaidenÚono_annaÚsoheeÚericÚdylanz(Bright, slightly edgy young female voiceÚChinese)ÚstyleÚlanguagezWarm, gentle young female voicez-Seasoned male voice with a low, mellow timbrez8Youthful Beijing male voice with a clear, natural timbrezChinese (Beijing Dialect)z:Lively Chengdu male voice with a slightly husky brightnesszChinese (Sichuan Dialect)z-Dynamic male voice with strong rhythmic driveÚEnglishz/Sunny American male voice with a clear midrangez9Playful Japanese female voice with a light, nimble timbreÚJapanesez*Warm Korean female voice with rich emotionÚKorean)	r    r   r!   r'   r&   r"   r#   r$   r%   zMax duration (seconds)zMax DurationiX  é   )ÚlabelÚnameÚminÚmaxÚ	incrementÚdefault©ÚAÚABÚABDzVoice cloning of 1 speakerz5Voice cloning of 2 speakers (Speaker 1 and Speaker 2)z0Voice cloning of 3 speakers (Speaker 1, 2 and 3)r8   r6   )Ú	selectionÚlabelsÚletters_filterr4   Úauto_split_every_sg        g      @g     €V@zAuto Split s (0 = Auto, 5-90)zAuto Split Every sÚfloatg      ð?)Úidr/   r0   Útyper4   r1   r2   ÚincÚvalueÚreturnc                 óR   — |                       dd¦  «                             ¦   «         S )NÚ_ú )ÚreplaceÚtitle)rA   s    ú@C:\Users\johnn\OneDrive\Documents\AI\models\TTS\qwen3_handler.pyÚ_format_qwen3_labelrI   •   s"   € Ø�=Š=˜˜cÑ"Ô"×(Ò(Ñ*Ô*Ð*ó    r0   c                 óv  — t          | ¦  «        }t                               |                      ¦   «         ¦  «        }|s|S g }|                     dd¦  «        }|                     dd¦  «        }|r|                     |¦  «         |r|                     |¦  «         |s|S |› dd                     |¦  «        › d�S )Nr)   Ú r*   z (z; ú))rI   ÚQWEN3_TTS_SPEAKER_METAÚgetÚlowerÚappendÚjoin)r0   r/   ÚmetaÚpartsr)   r*   s         rH   Ú_format_qwen3_speaker_labelrU   ™   sÆ   € Ý Ñ%Ô%€EÝ!×%Ò% d§j¢j¡l¤lÑ3Ô3€DØð ØˆØ€EØ�HŠH�W˜bÑ!Ô!€EØ�xŠx˜
 BÑ'Ô'€HØð Ø�Š�UÑÔÐØð Ø�Š�XÑÔÐØð ØˆØÐ*Ð*�t—y’y Ñ'Ô'Ð*Ð*Ð*Ð*rJ   Úbase_model_typec                 ó¨   — t                                | ¦  «        }|€d S t          |d         z  }|                     ¦   «         rt	          |¦  «        nd S )Nr   )ÚQWEN3_TTS_VARIANTSrO   Ú_QWEN3_CONFIG_DIRÚis_fileÚstr)rV   ÚvariantÚconfig_paths      rH   Úget_qwen3_config_pathr^   ª   sR   € Ý ×$Ò$ _Ñ5Ô5€GØ€ØˆtÝ# g¨mÔ&<Ñ<€KØ*×2Ò2Ñ4Ô4Ð>�3ˆ{ÑÔÐ¸$Ð>rJ   c                  ój   — t           t          z  } |                      ¦   «         rt          | ¦  «        nd S ©N)rY   ÚQWEN3_TTS_GENERATION_CONFIGrZ   r[   )r]   s    rH   Ú get_qwen3_generation_config_pathrb   ²   s1   € Ý#Õ&AÑA€KØ*×2Ò2Ñ4Ô4Ð>�3ˆ{ÑÔÐ¸$Ð>rJ   c                 ó¨   — t          | ¦  «        }|sd S t          |dd¬¦  «        5 }t          j        |¦  «        cd d d ¦  «         S # 1 swxY w Y   d S )NÚrzutf-8)Úencoding)r^   ÚopenÚjsonÚload)rV   r]   Úhandles      rH   Úload_qwen3_configrj   ·   sŸ   € Ý'¨Ñ8Ô8€KØð ØˆtÝ	ˆk˜3¨Ð	1Ñ	1Ô	1ð !°VÝŒy˜Ñ Ô ð!ð !ð !ð !ñ !ô !ð !ð !ð !ð !ð !ð !øøøð !ð !ð !ð !ð !ð !s   ¦AÁAÁAc                 ó  — t          | ¦  «        }|€t          t          ¦  «        S |                     di ¦  «                             di ¦  «        }d„ |                     ¦   «         D ¦   «         }dgt          d„ |D ¦   «         ¦  «        z   }|S )NÚtalker_configÚcodec_language_idc                 ó>   — g | ]}d |                      ¦   «         v¯|‘ŒS )Údialect©rP   ©Ú.0r0   s     rH   ú
<listcomp>z'get_qwen3_languages.<locals>.<listcomp>Ä   s*   € ÐSÐSÐS˜$°YÀdÇjÂjÁlÄlÐ5RÐ5R�Ð5RÐ5RÐ5RrJ   r   c                 ó6   — h | ]}|                      ¦   «         ’ŒS © rp   rq   s     rH   ú	<setcomp>z&get_qwen3_languages.<locals>.<setcomp>Å   s    € Ð"FÐ"FÐ"F°D 4§:¢:¡<¤<Ð"FÐ"FÐ"FrJ   )rj   ÚlistÚQWEN3_TTS_LANG_FALLBACKrO   ÚkeysÚsorted)rV   ÚconfigÚlang_mapÚ	languagess       rH   Úget_qwen3_languagesr~   ¿   s‹   € Ý˜Ñ/Ô/€FØ€~ÝÕ+Ñ,Ô,Ð,Ø�zŠz˜/¨2Ñ.Ô.×2Ò2Ð3FÈÑKÔK€HØSÐS (§-¢-¡/¤/ÐSÑSÔS€IØ��6Ð"FÐ"F¸IÐ"FÑ"FÔ"FÑGÔGÑG€IØÐrJ   c                 ó<  — t          | ¦  «        }|€t          t          ¦  «        S t          |                     di ¦  «                             di ¦  «                             ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }|pt          t          ¦  «        S )Nrl   Úspk_idc                 ó6   — h | ]}|                      ¦   «         ’ŒS ru   rp   rq   s     rH   rv   z%get_qwen3_speakers.<locals>.<setcomp>Î   s    € Ð9Ð9Ð9¨�t—z’z‘|”|Ð9Ð9Ð9rJ   )rj   rw   ÚQWEN3_TTS_SPEAKER_FALLBACKrO   ry   rz   )rV   r{   Úspeakerss      rH   Úget_qwen3_speakersr„   É   sŠ   € Ý˜Ñ/Ô/€FØ€~ÝÕ.Ñ/Ô/Ð/Ý�F—J’J˜°Ñ3Ô3×7Ò7¸À"ÑEÔE×JÒJÑLÔLÑMÔM€HÝÐ9Ð9°Ð9Ñ9Ô9Ñ:Ô:€HØÐ7•tÕ6Ñ7Ô7Ð7rJ   c                 ó4   — d„ t          | ¦  «        D ¦   «         S )Nc                 ó0   — g | ]}t          |¦  «        |f‘ŒS ru   )rI   )rr   Úlangs     rH   rs   z.get_qwen3_language_choices.<locals>.<listcomp>Ó   s&   € Ð_Ð_Ð_°$Õ  Ñ&Ô&¨Ð-Ð_Ð_Ð_rJ   )r~   ©rV   s    rH   Úget_qwen3_language_choicesr‰   Ò   s   € Ø_Ð_Õ:MÈoÑ:^Ô:^Ð_Ñ_Ô_Ð_rJ   c                 ó4   — d„ t          | ¦  «        D ¦   «         S )Nc                 ó0   — g | ]}t          |¦  «        |f‘ŒS ru   )rU   rq   s     rH   rs   z-get_qwen3_speaker_choices.<locals>.<listcomp>×   s&   € ÐfÐfÐf¸$Õ(¨Ñ.Ô.°Ð5ÐfÐfÐfrJ   )r„   rˆ   s    rH   Úget_qwen3_speaker_choicesrŒ   Ö   s    € ØfÐfÕBTÐUdÑBeÔBeÐfÑfÔfÐfrJ   c           
      ó˜  — i 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t          “dd“dd“dd“dd“d| dk    rddgndgdddœddœdœ¥}| d k    r=t          | ¦  «        }|r|d         nd}i |¥t	          | ¦  «        |d!d"œd#d$d%d&d'd(d)d*œd+œ¥S | d,k    r"i |¥d-d.d/d0t          | ¦  «        d1d2d"œd3d4d)d*œd5œ¥S | dk    rti |¥i d6t          | ¦  «        d1d2d"œ“d7d8d9d:d*œ“d;d“d<d“d=d“d>d“d?t          t          ¦  «        “d@dA„ t          D ¦   «         “dBt          “dCd“dDdE“dFdG“dHdI“dJdK“dLdM“dNdO“dPdQ“¥S |S )RNÚ
audio_onlyTÚimage_outputsFÚsliding_windowÚguidance_max_phasesr   Úno_negative_promptÚinference_stepsÚtemperatureÚimage_prompt_types_allowedrL   Úsupports_early_stopÚprofiles_dirÚduration_sliderÚtop_k_sliderÚ!text_prompt_enhancer_instructionsÚtext_prompt_enhancer_max_tokensi   Úprompt_enhancer_button_labelÚWriteÚcompileÚparent_model_typer   ÚTÚT1z A Speech based on current Promptz5A Dialogue between two People based on current Prompt)r    r¡   )r9   r:   r4   )Ú
lm_decoderÚprompt_enhancer_defr   ÚSpeaker)Úchoicesr4   r/   aX  Speak the Text Prompt (`prompt`) with one of Qwen3's built-in voices, selected in **Speaker** (`model_mode`); each label gives the voice's style and native language. The optional **Instruction** (`alt_prompt`) adjusts the delivery, for example `calm, friendly, slightly husky`. Max duration caps the output; give the text enough time to finish.zÜWrite only the words to speak, with natural punctuation. Put delivery directions in Instruction rather than in the text, for example Instruction `excited, fast-paced` with the text "We did it! The launch window is open."z¬Built-in voices: speaker = `model_mode` (labels give style and language). `prompt` = words to speak; `alt_prompt` = optional delivery instruction. Max duration caps output.zyWrite only the words to speak, naturally punctuated. Put delivery in `alt_prompt`, e.g. 'calm, friendly, slightly husky'.zInstruction (optional)zcalm, friendly, slightly huskyé   )r/   ÚplaceholderÚlines)Úmodel_modesÚinfosÚprompt_infosÚdeepy_infosÚdeepy_prompt_infosÚ
alt_promptr   aO  Generate speech by combining the exact words in Text Prompt (`prompt`) with a voice description in Voice instruction (`alt_prompt`). The description defines the voice and delivery for that speech. Select the speech language with Language (`model_mode`), or use Auto. Max duration caps the output; give the script enough time to finish.z¡VoiceDesign combines spoken text (`prompt`) and a voice/delivery description (`alt_prompt`). Language is `model_mode` (or Auto); Max duration caps speech length.zÿPut only the words to speak in `prompt`, naturally punctuated in the target language. Describe age, timbre, accent, pace and emotion in `alt_prompt`, e.g. 'A low, warm male voice, speaking slowly with dry amusement.' Keep one consistent voice description.a™  Put only the words to be spoken in `prompt`, with natural punctuation and spelling in the target language. Put age, timbre, accent, pace and emotion in `alt_prompt`, for example: "An older man with a low, slightly rough voice, speaking slowly with dry amusement." Example spoken text: "Welcome aboard. I promise the robot is doing most of the driving." Keep one consistent voice description for the utterance.r   ÚLanguagezVoice instructionú+young female, warm tone, clear articulation)rª   r¬   r­   r«   r©   r®   r©   r®   z?Reference transcript(s) (optional, multi-speaker: one per line)z\Speaker 1 reference transcript
Speaker 2 reference transcript
Speaker 3 reference transcripté   Úpause_between_sentencesÚpreserve_empty_prompt_linesÚany_audio_promptÚaudio_prompt_choicesÚaudio_prompt_type_sourcesÚcustom_settingsc                 ó6   — g | ]}|                      ¦   «         ‘ŒS ru   )Úcopy)rr   Úones     rH   rs   z'get_qwen3_model_def.<locals>.<listcomp>/  s    € ÐPÐPÐP¨s §¢¡
¤
ÐPÐPÐPrJ   Ú"text_prompt_enhancer_instructions1Ú text_prompt_enhancer_max_tokens1Úaudio_guide_labelzSpeaker 1 reference voiceÚaudio_guide2_labelzSpeaker 2 reference voiceÚaudio_guide3_labelzSpeaker 3 reference voicerª   aC  Clone one to three voices from short reference recordings and speak the Text Prompt (`prompt`) with them.

- **Voice cloning of 1 speaker:** the whole text is spoken with the Speaker 1 reference voice.
- **Voice cloning of 2 or 3 speakers:** write the script as `Speaker 1:`, `Speaker 2:` (and `Speaker 3:`) lines. Each speaker's lines use its own reference voice, in upload order, and the script must use exactly as many speaker numbers as reference voices.

**Reference transcript(s)** (`alt_prompt`, one line per speaker in order) give the exact words spoken in each reference. With a transcript Qwen3 imitates the voice more closely; without one it only uses the overall character of the voice. Use short, clean references of a single speaker. **Language** (`model_mode`) selects the speech language, or Auto. **Pause between sentences** adds silence between turns and split segments, **Auto Split** cuts long text into segments of about that many seconds (0 keeps the automatic segmentation), and Max duration caps the assembled audio. Early Stop returns the segments already completed.r«   aÁ  Write only the words to speak, with natural punctuation in the target language; the delivery follows the reference voice. For a dialogue, start every turn with its speaker number:

```text
Speaker 1: We should leave before the rain gets heavier.
Speaker 2: Give me one minute, I still need my jacket.
Speaker 3: Hurry, the bus is already at the corner.
```

Use as many speaker numbers as reference voices, and keep stage directions out of the text.r¬   aw  `prompt` = words to speak. `audio_prompt_type`: `A` clones `audio_guide`; `AB` / `ABD` make a dialogue with `audio_guide2` (and `audio_guide3`), and the script must use exactly 2 / 3 `Speaker N:` IDs in sample order. `alt_prompt` = optional exact transcripts of the samples, one line per speaker, for closer cloning. Language = `model_mode` or Auto; Max duration caps output.r­   zÅWrite only the words to speak, naturally punctuated; delivery follows the reference voice. Dialogue: one `Speaker N:` line per turn, e.g. 'Speaker 1: Ready?
Speaker 2: Almost.' No stage directions.)	ÚdictÚQWEN3_TTS_DURATION_SLIDERr   r„   rŒ   r‰   Ú#QWEN3_TTS_AUDIO_PROMPT_TYPE_SOURCESÚQWEN3_TTS_CUSTOM_SETTINGSr	   )rV   Úcommonrƒ   Údefault_speakers       rH   Úget_qwen3_model_defrÆ   Ú   s‹  € ðØ�dðà˜ðð 	˜%ðð 	˜qð	ð
 	˜dðð 	˜5ðð 	�tðð 	% bðð 	˜tðð 	˜Ð)ðð 	�4Õ 9Ñ:Ô:ðð 	˜ðð 	,Õ-Aðð 	*¨3ðð 	'¨ðð  	�5ð!ð" 	Ð-ð#ð$ à,;Ð?OÒ,OÐ,O˜c 4˜[˜[ÐVYÐUZà;ØQðð ð ð$
ð $
ð'ð ð €Fð8 Ð1Ò1Ð1Ý% oÑ6Ô6ˆØ)1Ð9˜( 1œ+˜+°rˆð
Øð
õ 5°_ÑEÔEØ*Ø"ðð ð
 pð {ð Jð #^à1Ø?Øðð ð
ð 
ð 
ð 	
ð" Ð1Ò1Ð1ð
Øð
ð gð ð #dð xå5°oÑFÔFØ!Ø#ðð ð -ØLØðð ð
ð 
ð 
ð 	
ð" Ð*Ò*Ð*ð
Øð
ð 
àÝ5°oÑFÔFØ!Ø#ðð ð
ð ØZØØðð ð
ð & tð
ð *¨4ð
ð  ð
ð # Dð
ð  (­Õ.QÑ)RÔ)Rð!
ð" ÐPÐPÕ6OÐPÑPÔPð#
ð$ 1Õ2Kð%
ð& /°ð'
ð(  Ð!<ð)
ð* !Ð"=ð+
ð, !Ð"=ð-
ð. ð  `ð/
ð0 ð  hð1
ð2 ð  Uð3
ð4 !ð  #kð5
ð 
ð 	
ð8 €MrJ   c                  óR   — t          t                               dd¦  «        ¦  «        S )Nr4   r.   )ÚintrÁ   rO   ru   rJ   rH   Úget_qwen3_duration_defaultrÉ   =  s!   € ÝÕ(×,Ò,¨Y¸Ñ;Ô;Ñ<Ô<Ð<rJ   c                 ó^   — t           t          gt          gdœt           t          gt          gdœgS )N)ÚrepoIdÚsourceFolderListÚfileList)ÚQWEN3_TTS_REPOÚQWEN3_TTS_TEXT_TOKENIZER_DIRÚQWEN3_TTS_TEXT_TOKENIZER_FILESÚQWEN3_TTS_SPEECH_TOKENIZER_DIRÚ QWEN3_TTS_SPEECH_TOKENIZER_FILESrˆ   s    rH   Úget_qwen3_download_defrÓ   A  sB   € õ %Ý!=Ð >Ý7Ð8ð	
ð 	
õ %Ý!?Ð @Ý9Ð:ð	
ð 	
ðð rJ   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                  ó*   — t          t          ¦  «        S r`   )rw   rX   ru   rJ   rH   Úquery_supported_typesz$family_handler.query_supported_typesQ  s   € åÕ&Ñ'Ô'Ð'rJ   c                  ó
   — i i fS r`   ru   ru   rJ   rH   Úquery_family_mapsz family_handler.query_family_mapsU  s   € à�2ˆvˆrJ   c                  ó   — dS )NÚttsru   ru   rJ   rH   Úquery_model_familyz!family_handler.query_model_familyY  s   € àˆurJ   c                  ó
   — ddiS )NrÛ   )i˜  ÚTTSru   ru   rJ   rH   Úquery_family_infosz!family_handler.query_family_infos]  s   € à�}Ð%Ð%rJ   c                 ó   — dS )NÚ	qwen3_ttsru   rˆ   s    rH   Úget_lora_dirzfamily_handler.get_lora_dira  s   € àˆ{rJ   c                 ód   — ddl m} | dk    rdn	| dk    rdnd}i t          | ¦  «        ¥d ||Ž d	œ¥S )
Nr   )Úspecialitiesr   )zvoice cloningzspeech dialoguer   )zvoice designru   T)Údevice_expliciträ   )Úmodels.help_sharedrä   rÆ   )rV   Ú	model_defrä   Ú	strengthss       rH   Úquery_model_defzfamily_handler.query_model_defe  s|   € à3Ð3Ð3Ð3Ð3Ð3Ø<KÐO_Ò<_Ð<_Ð8Ð8ð  {Jð  Neò  {eð  {eÐevÐevð  kmˆ	ØzÕ% oÑ6Ô6ÐzÈ4ÐamÐamÐoxÐayÐzÐzÐzÐzrJ   Nc                 ó    — t          |¦  «        S r`   )rÓ   )ÚcomputeListrV   rç   s      rH   Úquery_model_filesz family_handler.query_model_filesk  s   € å% oÑ6Ô6Ð6rJ   Fr   c           
      ó²  — ddl m} t          j        ¦   «         }d }t	          | t
          t          f¦  «        rt          | ¦  «        dk    r| d         }n| }d }|rt          j        |d¬¦  «        }|€|} ||||t          t          j        d¦  «        ¦  «        |j        ¬¦  «        }d|j        i}t          |d	d ¦  «        �|j        j        |d	<   |	ru|rsdd
lm} t%          |¦  «        }|€<t&          j                             dd|› d�¦  «        }t          j        |d¬¦  «        p|} ||j        |||pt          j        |¦  «         |||j        rdgnddœfS )Nr   )ÚQwen3TTSPipeliner   F)Úerror_if_noneÚcpu)Úmodel_weights_pathrV   Ú	ckpt_rootÚdeviceÚcuda_graphsÚtransformerÚspeech_tokenizer)Úsave_quantized_modelr   r   z.json)ÚpipeÚ
cudaGraphs)Úqwen3.pipelinerî   ÚflÚget_download_locationÚ
isinstancerw   ÚtupleÚlenÚlocate_filer   Útorchró   ÚgraphsÚmodelÚgetattrrö   Úwgpr÷   r^   ÚosÚpathrR   Úbfloat16)Úmodel_filenameÚ
model_typerV   rç   ÚquantizeTransformerÚtext_encoder_quantizationÚdtypeÚ	VAE_dtypeÚmixed_precision_transformerÚsave_quantizedÚsubmodel_no_listÚtext_encoder_filenameÚprofileÚlm_featuresÚkwargsrî   rò   Úweights_candidateÚweights_pathÚpipelinerø   r÷   r]   Úconfig_candidates                           rH   Ú
load_modelzfamily_handler.load_modelo  s¸  € ð$ 	5Ð4Ð4Ð4Ð4Ð4åÔ,Ñ.Ô.ˆ	Ø ÐÝ�n¥t­U mÑ4Ô4ð 	/Ý�>Ñ"Ô" QÒ&Ð&Ø$2°1Ô$5Ð!øà .ÐØˆØð 	1Ýœ>Ð*;È5ÐQÑQÔQˆLØÐ#Ø0�à#Ð#Ø+Ø+ØÝ ¥¤¨eÑ!4Ô!4Ñ5Ô5Ø#Ô*ð
ñ 
ô 
ˆð ˜xœ~Ð.ˆÝ�8Ð/°Ñ6Ô6ÐBØ'/Ô'@Ô'FˆDÐ#Ñ$Øð 	q˜lð 	qØ0Ð0Ð0Ð0Ð0Ð0å/°Ñ@Ô@ˆKØÐ"Ý#%¤7§<¢<°¸ÀÐD]ÐD]ÐD]Ñ#^Ô#^Ð Ý œnÐ-=ÈUÐSÑSÔSÐgÐWg�Ø Ð  ¤°¸\È5ÐKbÕTYÔTbÐdoÑpÔpÐpà $ÈÔI[Ð6f°}°o°oÐafÐgÐgÐgÐgrJ   c                 óN  — d|vrd|d<   | dk    rt          | ¦  «        }d|r|d         nddœ}n| dk    rdddœ}n| dk    rd	dd
dœ}ndddœ}|                     ¦   «         D ]\  }}|                     ||¦  «         Œ| dk    r}t          |                     dd	¦  «        pd	¦  «                             ¦   «         }d                     d„ |D ¦   «         ¦  «        dvr%d	d                     d„ |D ¦   «         ¦  «        z   |d<   |dk     r|                     dd¦  «        r	d|d<   d S d S d S )Nr®   rL   r   r   )Úaudio_prompt_typeÚ
model_moder   r   r   r6   ç      à?)r  r  Úpause_secondsr  c              3   ó"   K  — | ]
}|d v ¯|V — ŒdS ©r8   Nru   ©rr   Úflags     rH   ú	<genexpr>z.family_handler.fix_settings.<locals>.<genexpr>Ä  s&   è è € ÐKÐK ¸TÀU¸]¸]�t¸]¸]¸]¸]ÐKÐKrJ   r5   c              3   ó"   K  — | ]
}|d v¯|V — ŒdS r!  ru   r"  s     rH   r$  z.family_handler.fix_settings.<locals>.<genexpr>Å  s.   è è € Ð@yÐ@yÈ$ÐgkÐsxÐgxÐgxÀÐgxÐgxÐgxÐgxÐ@yÐ@yrJ   g…ëQ¸…@r™   Fé2   Útop_k)r„   ÚitemsÚ
setdefaultr[   rO   ÚupperrR   )	rV   Úsettings_versionrç   Úui_defaultsrƒ   ÚdefaultsÚkeyrA   r  s	            rH   Úfix_settingszfamily_handler.fix_settings¥  s¶  € à˜{Ð*Ð*Ø(*ˆK˜Ñ%àÐ5Ò5Ð5Ý)¨/Ñ:Ô:ˆHà%'Ø-5Ð=˜h qœk˜k¸2ðð ˆHˆHð Ð 7Ò7Ð7à%'Ø$ðð ˆHˆHð Ð 0Ò0Ð0à%(Ø$Ø!$ðð ˆHˆHð &(Ø$ðð ˆHð #Ÿ.š.Ñ*Ô*ð 	/ð 	/‰JˆC�Ø×"Ò" 3¨Ñ.Ô.Ð.Ð.ØÐ.Ò.Ð.Ý # K§O¢OÐ4GÈÑ$MÔ$MÐ$TÐQTÑ UÔ U× [Ò [Ñ ]Ô ]ÐØ�wŠwÐKÐKÐ(9ÐKÑKÔKÑKÔKÐSeÐeÐeØ36¸¿ºÐ@yÐ@yÐRcÐ@yÑ@yÔ@yÑ9yÔ9yÑ3y�Ð/Ñ0à˜dÒ"Ð"Ø�}Š}˜^¨UÑ3Ô3ð *Ø')�˜GÑ$Ð$Ð$ð #Ð"ð*ð *rJ   c                 ó|  — | dk    rJt          | ¦  «        }|r|d         nd}|                     d|dt          ¦   «         ddddddddœ¦  «         d S | d	k    r/|                     dd
dt          ¦   «         ddddddddœ¦  «         d S | dk    r0|                     dd
dt          ¦   «         dddddddddœ¦  «         d S d S )Nr   r   rL   r   gÍÌÌÌÌÌì?r&  ÚFG)r  r  r®   Úduration_secondsÚrepeat_generationÚvideo_lengthÚnum_inference_stepsÚnegative_promptr”   r'  Úmulti_prompts_gen_typer   r   r°   r   r6   r  )r  r  r®   r2  r  r3  r4  r5  r6  r”   r'  r7  )r„   ÚupdaterÉ   )rV   rç   r,  rƒ   rÅ   s        rH   Úupdate_default_settingsz&family_handler.update_default_settingsË  sC  € àÐ5Ò5Ð5Ý)¨/Ñ:Ô:ˆHØ-5Ð=˜h qœk˜k¸2ˆOØ×Òà)+Ø"1Ø"$Ý(BÑ(DÔ(DØ)*Ø$%Ø+,Ø')Ø#&ØØ.2ðð ñô ð ð ˆFàÐ5Ò5Ð5Ø×Òà)+Ø"(Ø"OÝ(BÑ(DÔ(DØ)*Ø$%Ø+,Ø')Ø#&ØØ.2ðð ñô ð ð ˆFàÐ.Ò.Ð.Ø×Òà),Ø"(Ø"$Ý(BÑ(DÔ(DØ%(Ø)*Ø$%Ø+,Ø')Ø#&ØØ.2ðð ñô ð ð ð ð /Ð.rJ   c                 ó4  — | dk    r}|�2t          t          |¦  «                             ¦   «         ¦  «        dk    rdS |                     dd¦  «        }|sdS t	          | ¦  «        }|                     ¦   «         |vrd|› d�S d S | d	k    r8|�2t          t          |¦  «                             ¦   «         ¦  «        dk    rd
S d S | dk    �rO|�2t          t          |¦  «                             ¦   «         ¦  «        dk    rdS t          |                     dd¦  «        pd¦  «                             ¦   «         }|                     d¦  «        €dS t          |¦  «        }t          j        d|t          j	        ¬¦  «        d u}d|v r�|                     d¦  «        €dS d|v rdnd}	t          t          j        d|t          j	        ¬¦  «        ¦  «        }
|
s|	› d|	› d�S t          d„ |
D ¦   «         ¦  «        }t          |¦  «        |	k    r|	› d|	› d|	› d�S n|rd S d S d S )!Nr   r   z2Prompt text cannot be empty for Qwen3 CustomVoice.r  rL   z.Please select a speaker for Qwen3 CustomVoice.zUnsupported speaker 'z'.r   z2Prompt text cannot be empty for Qwen3 VoiceDesign.r   z7Prompt text cannot be empty for Qwen3 Base voice clone.r  r6   Úaudio_guidez.Qwen3 Base requires Speaker 1 reference audio.zSpeaker\s*\d+\s*:)ÚflagsÚBÚaudio_guide2z4Two-speaker mode requires Speaker 2 reference audio.ÚDr±   r¦   zSpeaker\s*(\d+)\s*:z@-speaker mode requires prompt lines using Speaker 1: to Speaker z: c                 óR   — h | ]$}t          |                     d ¦  «        ¦  «        ’Œ%S )r   )rÈ   Úgroup)rr   Úms     rH   rv   z<family_handler.validate_generative_prompt.<locals>.<setcomp>&  s(   € Ð%OÐ%OÐ%O¸!¥c¨!¯'ª'°!©*¬*¡o¤oÐ%OÐ%OÐ%OrJ   z-speaker mode requires exactly z( speaker IDs. Use Speaker 1: to Speaker z?:. For headless settings, keep 'multi_prompts_gen_type' = 'FG'.zASpeaker-tag dialogue requires a multi-speaker voice cloning mode.)rÿ   r[   ÚstriprO   r„   rP   r*  ÚreÚsearchÚ
IGNORECASErw   Úfinditerrz   )rV   rç   ÚinputsÚ
one_promptÚspeakerrƒ   r  Úprompt_textÚhas_speaker_syntaxÚspeaker_countÚspeaker_matchesÚspeaker_idss               rH   Úvalidate_generative_promptz)family_handler.validate_generative_prompt  sŒ  € àÐ5Ò5Ð5ØÐ!¥S­¨Z©¬×)>Ò)>Ñ)@Ô)@Ñ%AÔ%AÀQÒ%FÐ%FØKÐKØ—j’j ¨rÑ2Ô2ˆGØð HØGÐGÝ)¨/Ñ:Ô:ˆHØ�}Š}‰Œ hÐ.Ð.Ø:¨wÐ:Ð:Ð:Ð:Ø�4àÐ5Ò5Ð5ØÐ!¥S­¨Z©¬×)>Ò)>Ñ)@Ô)@Ñ%AÔ%AÀQÒ%FÐ%FØKÐKØ�4àÐ.Ò.Ñ.ØÐ!¥S­¨Z©¬×)>Ò)>Ñ)@Ô)@Ñ%AÔ%AÀQÒ%FÐ%FØPÐPÝ # F§J¢JÐ/BÀCÑ$HÔ$HÐ$OÈCÑ PÔ P× VÒ VÑ XÔ XÐØ�zŠz˜-Ñ(Ô(Ð0ØGÐGÝ˜j™/œ/ˆKÝ!#¤Ð+?ÀÕTVÔTaÐ!bÑ!bÔ!bÐjnÐ!nÐØÐ'Ð'Ð'Ø—:’:˜nÑ-Ô-Ð5ØQÐQØ%(Ð,=Ð%=Ð%=  À1�Ý"&¥r¤{Ð3IÈ;Õ^`Ô^kÐ'lÑ'lÔ'lÑ"mÔ"m�Ø&ð Ø+Ð~Ð~ÐmzÐ~Ð~Ð~Ð~Ý$Ð%OÐ%O¸Ð%OÑ%OÔ%OÑPÔP�Ý�{Ñ#Ô# }Ò4Ð4à(ð Wð WÈð Wð Wð  ANð Wð Wð Wðð 5ð
 $ð [ØZÐZØ�4àˆtrJ   c                 ó¦  — | dk    rd S |                      dd ¦  «        }|€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    r7|                     t          d ¦  «         t          |¦  «        dk    r|nd |d<   d S |t          k     s|t          k    r-dt          t          ¦  «        › dt          t          ¦  «        › d�S ||t          <   ||d<   d S )	Nr   r·   z%Custom settings must be a dictionary.r   z,Auto Split Every s must be a number between z and z	 seconds.z#Auto Split Every s must be between )rO   rý   rÀ   ÚQWEN3_TTS_AUTO_SPLIT_SETTING_IDr[   rC  rÿ   ÚpopÚboolÚ
ValueErrorr=   Ú	ExceptionrÈ   Ú QWEN3_TTS_AUTO_SPLIT_MIN_SECONDSÚ QWEN3_TTS_AUTO_SPLIT_MAX_SECONDSÚ%QWEN3_TTS_AUTO_SPLIT_DISABLED_SECONDS)rV   rç   rH  r·   Ú	raw_valueÚauto_split_secondss         rH   Úvalidate_generative_settingsz+family_handler.validate_generative_settings2  s8  € àÐ.Ò.Ð.Ø�4Ø Ÿ*š*Ð%6¸Ñ=Ô=ˆØÐ"Ø�4Ý˜/­4Ñ0Ô0ð 	;Ø:Ð:à#×'Ò'Õ(GÈÑNÔNˆ	ØÐØ�4Ý�i¥Ñ%Ô%ð 	Ø!ŸšÑ)Ô)ˆIÝ�9‰~Œ~ Ò"Ð"Ø×#Ò#Õ$CÀTÑJÔJÐJÝ?BÀ?Ñ?SÔ?SÐVWÒ?WÐ?W¨O¨OÐ]a�Ð(Ñ)Ø�tð	Ý˜)¥TÑ*Ô*ð #Ý ‘l”lÐ"Ý!& yÑ!1Ô!1ÐÐøÝð 	ð 	ð 	ðpÝÕ7Ñ8Ô8ðpð pÝ?BÕCcÑ?dÔ?dðpð pð pðð ð ð	øøøð Õ!FÒFÐFØ×ÒÕ ?ÀÑFÔFÐFÝ;>¸Ñ;OÔ;OÐRSÒ;SÐ;S¨¨ÐY]ˆFÐ$Ñ%Ø�4àÕ!AÒAÐAØ!Õ$DÒDÐDðpÝÕ7Ñ8Ô8ðpð pÝ?BÕCcÑ?dÔ?dðpð pð pðð
 <NˆÕ7Ñ8Ø$3ˆÐ Ñ!Øˆts   Ã2D  Ä 7D:Ä9D:r`   )
FNNNFFNNr   N)Ú__name__Ú
__module__Ú__qualname__Ústaticmethodr×   rÙ   rÜ   rß   râ   ré   rì   r  r/  r9  rP  r\  ru   rJ   rH   rÕ   rÕ   P  s‹  € € € € € Øð(ð (ñ „\ð(ð ðð ñ „\ðð ðð ñ „\ðð ð&ð &ñ „\ð&ð ðð ñ „\ðð ð{ð {ñ „\ð{ð
 ð7ð 7ð 7ñ „\ð7ð ð "Ø"&ØØØ$)ØØØ"ØØð3hð 3hð 3hñ „\ð3hðj ð#*ð #*ñ „\ð#*ðJ ð7ð 7ñ „\ð7ðr ð*ð *ñ „\ð*ðX ð,ð ,ñ „\ð,ð ,ð ,rJ   rÕ   )8rg   r  rD  Úpathlibr   Útypingr   r  Ú
shared.mpsr   Úshared.utilsr   rû   Úprompt_enhancersr   r	   rX   ra   Ú__file__ÚresolveÚparentrY   rÏ   rÑ   Ú"QWEN3_TTS_SPEECH_TOKENIZER_WEIGHTSrÎ   rÐ   rÒ   rx   r‚   rN   rÁ   rÂ   rR  rY  rW  rX  rÃ   r[   rI   rU   r^   rb   rÀ   rj   rw   r~   r„   rþ   r‰   rŒ   rÆ   rÈ   rÉ   rÓ   rÕ   ru   rJ   rH   ú<module>rj     s»  ðà €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€à $Ð $Ð $Ð $Ð $Ð $Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,à MÐ MÐ MÐ MÐ MÐ MÐ MÐ Mð
 7Ø3ðð ð
 7Ø3ðð ð
 0Ø,ðð ðð Ð ð AÐ Ø�D˜‘N”N×*Ò*Ñ,Ô,Ô3°gÑ=À	ÑIÐ à9Ð Ø!;Ð Ø%KÐ "Ø#€ð"ð "ð "Ð ð ØØØ&ð	$Ð  ðð ð Ð ð
ð 
ð 
Ð ð <Øðð ð
 3Øðð ð
 AØðð ð
 LØ/ðð ð
 NØ/ðð ð
 AØðð ð
 CØðð ð
 MØðð ð
 >Øðð ðC%ð %Ð ðN &ØØØØØðð Ð ð $Ð#Ð#à)ØEØAðð ð
 Øð	'ð 	'Ð #ð #7Ð Ø(+Ð %Ø#&Ð  Ø#'Ð  ð .Ø0Ø$ØØ8Ø4Ø/Øð	ð 	ðÐ ð+˜sð + sð +ð +ð +ð +ð+ cð +¨cð +ð +ð +ð +ð"?¨3ð ?°8¸C´=ð ?ð ?ð ?ð ?ð?¨(°3¬-ð ?ð ?ð ?ð ?ð
! sð !¨x¸¬~ð !ð !ð !ð !ð¨ð °°c´ð ð ð ð ð8¨ð 8°°S´	ð 8ð 8ð 8ð 8ð`°ð `¸¸UÀ3ÈÀ8¼_Ô8Mð `ð `ð `ð `ðg¨sð g°t¸EÀ#ÀsÀ(¼OÔ7Lð gð gð gð gð`¨ð `°ð `ð `ð `ð `ðF= Cð =ð =ð =ð =ð¨Cð °D¸´Jð ð ð ð ðOð Oð Oð Oð Oñ Oô Oð Oð Oð OrJ   