+
    TV-j½\  ã                   ó  a € RF t?0 t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	H
t
 ^ RIHt ^ RIHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIHt . RGOt. RHOt. RIOt ! R	 R
]]4      t] ! R R4      4       t ]PB                  ] ! R. RJORRR7      ]PD                  ] ! R. RKORRR7      ]PF                  ] ! R. RLORRR7      ]PH                  ] ! R. RMORRR7      /t%/ t&] ^ k / t'] ^k R R lt(R R lt)R R lt*R  R! lt+R" R# lt,RNR$ R% llt-R& R' lt.R( R) lt/R* R+ lt0R, R- lt1R. R/ lt2R0 R1 lt3R2 R3 lt4R4 R5 lt5R6 R7 lt6R8 R9 lt7RNR: R; llt8R< R= lt9R> R? lt:ROR@ RA llt;RB RC lt<RD t=]>RE8X  d
   ]=! 4        R# R# )Pé    N)Ú	dataclassÚfieldsÚis_dataclass)ÚEnum©ÚPath)Údedent)ÚCallableÚOptional)Úsnapshot_download)Útree_flattenc                   ó*   € ] tR t^tRtRtRtRtRtRt	R# )ÚDomainzSupported model domains.ÚttsÚsttÚstsÚlid© N)
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚTTSÚSTTÚSTSÚLIDÚ__static_attributes__r   ó    Úb/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_audio/convert.pyr   r      s   † Ù"à
€CØ
€CØ
€CØ
„Cr   r   c                   ó0   a € ] tR t^#t o RtV 3R ltRtV tR# )ÚDomainConfigz$Configuration for a specific domain.c                óZ   <€ V ^8„  d   Qh/ S[ ;R&   S[S[ ,          ;R&   S[ ;R&   S[ ;R&   # )é   ÚnameÚtagsÚcli_exampleÚpython_example)ÚstrÚlist)ÚformatÚ__classdict__s   "€r    Ú__annotate__ÚDomainConfig.__annotate__#   s;   ø‡ ‚ ñ �Iñ	 ñ
 ‰s�)�Oñ ñ Ññ ñ Ñò r   r   N)r   r   r   r   r   Ú__annotate_func__r   Ú__classdictcell__)r,   s   @r    r"   r"   #   s   ø‡ € á.÷ ƒ r   r"   r   zOpython -m mlx_audio.tts.generate --model {repo} --text "Hello, this is a test."aS  
        from mlx_audio.tts.utils import load_model
        from mlx_audio.tts.generate import generate_audio

        model = load_model("{repo}")
        generate_audio(
            model=model,
            text="Hello, this is a test.",
            ref_audio="path_to_audio.wav",
            file_prefix="test_audio",
        )
        )r%   r&   r'   r(   r   zCpython -m mlx_audio.stt.generate --model {repo} --audio "audio.wav"a§  
        from mlx_audio.stt.utils import load_model
        from mlx_audio.stt.generate import generate_transcription

        model = load_model("{repo}")
        transcription = generate_transcription(
            model=model,
            audio_path="path_to_audio.wav",
            output_path="path_to_output.txt",
            format="txt",
            verbose=True,
        )
        print(transcription.text)
        r   zCpython -m mlx_audio.sts.generate --model {repo} --audio "audio.wav"zÆ
        from mlx_audio.sts.utils import load_model
        model = load_model("{repo}")
        # Usage depends on the specific STS model type
        # See model documentation for details
        r   z_python -c "from mlx_audio.lid import load; model = load('{repo}'); print(model.predict(audio))"aT  
        from mlx_audio.lid import load
        from mlx_audio.utils import load_audio

        model = load("{repo}")
        audio = load_audio("path_to_audio.wav", sample_rate=16000)  # LID requires 16kHz
        results = model.predict(audio, top_k=5)
        for lang, prob in results:
            print(f"{lang}: {prob:.1%}")
        c                óF   € V ^8„  d   QhR\         R\        \         ,          /# ©r$   ÚdomainÚreturn)r)   Úset)r+   s   "r    r-   r-   |   s   € ÷ 
