Ë
    îÿæi™Z  ã                   óX  — U d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ g d	¢Zg d
¢Zg d¢Z G d„ dee«      Ze G d„ d«      «       Zej@                   edg d¢dd¬«      ejB                   edg d¢dd¬«      ejD                   edg d¢dd¬«      ejF                   edg d¢dd ¬«      iZ$i Z%e&ee'e   f   e(d!<   i Z)e&ee&f   e(d"<   d#ed$e'e   fd%„Z*d#ed$e'e   fd&„Z+d$e'e   fd'„Z,d#ed$e&fd(„Z-d#ed$e&fd)„Z.dPd*ed+ee   d$efd,„Z/d-ed$e&fd.„Z0d/ed$ee   fd0„Z1d1e&d$efd2„Z2d1e&d$ee3eef      fd3„Z4d-ed$ee3eef      fd4„Z5d1e&d-ed$efd5„Z6d1e&d-ed#ed$efd6„Z7d/ed#efd7„Z8d8ed9ed#ed$e3e9e   ef   fd:„Z:d;ed8ed9ed#efd<„Z;	 dPd=ee   d$eee<ge=f   fd>„Z>d?ed@efdA„Z?d-ed$e&fdB„Z@	 	 	 	 	 	 	 	 	 	 	 dQd9edCedDe=dEeeA   dFeeA   dGee   d8ee   d+ee   dHe=dIee   dJedKee   fdL„ZBd$e j†                  fdM„ZDdN„ ZEeFdOk(  r eE«        yy)Ré    N)Ú	dataclassÚfieldsÚis_dataclass)ÚEnum)ÚPath)Údedent)ÚCallableÚOptional)Úsnapshot_download)Útree_flatten)Úfloat16Úbfloat16Úfloat32)Ú	mixed_2_6Ú	mixed_3_4Ú	mixed_3_6Ú	mixed_4_6)ÚaffineÚmxfp4Únvfp4Úmxfp8c                   ó    — e Zd ZdZdZdZdZdZy)ÚDomainzSupported model domains.ÚttsÚsttÚstsÚlidN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚTTSÚSTTÚSTSÚLID© ó    úf/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/mlx_audio/convert.pyr   r      s   „ Ù"à
€CØ
€CØ
€CØ
�Cr'   r   c                   ó@   — e Zd ZU dZeed<   ee   ed<   eed<   eed<   y)ÚDomainConfigz$Configuration for a specific domain.ÚnameÚtagsÚcli_exampleÚpython_exampleN)r   r   r    r!   ÚstrÚ__annotations__Úlistr&   r'   r(   r*   r*   #   s   … á.à
ƒIØ
ˆs‰)ƒOØÓØÔr'   r*   r"   )ztext-to-speechÚspeechzspeech generationzvoice cloningr   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#   )zspeech-to-textr2   ÚtranscriptionÚasrr   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$   )zspeech-to-speechr2   Úaudiozspeech enhancementzaudio separationr   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audio-classificationr2   zlanguage-identificationr   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%}")
        Ú_model_types_cacheÚ_detection_hints_cacheÚdomainÚreturnc                 óJ  — t        t        «      j                  | z  dz  }|j                  «       s