ñ 
¤#ð 
¬#¬c­(ñ 
r   c                ó¢  € \        \        4      P                  V ,          R,          pVP                  4       '       g   \	        4       # VP                  4        Uu0 uFi  pVP                  4       '       g   K  VP                  P                  R4      '       d   K>  VR,          P                  4       '       g   K]  VP                  kKk  	  up# u upi )z@Discover available model types by scanning the models directory.ÚmodelsÚ_z__init__.py)	r   Ú__file__ÚparentÚexistsr5   ÚiterdirÚis_dirr%   Ú
startswith)r3   Ú
models_dirÚds   &  r    Ú_discover_model_typesrA   |   s�   € ä”h“×&Ñ&¨Õ/°(Õ:€JØ×Ñ×ÒÜ‹uˆð ×#Ñ#Ô%óá%ˆAØ�8‰8�:ô 	àŸf™f×/Ñ/°×4ô 	à:;¸mÕ:K×9SÑ9S×9Uô 	ˆ�ŒÙ%ñð ùò s   ÁCÁ7CÂCÂ9Cc                óF   € V ^8„  d   QhR\         R\        \        ,          /# r2   )r   r5   r)   )r+   s   "r    r-   r-   ‰   s   € ÷ *ñ *œFð *¤s¬3¥xñ *r   c                ón   € V P                   pV\        9  d   \        V4      \        V&   \        V,          # )z2Get the set of available model types for a domain.)ÚvalueÚ_model_types_cacherA   ©r3   Ú
domain_strs   & r    Úget_model_typesrH   ‰   s/   € à—‘€JØÔ+Ô+Ü)>¸zÓ)JÔ˜:Ñ&Ü˜jÕ)Ð)r   c                ó:   € V ^8„  d   QhR\         \        ,          /# ©r$   r4   )r5   r)   )r+   s   "r    r-   r-   ‘   s   € ÷ ñ ¤c¬#¥hñ r   c                óò   € \        V 4      '       d%   \        V 4       Uu0 uF  qP                  kK  	  up# \        V R4      '       d#   \	        \        V 4      P                  4       4      # \	        4       # u upi )zEExtract field names from a config class (dataclass or regular class).Ú__dict__)r   r   r%   Úhasattrr5   ÚvarsÚkeys)Úconfig_classÚfs   & r    Ú_get_config_keysrR   ‘   sb   € ä�L×!Ò!Ü & |Ô 4Ó5Ñ 4˜1—”Ñ 4Ñ5Ð5ä*1°,À
×*KÒ*KŒŒD�Ó×#Ñ#Ó%Ó&ðÜQTÓQVðùò 6s   ŸA4c                ó0   € V ^8„  d   QhR\         R\        /# r2   )r)   Údict)r+   s   "r    r-   r-   š   s   € ÷ /ñ /¤cð /¬dñ /r   c                óf  € R/ R/ R/ /p\        \        V 4      4       Fý  pRV  RV 2p \        P                  ! V4      p\	        VR4      '       dz   VP
                  pRV9   d   \        VR,          4      VR,          V&   RV9   d   \        VR,          4      VR,          V&   RV9   d   \        VR,          4      VR,          V&   K«  K­  \	        VR4      '       d!   \        VP                  4      pWaR,          V&   VVP                  RR	4      0VR,          V&   Kÿ  	  V#   \         d     EK  i ; i)
zÏ
Discover detection hints for all models in a domain.

Each model can optionally define:
- DETECTION_HINTS: dict with 'config_keys', 'architectures', 'path_patterns'
- Or we infer from the ModelConfig class
Úconfig_keysÚarchitecturesÚpath_patternsú
mlx_audio.ú.models.ÚDETECTION_HINTSÚModelConfigr8   Ú )rH   r   Ú	importlibÚimport_modulerM   r[   r5   rR   r\   ÚreplaceÚImportError)r3   ÚhintsÚ
model_typeÚmodule_pathÚmoduleÚmodel_hintsrV   s   &      r    Ú_discover_detection_hintsrg   š   sO  € ð 	�rØ˜Ø˜ð€Eô &¤f¨V£nÖ5ˆ
Ø" 6 (¨(°:°,Ð?ˆð	Ü×,Ò,¨[Ó9ˆFô �vÐ0×1Ò1Ø$×4Ñ4�Ø  KÔ/Ü7:¸;À}Õ;UÓ7V�E˜-Õ(¨Ñ4Ø" kÔ1Ü9<Ø# OÕ4ó:�E˜/Õ*¨:Ñ6ð # kÔ1Ü9<Ø# OÕ4ó:�E˜/Õ*¨:Ó6ñ 2ô ˜6 =×1Ò1Ü"2°6×3EÑ3EÓ"F�KØ7B˜-Õ(¨Ñ4ð Ø×&Ñ& s¨BÓ/ð6��oÕ& zÓ2ñ3 6ðB €Løô ô 	Ûð	ús   ©BD Ã
AD Ä D0Ä/D0c                ó0   € V ^8„  d   QhR\         R\        /# r2   )r   rT   )r+   s   "r    r-   r-   Ì   s   € ÷ .ñ .¤ð .¬4ñ .r   c                ón   € V P                   pV\        9  d   \        V4      \        V&   \        V,          # )z*Get detection hints for a domain (cached).)rD   Ú_detection_hints_cacherg   rF   s   & r    Úget_detection_hintsrk   Ì   s/   € à—‘€JØÔ/Ô/Ü-FÀzÓ-RÔ˜zÑ*Ü! *Õ-Ð-r   c                óR   € V ^8„  d   QhR\         R\        \         ,          R\        /# )r$   Úpath_or_hf_repoÚrevisionr4   )r)   r   r   )r+   s   "r    r-   r-   Ô   s%   € ÷ ñ ¤Cð ´8¼Cµ=ð ÌDñ r   c                óz   € \        V 4      pVP                  4       '       g   \        \        V V. ROR7      4      pV# )zl
Ensures the model is available locally.