t	        «       S |j                  «       D �ch c]L  }|j                  «       r:|j                  j                  d«      s|dz  j                  «       r|j                  ’ŒN c}S c c}w )z@Discover available model types by scanning the models directory.ÚmodelsÚ_z__init__.py)	r   Ú__file__ÚparentÚexistsÚsetÚiterdirÚis_dirr+   Ú
startswith)r8   Ú
models_dirÚds      r(   Ú_discover_model_typesrF   |   sŒ   € ä”h“×&Ñ&¨Ñ/°(Ñ:€JØ×ÑÔÜ‹uˆð ×#Ñ#Ô%óá%ˆAØ�8‰8Œ:˜aŸf™f×/Ñ/°Ô4¸!¸mÑ:K×9SÑ9SÔ9Uð 	
�‹Ø%ñð ùò s   ÁAB c                 ó`   — | j                   }|t        vrt        |«      t        |<   t        |   S )z2Get the set of available model types for a domain.)Úvaluer6   rF   ©r8   Ú
domain_strs     r(   Úget_model_typesrK   ‰   s/   € à—‘€JØÔ+Ñ+Ü)>¸zÓ)JÔ˜:Ñ&Ü˜jÑ)Ð)r'   c                 óØ   — t        | «      r#t        | «      D �ch c]  }|j                  ’Œ c}S t        | d«      r"t	        t        | «      j                  «       «      S t	        «       S c c}w )zEExtract field names from a config class (dataclass or regular class).Ú__dict__)r   r   r+   Úhasattrr@   ÚvarsÚkeys)Úconfig_classÚfs     r(   Ú_get_config_keysrS   ‘   s^   € ä�LÔ!Ü & |Ô 4Ó5Ñ 4˜1�—“Ð 4Ñ5Ð5ä*1°,À
Ô*KŒŒD�Ó×#Ñ#Ó%Ó&ðÜQTÓQVðùò 6s   ™A'c                 óæ  — i i i dœ}t        t        | «      «      D ]Ä  }d| › d|› �}	 t        j                  |«      }t	        |d«      rU|j
                  }d|v rt        |d   «      |d   |<   d|v rt        |d   «      |d   |<   d|v rXt        |d   «      |d   |<   nCt	        |d«      rt        |j                  «      }||d   |<   ||j                  d	d
«      h|d   |<   ŒÆ |S # t        $ r Y ŒÔw xY w)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_HINTSrU   rV   rW   ÚModelConfigr<   Ú )rK   r   Ú	importlibÚimport_modulerN   rZ   r@   rS   r[   ÚreplaceÚImportError)r8   ÚhintsÚ
model_typeÚmodule_pathÚmoduleÚmodel_hintsrU   s          r(   Ú_discover_detection_hintsrf   š   sA  € ð ØØñ€Eô &¤f¨V£nÖ5ˆ
Ø" 6 (¨(°:°,Ð?ˆð	Ü×,Ñ,¨[Ó9ˆFô �vÐ0Ô1Ø$×4Ñ4�Ø  KÑ/Ü7:¸;À}Ñ;UÓ7V�E˜-Ñ(¨Ñ4Ø" kÑ1Ü9<Ø# OÑ4ó:�E˜/Ñ*¨:Ñ6ð # kÑ1Ü9<Ø# OÑ4ó:�E˜/Ñ*¨:Ò6ô
 ˜6 =Ô1Ü"2°6×3EÑ3EÓ"F�KØ7B�E˜-Ñ(¨Ñ4ð Ø×&Ñ& s¨BÓ/ð6��oÑ& zÑ2øð3 6ðB €Løô ò 	Ùð	ús   §B9C$Ã$	C0Ã/C0c                 ó`   — | j                   }|t        vrt        |«      t        |<   t        |   S )z*Get detection hints for a domain (cached).)rH   r7   rf   rI   s     r(   Úget_detection_hintsrh   Ì   s/   € à—‘€JØÔ/Ñ/Ü-FÀzÓ-RÔ˜zÑ*Ü! *Ñ-Ð-r'   Úpath_or_hf_repoÚrevisionc                 ón   — t        | «      }|j                  «       st        t        | |g d¢¬«      «      }|S )zx
    Ensures the model is available locally.

    Downloads from HuggingFace Hub if the path doesn't exist locally.
    )
ú*.jsonú*.safetensorsú*.pyú*.modelú
*.tiktokenú*.txtz*.jsonlú*.yamlú*.wavz*.pth)rj   Úallow_patterns)r   r?   r   )ri   rj   Ú
model_paths      r(   Úget_model_pathrv   Ô   s?   € ô �oÓ&€Jà×ÑÔÜÜØØ!ò ôó
ˆ
ð& Ðr'   ru   c                 óº   — | dz  }|j                  «       r-t        |dd¬«      5 }t        j                  |«      cddd«       S t	        d| › �«      ‚# 1 sw Y   ŒxY w)z%Load model configuration from a path.úconfig.jsonÚrzutf-8)ÚencodingNzConfig not found at )r?   ÚopenÚjsonÚloadÚFileNotFoundError)ru   Úconfig_pathrR   s      r(   Úload_configr€   ó   sU   € à˜}Ñ,€KØ×ÑÔÜ�+˜s¨WÕ5¸Ü—9‘9˜Q“<÷ 6Ñ5ä
Ð2°:°,Ð?Ó
@Ð@÷ 6Ð5ús   ¤AÁArb   c                 óB   — | syt         D ]  }| t        |«      v sŒ|c S  y)z-Try to match a model_type string to a domain.N)r   rK   )rb   r8   s     r(   Ú_match_by_model_typer‚   ü   s+   € áØ÷ ˆØœ¨Ó0Ò0ØŠMð ð r'   Úconfigc                 ó†   — | j                  dd«      j                  «       xs  | j                  dd«      j                  «       S )zFGet model identifier from config, checking model_type and name fields.rb   r\   r+   )ÚgetÚlower)rƒ   s    r(   Ú_get_model_identifierr‡   	  s5   € à�:‰:�l BÓ'×-Ñ-Ó/ÒQ°6·:±:¸fÀbÓ3I×3OÑ3OÓ3QÐQr'   c                 ó  — t        | j                  «       «      }d}d}t        D ]f  }t        |«      }|j	                  di «      j                  «       D ]6  \  }}||z  }|sŒt        |«      t        |«      z  }	|	|kD  sŒ+|	dkD  sŒ1|	}||f}Œ8 Œh |S )z4Try to match config keys to a domain and model type.Nr   rU   ç333333Ó?)r@   rP   r   rh   r…   ÚitemsÚlen)
rƒ   rU   Ú
best_matchÚ
best_scorer8   ra   rb   Ú
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âÜ˜LÓ)¬C°
«OÑ;�Ø˜:Ó%¨%°#«+Ø!&�JØ"(¨*Ð!5‘Jñ 'Kð ð Ðr'   c                 óì   ‡— t        | «      j                  «       Št        D ]Q  }t        |«      }|j	                  di «      j                  «       D ]!  \  }}t        ˆfd„|D «       «      sŒ||fc c S  ŒS y)z6Try to match path patterns to a domain and model type.rW   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©Nr&   ©Ú.0ÚpatternÚpath_strs     €r(   Ú	<genexpr>z!_match_by_path.<locals>.<genexpr>+  s   øè ø€ Ð?±h¨7�7˜hÔ&±hùó   ƒN)r/   r†   r   rh   r…   rŠ   Úany)ru   r8   ra   rb   Úpatternsr˜   s        @r(   Ú_match_by_pathr�   $  sk   ø€ ä�:‹×$Ñ$Ó&€HçˆÜ# FÓ+ˆØ$)§I¡I¨o¸rÓ$B×$HÑ$HÖ$JÑ ˆJ˜ÜÓ?±hÓ?Õ?Ø 
Ð+Ô+ñ %Kð ð r'   c                 óž   — t        | «      }t        |«      }|r|d   S t        |«      }|r|S t        | «      }|r|d   S t        j
                  S )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"   )rƒ   ru   Úmodel_identifierÚmatchr8   s        r(   Údetect_model_domainr¡   1  s`   € ô -¨VÓ4Ðô ˜:Ó&€EÙØ�Q‰xˆô "Ð"2Ó3€FÙØˆô " &Ó)€EÙØ�Q‰xˆô �:‰:Ðr'   c                 ó¼  ‡— | j                  dd«      j                  «       }| j                  dd«      j                  «       }||fD ]  }|sŒ|t        |«      v sŒ|c S  t        |«      }t	        | j                  «       «      }d}d}	|j                  di «      j                  «       D ].  \  }
}|sŒ	||z  }t        |«      t        |«      z  }||	kD  sŒ+|}	|
}Œ0 |r|	dkD  r|S t        |«      j                  «       Š|j                  di «      j                  «       D ]  \  }
}t        ˆfd	„|D «       «      sŒ|
c S  t        |«      }|rt        t        |«      d
«      S d
S )z2Determine the specific model type within a domain.rb   r\   r+   Nr   rU   r‰   rW   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr”   r&   r•   s     €r(   r™   z!get_model_type.<locals>.<genexpr>o  s   øè ø€ Ð;±( wˆw˜(Ô"±(ùrš   Úunknown)r…   r†   rK   rh   r@   rP   rŠ   r‹   r/   r›   ÚnextÚiter)rƒ   ru   r8   rb   Ú
model_nameÚ	candidatera   rU   rŒ   r�   ÚmtrŽ   r�   r�   rœ   Úmodel_typesr˜   s                   @r(   Úget_model_typer«   O  sW  ø€ ð —‘˜L¨"Ó-×3Ñ3Ó5€JØ—‘˜F BÓ'×-Ñ-Ó/€Jð ! *Ó-ˆ	Ú˜¤o°fÓ&=Ò=ØÒð .ô
   Ó'€EÜ�f—k‘k“mÓ$€Kà€JØ€JàŸ)™) M°2Ó6×<Ñ<Ö>‰ˆˆJÚØ&¨Ñ3ˆLÜ˜Ó%¬¨J«Ñ7ˆEØ�zÓ!Ø"�
Ø‘
ð ?ñ �j 3Ò&ØÐô �:‹×$Ñ$Ó&€HØŸ	™	 /°2Ó6×<Ñ<Ö>‰ˆˆHÜÓ;±(Ó;Õ;ØŠIð ?ô
 " &Ó)€KÙ1<Œ4”�[Ó! 9Ó-ÐKÀ)ÐKr'   c                 óÞ   — d|j                   › d| › �}	 t        j                  |«      S # t        $ r:}d| › d|j                  › d|› �}t        j                  |«       t        |«      ‚d}~ww xY w)z=Get the model class module for a given model type and domain.rX   rY   zModel type 'z' not supported for z	. Error: N)rH   r]   r^   r`   r+   ÚloggingÚerrorÚ
ValueError)rb   r8   rc   ÚeÚmsgs        r(   Úget_model_classr²   w  ss   € à˜vŸ|™|˜n¨H°Z°LÐA€KðÜ×&Ñ& {Ó3Ð3øÜò Ø˜Z˜LÐ(<¸V¿[¹[¸MÈÐSTÐRUÐVˆÜ�‰�cÔÜ˜‹oÐûðús   ”) ©	A,²5A'Á'A,Úupload_repoÚhf_pathc                 ó  — ddl m} t        |   }dg|j                  z   }|j	                  d«       t        d| › d|› d|› d|› d	|› d
|j                  j                  | ¬«      › d|j                  j                  | ¬«      › d�«      }||fS )z4Generate README content and tags for the model card.r   )Ú__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-   Úformatr.   )r³   r´   r8   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'   Úpathc                 óH  — ddl m}m} t        d|› �«       t	        |||«      \  }}	 |j                  |«      }|j                  j                  €|n|j                  j                  |z   |j                  _        d|j                  _        ||_
        |j                  | dz  «        |«       }	|	j                  |d¬	«       |	j                  t        | «      |d