Downloads from HuggingFace Hub if the path doesn't exist locally.
)rn   Úallow_patterns)ú*.jsonú*.safetensorsú*.pyú*.modelú
*.tiktokenú*.txtú*.jinjaz*.jsonlú*.yamlú*.wavz*.pth)r   r;   r   )rm   rn   Ú
model_paths   && r    Úget_model_pathr{   Ô   sB   € ô �oÓ&€Jà×Ñ×ÒÜÜØØ!ò ôó
ˆ
ð( Ðr   c                ó0   € V ^8„  d   QhR\         R\        /# ©r$   rz   r4   ©r   rT   )r+   s   "r    r-   r-   ô   s   € ÷ Añ AœDð A¤Tñ Ar   c                óð   € V R,          pVP                  4       '       d8   \        VRRR7      ;_uu_ 4       p\        P                  ! V4      uuRRR4       # \	        RV  24      h  + '       g   i     L; i)z%Load model configuration from a path.úconfig.jsonÚrzutf-8)ÚencodingNzConfig not found at )r;   ÚopenÚjsonÚloadÚFileNotFoundError)rz   Úconfig_pathrQ   s   &  r    Úload_configrˆ   ô   s[   € à˜}Õ,€KØ×Ñ×ÒÜ�+˜s¨W×5Õ5¸Ü—9’9˜Q“<÷ 6Ò5ä
Ð2°:°,Ð?Ó
@Ð@÷ 6×5ús   ¶A%Á%A5	c                óF   € V ^8„  d   QhR\         R\        \        ,          /# )r$   rc   r4   )r)   r   r   )r+   s   "r    r-   r-   ý   s   € ÷ 
ñ 
¤Sð 
¬X´fÕ-=ñ 
r   c                ó\   € V '       g   R# \          F  pV \        V4      9   g   K  Vu # 	  R# )z-Try to match a model_type string to a domain.N)r   rH   )rc   r3   s   & r    Ú_match_by_model_typer‹   ý   s+   € çÙ÷ ˆØœ¨Ó0Ö0ØŠMñ ñ r   c                ó0   € V ^8„  d   QhR\         R\        /# ©r$   Úconfigr4   )rT   r)   )r+   s   "r    r-   r-   
  s   € ÷ Rñ R¤$ð R¬3ñ Rr   c                ó’   € V P                  RR4      P                  4       ;'       g!    V P                  RR4      P                  4       # )zFGet model identifier from config, checking model_type and name fields.rc   r]   r%   )ÚgetÚlower)rŽ   s   &r    Ú_get_model_identifierr’   
  s8   € à�:‰:�l BÓ'×-Ñ-Ó/×QÐQ°6·:±:¸fÀbÓ3I×3OÑ3OÓ3QÐQr   c                óh   € V ^8„  d   QhR\         R\        \        \        \        3,          ,          /# r�   )rT   r   Útupler   r)   )r+   s   "r    r-   r-     s(   € ÷ ñ ¤$ð ¬8´E¼&Ä#¸+Õ4FÕ+Gñ r   c                óH  € \        V P                  4       4      pRp^ p\         Fz  p\        V4      pVP	                  R/ 4      P                  4        FH  w  rgW,          pV'       g   K  \        V4      \        V4      ,          p	W“8”  g   K:  V	R8”  g   KC  T	pWF3pKJ  	  K|  	  V# )z4Try to match config keys to a domain and model type.NrV   ç333333Ó?)r5   rO   r   rk   r�   ÚitemsÚlen)
rŽ   rV   Ú
best_matchÚ
best_scorer3   rb   rc   Ú
model_keysÚintersectionÚscores
   &         r    Ú_match_by_config_keysrž     s“   € ä�f—k‘k“mÓ$€Kà€JØ€JçˆÜ# FÓ+ˆØ&+§i¡i°¸rÓ&B×&HÑ&HÖ&JÑ"ˆJà&Õ3ˆLç‰zÜ˜LÓ)¬C°
«OÕ;�ØÖ%¨%°#®+Ø!&�JØ"(Ð!5’Jó 'Kñ ð Ðr   c                óh   € V ^8„  d   QhR\         R\        \        \        \        3,          ,          /# r}   )r   r   r”   r   r)   )r+   s   "r    r-   r-   %  s(   € ÷ 
ñ 
œtð 
¬´´v¼s°{Õ1CÕ(Dñ 
r   c                óJ  a€ \        V 4      P                  4       o\         F~  p\        V4      pVP	                  R/ 4      P                  4        FL  w  r4\        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       g   KG  W3u u # 	  K€  	  R# )z6Try to match path patterns to a domain and model type.rX   c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5i©Nr   ©Ú.0ÚpatternÚpath_strs   & €r    Ú	<genexpr>Ú!_match_by_path.<locals>.<genexpr>,  s   øé € Ð?±h¨7˜hÖ&³hùó   ƒTFN)r)   r‘   r   rk   r�   r—   Úany)rz   r3   rb   rc   Úpatternsr¦   s   &    @r    Ú_match_by_pathr¬   %  sz   ø€ ä�:‹×$Ñ$Ó&€HçˆÜ# FÓ+ˆØ$)§I¡I¨o¸rÓ$B×$HÑ$HÖ$JÑ ˆJß‹sÔ?±hÓ?�s�sŠsÔ?±hÓ?×?Ô?ØÐ+Ô+ó %Kñ ñ r   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r$   rŽ   rz   r4   )rT   r   r   )r+   s   "r    r-   r-   2  s!   € ÷ ñ ¤ð ´$ð ¼6ñ r   c                óÒ   € \        V 4      p\        V4      pV'       d
   V^ ,          # \        V4      pV'       d   V# \        V 4      pV'       d
   V^ ,          # \        P
                  # )zÑ
Detect whether a model is TTS, STT, or STS based on its configuration.

Uses multiple heuristics in order of reliability:
1. model_type or name field in config
2. Config key matching
3. Path pattern matching
)r’   r¬   r‹   rž   r   r   )rŽ   rz   Úmodel_identifierÚmatchr3   s   &&   r    Údetect_model_domainr±   2  s`   € ô -¨VÓ4Ðô ˜:Ó&€EßØ�Q�xˆô "Ð"2Ó3€FßØˆô " &Ó)€EßØ�Q�xˆô �:‰:Ðr   c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r$   rŽ   rz   r3   r4   )rT   r   r   r)   )r+   s   "r    r-   r-   P  s.   € ÷ %Lñ %Lœ4ð %L¬Tð %L¼6ð %LÄcñ %Lr   c                ój  a€ V P                  RR4      P                  4       pV P                  RR4      P                  4       pW43 F!  pV'       g   K  V\        V4      9   g   K  Vu # 	  \        V4      p\	        V P                  4       4      pRp^ p	VP                  R/ 4      P                  4        F>  w  r«V'       g   K  W{,          p\        V4      \        V4      ,          pWÙ8”  g   K:  Tp	T
pK@  	  V'       d
   V	R8”  d   V# \        V4      P                  4       oVP                  R/ 4      P                  4        FI  w  r®\        ;QJ d    V3R lV 4       F  '       g   K   R	M	  R
M! V3R lV 4       4      '       g   KG  V
u # 	  \        V4      pV'       d   \        \        V4      R4      # R# )z2Determine the specific model type within a domain.rc   r]   r%   NrV   r–   rX   c              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir¢   r   r£   s   & €r    r§   Ú!get_model_type.<locals>.<genexpr>p  s   øé € Ð;±( w˜(Ö"³(ùr©   TFÚunknown)r�   r‘   rH   rk   r5   rO   r—   r˜   r)   rª   ÚnextÚiter)rŽ   rz   r3   rc   Ú
model_nameÚ	candidaterb   rV   r™   rš   Úmtr›   rœ   r�   r«   Úmodel_typesr¦   s   &&&             @r    Úget_model_typer½   P  sd  ø€ ð —‘˜L¨"Ó-×3Ñ3Ó5€JØ—‘˜F BÓ'×-Ñ-Ó/€Jð !Ó-ˆ	ß‰9˜¤o°fÓ&=Ö=ØÒñ .ô
   Ó'€EÜ�f—k‘k“mÓ$€Kà€JØ€JàŸ)™) M°2Ó6×<Ñ<Ö>‰ˆß‰:Ø&Õ3ˆLÜ˜Ó%¬¨J«Õ7ˆEØÖ!Ø"�
Ø’
ñ ?÷ �j 3Ô&ØÐô �:‹×$Ñ$Ó&€HØŸ	™	 /°2Ó6×<Ñ<Ö>‰ˆß‹3Ô;±(Ó;�3�3Š3Ô;±(Ó;×;Ô;ØŠIñ ?ô
 " &Ó)€Kß1<Œ4”�[Ó! 9Ó-ÐKÀ)ÐKr   c                ó0   € V ^8„  d   QhR\         R\        /# )r$   rc   r3   )r)   r   )r+   s   "r    r-   r-   x  s   € ÷ ñ ¤ð ¬Vñ r   c                óæ   € RVP                    RV  2p \        P                  ! V4      #   \         d<   pRT  RTP                   RT 2p\
        P                  ! T4       \        T4      hRp?ii ; i)z=Get the model class module for a given model type and domain.rY   rZ   zModel type 'z' not supported for z	. Error: N)rD   r^   r_   ra   r%   ÚloggingÚerrorÚ
ValueError)rc   r3   rd   ÚeÚmsgs   &&   r    Úget_model_classrÅ   x  ss   € à˜vŸ|™|˜n¨H°Z°LÐA€KðÜ×&Ò& {Ó3Ð3øÜô Ø˜Z˜LÐ(<¸V¿[¹[¸MÈÐSTÐRUÐVˆÜ�Š�cÔÜ˜‹oÐûðús   ”* ªA0µ6A+Á+A0c          
      ó€   € V ^8„  d   QhR\         R\         R\        R\        \        \         ,          \         3,          /# )r$   Úupload_repoÚhf_pathr3   r4   )r)   r   r”   r*   )r+   s   "r    r-   r-   ƒ  s9   € ÷ %ñ %Üð%Ü"ð%Ü,2ð%ä
Œ4”�9”cˆ>Õñ%r   c                ó"  € ^ RI Hp \        V,          pR.VP                  ,           pVP	                  R4       \        RV  RV RV RV RV R	VP                  P                  V R
7       RVP                  P                  V R
7       R24      pWV3# )z4Generate README content and tags for the model card.)Ú__version__Úmlxú	mlx-audioz
        # z8

        This model was converted to MLX format from [`z`](https://huggingface.co/z) using mlx-audio version **zG**.

        Refer to the [original model card](https://huggingface.co/z°) for more details on the model.

        ## Use with mlx-audio

        ```bash
        pip install -U mlx-audio
        ```

        ### CLI Example:
        ```bash
        )ÚrepozC
        ```

        ### Python Example:
        ```python        z
        ```
        )	Úmlx_audio.versionrÊ   ÚDOMAIN_CONFIGSr&   Úappendr	   r'   r+   r(   )rÇ   rÈ   r3   rÊ   rŽ   r&   Úcontents   &&&    r    Úgenerate_readme_contentrÒ   ƒ  sÈ   € õ .ä˜FÕ#€Fàˆ7�V—[‘[Õ €DØ‡K�K�ÔäðØˆ-ð 7à7>°iÐ?YÐZaÐYbÐb~ð  @Kð  Lð LCàCJÀ)ð 
L	ð 
×	Ñ	×	"Ñ	"¨Ð	"Ó	4Ð5ð 6	ð
 
×	Ñ	×	%Ñ	%¨;Ð	%Ó	7Ð8ð 9	ð)	ó€Gð4 ˆ=Ðr   c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r$   ÚpathrÇ   rÈ   r3   )r   r)   r   )r+   s   "r    r-   r-   «  s.   € ÷ Oñ Oœð O¬3ð O¼ð OÄfñ Or   c                óZ  € ^ RI HpHp \        RV 24       \	        WV4      w  rg VP                  V4      pVP                  P                  f   TMVP                  P                  V,           VP                  n        RVP                  n        Wxn
        VP                  V R,          4       V! 4       p	V	P                  VRR7       V	P                  \        V 4      VR	R
7       \        RV 24       R#   \         d-    T! R4      pYhP                  n        RTP                  n         L›i ; i)z*Upload converted model to HuggingFace Hub.)ÚHfApiÚ	ModelCardz[INFO] Uploading to NrÌ   r]   z	README.mdT)Úrepo_idÚexist_okÚmodel)Úfolder_pathrØ   Ú	repo_typez3[INFO] Upload complete! See https://huggingface.co/)Úhuggingface_hubrÖ   r×   ÚprintrÒ   r…   Údatar&   Úlibrary_nameÚ	ExceptionÚtextÚsaveÚcreate_repoÚupload_folderr)   )
rÔ   rÇ   rÈ   r3   rÖ   r×   r&   Úreadme_contentÚcardÚapis
   &&&&      r    Úupload_to_hubré   «  sú   € ç0ä	Ð   Ð
.Ô/ä2°;ÈÓPÑ€Dð-Ø�~‰~˜gÓ&ˆØ!%§¡§¡Ò!7™¸T¿Y¹Y¿^¹^ÈdÕ=Rˆ�	‰	ŒØ!,ˆ�	‰	Ôð „IØ‡I�Iˆd�[Õ Ô!á
‹'€CØ‡O�O˜K°$€OÔ7Ø×ÑÜ˜“IØØð ô ô
 
Ð?À¸}Ð
MÖNøô ô -Ù˜‹}ˆØ�	‰	ŒØ!,ˆ�	‰	Öð-ús   ¦A(C3 Ã34D*Ä)D*c                ót   € V ^8„  d   QhR\         \        ,          R\        \        \        .\        3,          /# )r$   Úquant_predicate_namer4   )r   r)   r
   rª   Úbool)r+   s   "r    r-   r-   É  s2   € ÷ Jñ JÜ!)¬#¥ðJäŒs”Cˆjœ$ÐÕñJr   c                ót   aaa€ \        V RR 4      oR V3R lloV'       g   S# ^ RIHp V! W4      oVV3R l# )z*Build the quantization predicate function.Úmodel_quant_predicatec                 ó   € R # )Tr   )ÚpÚms   &&r    Ú<lambda>Ú'build_quant_predicate.<locals>.<lambda>Í  s   € ÑQUr   c                ó0   € V ^8„  d   QhR\         R\        /# )r$   rÔ   r4   )r)   rì   )r+   s   "r    r-   Ú+build_quant_predicate.<locals>.__annotate__Ï  s   € ÷ 
ñ 
¤ð 
´ñ 
r   c                 óÂ   <€ \        VR 4      ;'       dL    VP                  P                  R,          ^@,          ^ 8H  ;'       d    \        VR4      ;'       d	    S! W4      # )ÚweightÚto_quantizedéÿÿÿÿ)rM   r÷   Úshape)rÔ   re   rî   s   &&€r    Úbase_requirementsÚ0build_quant_predicate.<locals>.base_requirementsÏ  s`   ø€ ä�F˜HÓ%÷ 4ð 4Ø—‘×#Ñ# BÕ'¨"Õ,°Ñ1÷4ð 4ä˜ Ó/÷4ð 4ñ & dÓ3ð		
r   )Úmixed_quant_predicate_builderc                 ó4   <€ S! W4      ;'       d	    S! W4      # r¢   r   )rð   rñ   rû   Úmixed_predicates   &&€€r    rò   ró   Ý  s   ø€ Ñ)¨!Ó/×IÐI±OÀAÓ4IÐIr   )ÚgetattrÚmlx_lm.convertrý   )rÚ   rë   rý   rû   rÿ   rî   s   && @@@r    Úbuild_quant_predicater  É  s?   ú€ ô $ EÐ+BÑDUÓVÐ÷
ð 
÷  Ø Ð å<á3Ð4HÓP€OÝIÐIr   c                ó0   € V ^8„  d   QhR\         R\         /# )r$   ÚsourceÚdestr   )r+   s   "r    r-   r-   à  s   € ÷ $(ñ $(œTð $(¬ñ $(r   c                óÊ  € . R	OpV EFW  p\         P                   ! \        W,          4      4       Fe  p\        V4      P                  pVR8X  g/   VP	                  R4      '       d   VP                  R4      '       d   KO  \        P                  ! WA4       Kg  	  \         P                   ! \        V R,          V,          4      RR7       F’  p\        V4      P                  V 4      p\        VP                  4      ^8:  d   K9  \        V4      P                  pVR8X  d   KW  WP                  ,          pVP                  RRR7       \        P                  ! WG4       K”  	  EKZ  	  R# )
z1Copy supporting files from source to destination.zmodel.safetensors.index.jsonrÚ   z.safetensorsz**T)Ú	recursive©ÚparentsrÙ   N)
rs   rq   rx   ru   rt   rv   rw   ry   z*.ptrr   )Úglobr)   r   r%   r>   ÚendswithÚshutilÚcopyÚrelative_tor˜   Úpartsr:   Úmkdir)r  r  r«   r¥   Úfiler%   Úrel_pathÚdest_dirs   &&      r    Úcopy_model_filesr  à  s  € ò€Hô ˆä—I’Iœc &Õ"2Ó3Ö4ˆDÜ˜“:—?‘?ˆDØÐ5Ô5Ø—‘ ×(Ò(¨T¯]©]¸>×-JÒ-JáÜ�KŠK˜Ö#ñ 5ô —I’Iœc &¨4¥-°'Õ"9Ó:Àd×KˆDÜ˜D“z×-Ñ-¨fÓ5ˆHä�8—>‘>Ó" aÔ'ÙÜ˜“:—?‘?ˆDØÐ5Ô5ÙØŸo™oÕ-ˆHØ�N‰N 4°$ˆNÔ7Ü�KŠK˜Ö'ô Ló r   c                ó0   € V ^8„  d   QhR\         R\        /# r}   r~   )r+   s   "r    r-   r-     s   € ÷ ñ œTð ¤dñ r   c                óˆ  € \         P                   ! \        V R,          4      4      pV'       g   \        RV  24      hV Uu. uF1  p\        V4      P                  P                  R4      '       g   K/  VNK3  	  ppV'       d   Tp/ pV F1  pRV9   d   K  VP                  \        P                  ! V4      4       K3  	  V# u upi )z*Load model weights from safetensors files.rr   zNo safetensors found in ÚconsolidatedÚ	tokenizer)	r
  r)   r†   r   r%   r>   ÚupdateÚmxr…   )rz   Úweight_filesrQ   r  ÚweightsÚwfs   &     r    Úload_weightsr    s    € ä—9’9œS ¨oÕ!=Ó>Ó?€LçÜÐ":¸:¸,Ð GÓHÐHñ  ,ÓW™|˜!¬t°A«w¯|©|×/FÑ/FÀ~×/V—A�A™|€LÐWßØ#ˆà€GÛˆØ˜"ÔÙØ�‰”r—w’w˜r“{Ö#ñ ð
 €Nùò Xs   Á,B?Á2B?c                óB  € V ^8„  d   QhR\         R\         R\        R\        \        ,          R\        \        ,          R\        \         ,          R\        \         ,          R\        \         ,          R	\        R
\        \         ,          R\         R\        \         ,          /# )r$   rÈ   Úmlx_pathÚquantizeÚq_group_sizeÚq_bitsÚdtyperÇ   rn   Ú
dequantizeÚquant_predicateÚq_modeÚmodel_domain)r)   rì   r   Úint)r+   s   "r    r-   r-      sª   € ÷ q>ñ q>Üðq>äðq>ô ðq>ô œ3•-ð	q>ô
 ”S�Mðq>ô ”C�=ðq>ô œ#•ðq>ô ”s�mðq>ô ðq>ô œc•]ðq>ô ðq>ô œ3•-ñq>r   c           	     óà  € ^ RI HpHpHpHp V'       d   V'       d   \        R4      h\        RV  24       \        WR7      p\        V4      pVf   \        VV4      pM\        V4      p\        VVV4      p\        RVP                   RV 24       \        VV4      p\        VR4      '       d   VP                  P!                  V4      MTp\        VR	4      '       d   VVn        \%        V4      pVP'                  V4      p\        VR