¬«       t        d|› �«       y# t        $ r-  |d«      }||j                  _        d|j                  _        Y Œ–w xY w)z*Upload converted model to HuggingFace Hub.r   )Ú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´   r8   rÂ   rÃ   r,   Úreadme_contentÚcardÚapis
             r(   Úupload_to_hubrÕ   ª  s  € ç0ä	Ð   Ð
.Ô/ä2°;ÀÈÓPÑ€Dˆ.ð-Ø�~‰~˜gÓ&ˆØ!%§¡§¡Ð!7™¸T¿Y¹Y¿^¹^ÈdÑ=Rˆ�	‰	ŒØ!,ˆ�	‰	Ôð €D„IØ‡I�Iˆd�[Ñ Ô!á
‹'€CØ‡O�O˜K°$€OÔ7Ø×ÑÜ˜“IØØð ô ô
 
Ð?À¸}Ð
MÕNøô ò -Ù˜‹}ˆØˆ�	‰	ŒØ!,ˆ�	‰	Öð-ús   ¨A"C+ Ã+3D!Ä D!Úquant_predicate_namec                 óz   ‡‡‡— t        | dd„ «      Šdt        dt        fˆfd„Š|s‰S ddlm}  ||| «      Šˆˆfd„S )	z*Build the quantization predicate function.Úmodel_quant_predicatec                  ó   — y)NTr&   )ÚpÚms     r(   Ú<lambda>z'build_quant_predicate.<locals>.<lambda>Ì  s   € ÐQUr'   rÀ   r9   c                 ó�   •— t        |d«      xr8 |j                  j                  d   dz  dk(  xr t        |d«      xr	  ‰| |«      S )NÚweightéÿÿÿÿé@   r   Úto_quantized)rN   rÞ   Úshape)rÀ   rd   rØ   s     €r(   Úbase_requirementsz0build_quant_predicate.<locals>.base_requirementsÎ  sS   ø€ ä�F˜HÓ%ò 4Ø—‘×#Ñ# BÑ'¨"Ñ,°Ñ1ò4ä˜ Ó/ò4ñ & d¨FÓ3ð		
r'   r   )Úmixed_quant_predicate_builderc                 ó,   •—  ‰| |«      xr	  ‰| |«      S r”   r&   )rÚ   rÛ   rã   Úmixed_predicates     €€r(   rÜ   z'build_quant_predicate.<locals>.<lambda>Ü  s   ø€ Ñ)¨!¨QÓ/ÒI±OÀAÀqÓ4IÐIr'   )Úgetattrr/   ÚboolÚmlx_lm.converträ   )rÆ   rÖ   rä   rã   ræ   rØ   s      @@@r(   Úbuild_quant_predicaterê   È  sJ   ú€ ô $ EÐ+BÑDUÓVÐð
¤ð 
´õ 
ñ  Ø Ð å<á3Ð4HÈ%ÓP€OÜIÐIr'   ÚsourceÚdestc                 ór  — g d¢}|D �]-  }t        j                   t        | |z  «      «      D ]U  }t        |«      j                  }|dk(  s"|j	                  d«      r|j                  d«      rŒ@t        j                  ||«       ŒW t        j                   t        | dz  |z  «      d¬«      D ]ˆ  }t        |«      j                  | «      }t        |j                  «      dk  rŒ6t        |«      j                  }|dk(  rŒQ||j                  z  }|j                  dd¬	«       t        j                  ||«       ŒŠ �Œ0 y
)z1Copy supporting files from source to destination.)	rn   rl   rr   rp   ro   rq   rs   z*.ptrm   zmodel.safetensors.index.jsonrÆ   z.safetensorsz**T)Ú	recursiveé   ©ÚparentsrÅ   N)Úglobr/   r   r+   rC   Ú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 &¨7Ñ"2Ó3Ö4ˆDÜ˜“:—?‘?ˆDØÐ5Ò5Ø—‘ Ô(¨T¯]©]¸>Ô-JàÜ�K‰K˜˜dÕ#ð 5ô —I‘Iœc &¨4¡-°'Ñ"9Ó:Àd×KˆDÜ˜D“z×-Ñ-¨fÓ5ˆHä�8—>‘>Ó" aÒ'ØÜ˜“:—?‘?ˆDØÐ5Ò5ØØ˜hŸo™oÑ-ˆHØ�N‰N 4°$ˆNÔ7Ü�K‰K˜˜hÕ'ò Lñ r'   c                 óÌ   — t        j                   t        | dz  «      «      }|st        d| › �«      ‚i }|D ]+  }d|v rŒ|j                  t	        j
                  |«      «       Œ- |S )z*Load model weights from safetensors files.rm   zNo safetensors found in Ú	tokenizer)rò   r/   r~   ÚupdateÚmxr}   )ru   Úweight_filesÚweightsÚwfs       r(   Úload_weightsr    se   € ä—9‘9œS ¨oÑ!=Ó>Ó?€LáÜÐ":¸:¸,Ð GÓHÐHà€GÛˆØ˜"ÑØØ�‰”r—w‘w˜r“{Õ#ð ð
 €Nr'   Úmlx_pathÚquantizeÚq_group_sizeÚq_bitsÚdtypeÚ
dequantizeÚquant_predicateÚq_modeÚmodel_domainc                 óR  — ddl m}m}m}m} |r|rt        d«      ‚t        d| › �«       t        | |¬«      }t        |«      }|€t        ||«      }nt        |«      }t        |||«      }t        d|j                  › d|› �«       t        ||«      }t        |d	«      r|j                  j!                  |«      n|}t        |d
«      r||_        t%        |«      }|j'                  |«      }t        |d«      r|j)                  |«      }|j%                  t+        |j-                  «       «      «       t/        t1        |j3                  «       «      «      }|xs |j5                  d«      }|rX|t6        v rPt        d|› �«       t9        t:        |«      }|j-                  «       D ��ci c]  \  }}||j=                  |«      “Œ }}}|rEt?        ||	«      }|j%                  t+        |j-                  «       «      «        ||||||
|¬«      \  }}|r5t        d«        ||«      }t/        t1        |j3                  «       «      «      }tA        |«      }|jC                  dd¬«       tE        ||«        |||d¬«       ||d<    |||dz  ¬«       t        d|› �«       |rtG        ||| |«       yyc c}}w )a²  
    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.
    r   )Údequantize_modelÚquantize_modelÚsave_configÚ