4      '       d   VP)                  V4      pVP%                  \+        VP-                  4       4      4       \/        \1        VP3                  4       4      4      pT;'       g    VP5                  R4      pV'       d^   V\6        9   dS   \        RV 24       \9        \:        V4      pVP-                  4        UUu/ uF  w  ppVVP=                  V4      bK  	  pppV'       dF   \?        VV	4      pVP%                  \+        VP-                  4       4      4       V! VVVVV
VR7      w  ppV'       d6   \        R4       V! V4      p\/        \1        VP3                  4       4      4      p\A        V4      pVPC                  RRR7       \E        VV4       V! VVRR7       VVR&   V! VVR,          R7       \        RV 24       V'       d   \G        WV V4       R# R# u uppi )an  
Convert a model from HuggingFace to MLX format.

Automatically detects whether the model is TTS, STT, or STS and handles
conversion appropriately.

Args:
    hf_path: Path to the Hugging Face model or repo ID.
    mlx_path: Path to save the MLX model.
    quantize: Whether to quantize the model.
    q_group_size: Group size for quantization. Uses mode defaults when None.
    q_bits: Bits per weight for quantization. Uses mode defaults when None.
    dtype: Data type for weights (float16, bfloat16, float32).
    upload_repo: Hugging Face repo to upload the converted model.
    revision: Model revision to download.
    dequantize: Whether to dequantize a quantized model.
    quant_predicate: Mixed-bit quantization recipe.
    q_mode: Quantization mode (affine, mxfp4, nvfp4, mxfp8).
    model_domain: Force model domain ("tts", "stt", or "sts"). Auto-detected if None.
)Údequantize_modelÚquantize_modelÚsave_configÚ
save_modelz/Choose either quantize or dequantize, not both.z[INFO] Loading model from )rn   Nz
[INFO] Model domain: z, type: r\   rz   ÚsanitizeÚtorch_dtypez[INFO] Converting to )Úmoder&  z[INFO] DequantizingTr  )Údonate_modelrc   r€   )r‡   z+[INFO] Conversion complete! Model saved to )$Úmlx_lm.utilsr+  r,  r-  r.  rÂ   rÞ   r{   rˆ   r±   r   r½   r%   rÅ   rM   r\   Ú	from_dictrz   r  ÚModelr/  r*   r—   rT   r   Ú
parametersr�   ÚMODEL_CONVERSION_DTYPESr   r  Úastyper  r   r  r  ré   )rÈ   r   r!  r"  r#  r$  rÇ   rn   r%  r&  r'  r(  r+  r,  r-  r.  rz   rŽ   r3   rc   Úmodel_classÚmodel_configr  rÚ   Útarget_dtypeÚmx_dtypeÚkÚvÚfinal_predicates   &&&&&&&&&&&&                 r    Úconvertr@     s�  € ÷D WÓVç—JÜÐJÓKÐKä	Ð& w iÐ
0Ô1Ü Ô;€JÜ˜Ó$€Fð ÒÜ$ V¨ZÓ8‰ä˜Ó%ˆä ¨
°FÓ;€JÜ	Ð# F§K¡K =°¸¸Ð
EÔFô " *¨fÓ5€Kô �; ×.Ò.ð 	×Ñ×)Ñ)¨&Ô1àð ô ˆ|˜\×*Ò*Ø",ˆÔô ˜:Ó&€GØ×Ñ˜lÓ+€Eäˆu�j×!Ò!Ø—.‘. Ó)ˆà	×Ñ”t˜GŸM™M›OÓ,Ô-Ü”< × 0Ñ 0Ó 2Ó3Ó4€Gð ×5Ð5˜FŸJ™J }Ó5€Lß˜Ô(?Ô?ÜÐ% l ^Ð4Ô5Üœ2˜|Ó,ˆØ5<·]±]´_ÔE±_©T¨Q°�1�a—h‘h˜xÓ(Ò(±_ˆÑE÷ Ü/°°ÓGˆØ×Ñœ4 §¡£Ó0Ô1Ù(ØØØØØØ+ô
‰ˆ�÷ ÜÐ#Ô$Ù  Ó'ˆÜ”| E×$4Ñ$4Ó$6Ó7Ó8ˆô �H‹~€HØ‡N�N˜4¨$€NÔ/Ü�Z Ô*ñ ˆx˜¨TÕ2Ø%€Fˆ<ÑÙ� H¨}Õ$<Õ=ä	Ð7¸°zÐ
BÔCçÜ�h¨W°fÖ=ñ ùóA Fs   ÇK*c                ó8   € V ^8„  d   QhR\         P                  /# rJ   )ÚargparseÚArgumentParser)r+   s   "r    r-   r-   ”  s   € ÷ Rñ Rœ(×1Ñ1ñ Rr   c                 óž  € \         P                  ! RR7      p V P                  R\        RRR7       V P                  R\        RR	R
7       V P                  RRRRR7       V P                  R\        RRR
7       V P                  R\        RRR
7       V P                  R\
        \        RRR7       V P                  R\        \        RR7       V P                  R\        \        RRR7       V P                  R\        RR R
7       V P                  R!\        RR"R
7       V P                  R#R$RR%R7       V P                  R&\        . R(ORR'R7       V # ))z)Configure and return the argument parser.z:Convert HuggingFace model (TTS, STT, or STS) to MLX format)Údescriptionz	--hf-pathTz*Path to the Hugging Face model or repo ID.)ÚtypeÚrequiredÚhelpz
--mlx-pathÚ	mlx_modelzPath to save the MLX model.)rF  ÚdefaultrH  z-qz
--quantizeÚ
store_truezGenerate a quantized model.)ÚactionrH  z--q-group-sizeNz6Group size for quantization (mode default if omitted).z--q-bitsz;Bits per weight for quantization (mode default if omitted).z--q-modeÚaffinezQuantization mode.)ÚchoicesrF  rJ  rH  z--quant-predicatezMixed-bit quantization recipe.)rN  rF  rH  z--dtypezData type for weights.)rF  rN  rJ  rH  z--upload-repoz)Hugging Face repo to upload the model to.z
--revisionzModel revision to download.z-dz--dequantizezDequantize a quantized model.z--model-domainz4Force model domain (auto-detected if not specified).)r   r   r   r   )rB  rC  Úadd_argumentr)   r)  ÚQUANT_MODESÚQUANT_RECIPESr7  )Úparsers    r    Úconfigure_parserrS  ”  s±  € ä×$Ò$ØPô€Fð ×ÑØÜØØ9ð	 ô ð ×ÑØÜØØ*ð	 ô ð ×ÑØØØØ*ð	 ô ð ×ÑØÜØØEð	 ô ð ×ÑØÜØØJð	 ô ð ×ÑØÜÜØØ!ð ô ð ×ÑØÜÜØ-ð	 ô ð ×ÑØÜÜ'ØØ%ð ô ð ×ÑØÜØØ8ð	 ô ð ×ÑØÜØØ*ð	 ô ð ×ÑØØØØ,ð	 ô ð ×ÑØÜÚ,ØØCð ô ð €Mr   c                  ób   € \        4       p V P                  4       p\        R/ \        V4      B  R # )Nr   )rS  Ú
parse_argsr@  rN   )rR  Úargss     r    ÚmainrW  é  s'   € ÜÓ€FØ×ÑÓ€DÜÑŒd�4‹jÔr   Ú__main__c                óÂ   € V ^8„  d   Qh/ ^ \         9   d&   \        \        \        \        ,          3,          ;R&   ^\         9   d   \        \        \        3,          ;R&   # )r$   rE   rj   )Ú__conditional_annotations__rT   r)   r5   )r+   s   "r    r-   r-      sC   € ‡�÷h -Ò ,”Dœœc¤#�h˜Õ'Ñ ,ñi ÷j -Ò ,œœS¤$˜Y�Ñ ,òk r   )Úfloat16Úbfloat16Úfloat32)Ú	mixed_2_6Ú	mixed_3_4Ú	mixed_3_6Ú	mixed_4_6)rM  Úmxfp4Únvfp4Úmxfp8)ztext-to-speechÚspeechzspeech generationzvoice cloningr   )zspeech-to-textre  ÚtranscriptionÚasrr   )zspeech-to-speechre  Úaudiozspeech enhancementzaudio separationr   )zaudio-classificationre  zlanguage-identificationr   r¢   )rI  FNNNNNFNrM  N)@rZ  rB  r
  r^   r„   rÀ   r  Údataclassesr   r   r   Úenumr   Úpathlibr   Útextwrapr	   Útypingr
   r   Úmlx.coreÚcorer  rÝ   r   Ú	mlx.utilsr   r7  rQ  rP  r)   r   r"   r   r   r   r   rÏ   rE   rj   rA   rH   rR   rg   rk   r{   rˆ   r‹   r’   rž   r¬   r±   r½   rÅ   rÒ   ré   r  r  r  r@  rS  rW  r   r-   )rZ  s   @r    Ú<module>rq     s›  øð÷ €Û Û Û Û Û ß 7Ñ 7Ý Ý Ý ß %å Ý -Ý "ò =Ð ÚD€Ú3€ôˆS�$ô ð ÷ð ó ðð ‡J�J‘ØÚVØeðô	ð" ‡J�J‘ØÚHØYðô	ð& ‡J�J‘Øò
ð Zðôð$ ‡J�J‘ØÚQØwð	ô	ðoF€ðT +-Ð Ó ,Ø*,Ð Ó ,õ
õ*õõ/õd.÷õ@Aõ
õRõ
õ,
õõ<%LõPõ%õPO÷<Jõ.$(õN÷2q>õhRòjð ˆzÔÙ†Fñ r   