save_modelz/Choose either quantize or dequantize, not both.z[INFO] Loading model from )rj   Nz
[INFO] Model domain: z, type: r[   ru   ÚsanitizeÚtorch_dtypez[INFO] Converting to )Úmoder  z[INFO] DequantizingTrð   )Údonate_modelrb   rx   )r   z+[INFO] Conversion complete! Model saved to )$Úmlx_lm.utilsr  r  r  r  r¯   rÊ   rv   r€   r¡   r   r«   r+   r²   rN   r[   Ú	from_dictru   r  ÚModelr  r1   rŠ   Údictr   Ú
parametersr…   ÚMODEL_CONVERSION_DTYPESrç   r   Úastyperê   r   rø   rü   rÕ   )r´   r  r  r  r  r	  r³   rj   r
  r  r  r  r  r  r  r  ru   rƒ   r8   rb   Ú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˜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   ÆJ#c                  óœ  — t        j                  d¬«      } | j                  dt        dd¬«       | j                  dt        dd	¬
«       | j                  dddd¬«       | j                  dt        dd¬
«       | j                  dt        dd¬
«       | j                  dt
        t        dd¬«       | j                  dt        t        d¬«       | j                  dt        t        dd¬«       | j                  dt        dd ¬
«       | j                  d!t        dd"¬
«       | j                  d#d$dd%¬«       | j                  d&t        g d'¢dd(¬«       | S ))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.)r(  Údefaultr*  z-qz
--quantizeÚ
store_truezGenerate a quantized model.)Úactionr*  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-moder   zQuantization mode.)Úchoicesr(  r,  r*  z--quant-predicatezMixed-bit quantization recipe.)r/  r(  r*  z--dtypezData type for weights.)r(  r/  r,  r*  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-domain)r   r   r   r   z4Force model domain (auto-detected if not specified).)ÚargparseÚArgumentParserÚadd_argumentr/   ÚintÚQUANT_MODESÚQUANT_RECIPESr  )Úparsers    r(   Úconfigure_parserr7  ‰  s±  € ä×$Ñ$ØPô€Fð ×ÑØÜØØ9ð	 ô ð ×ÑØÜØØ*ð	 ô ð ×ÑØØØØ*ð	 ô ð ×ÑØÜØØEð	 ô ð ×ÑØÜØØJð	 ô ð ×ÑØÜÜØØ!ð ô ð ×ÑØÜÜØ-ð	 ô ð ×ÑØÜÜ'ØØ%ð ô ð ×ÑØÜØØ8ð	 ô ð ×ÑØÜØØ*ð	 ô ð ×ÑØØØØ,ð	 ô ð ×ÑØÜÚ,ØØCð ô ð €Mr'   c                  ó`   — t        «       } | j                  «       }t        di t        |«      ¤Ž y )Nr&   )r7  Ú
parse_argsr%  rO   )r6  Úargss     r(   Úmainr;  Þ  s'   € ÜÓ€FØ×ÑÓ€DÜÑŒd�4‹jÓr'   Ú__main__r”   )r+  FNNNNNFNr   N)Gr0  rò   r]   r|   r­   rô   Údataclassesr   r   r   Úenumr   Úpathlibr   Útextwrapr   Útypingr	   r
   Úmlx.coreÚcorer   rÉ   r   Ú	mlx.utilsr   r  r5  r4  r/   r   r*   r"   r#   r$   r%   r»   r6   r  r@   r0   r7   rF   rK   rS   rf   rh   rv   r€   r‚   r‡   Útupler‘   r�   r¡   r«   r²   r1   r¿   rÕ   r›   rè   rê   rü   r  r3  r%  r1  r7  r;  r   r&   r'   r(   Ú<module>rF     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˜˜c #™h˜Ñ'Ó ,Ø*,Ð ˜˜S $˜Y™Ó ,ð
 #ð 
¨#¨c©(ó 
ð*˜Fð * s¨3¡xó *ð c¨#¡hó ð/ cð /¨dó /ðd. ð .¨4ó .ñ Cð °8¸C±=ð ÈDó ð>A˜Dð A Tó Að
 Sð 
¨X°fÑ-=ó 
ðR $ð R¨3ó Rð
 $ð ¨8°E¸&À#¸+Ñ4FÑ+Gó ð,
˜tð 
¨°°v¸s°{Ñ1CÑ(Dó 
ð ð °$ð ¸6ó ð<%L˜4ð %L¨Tð %L¸6ð %LÀcó %LðP ð ¨Vó ð%Øð%Ø"ð%Ø,2ð%à
ˆ4�‰9�cˆ>Ñó%ðPO˜ð O¨3ð O¸ð OÀfó Oð> 26ñJØ!)¨#¡ðJàˆs�Cˆj˜$ÐÑóJð.#(˜Tð #(¨ó #(ðL˜Tð  dó ð$  ØØ"&Ø ØØ!%Ø"ØØ%)ØØ"&ñq>Øðq>àðq>ð ðq>ð ˜3‘-ð	q>ð
 �S‰Mðq>ð �C‰=ðq>ð ˜#‘ðq>ð �s‰mðq>ð ðq>ð ˜c‘]ðq>ð ðq>ð ˜3‘-óq>ðhR˜(×1Ñ1ó Ròjð ˆzÒÙ…Fð r'   