+
    TV-j’7  ã                   ó’  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIH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 RR R lltR R	 ltR
 R ltR tR R ltR R ltR R ltR R lt]P:                  ! ]P<                  ! 4       4      t]P@                  RR R ll4       t!RR R llt"R t#]$R8X  d
   ]#! 4        R# R# )é    N)Úpprint)ÚListÚOptionalÚUnion)Útree_reduce)Ú
load_modelc                óP   € V ^8„  d   QhR\         \        \        ,          ,          /# )é   Úargv)r   r   Ústr)Úformats   "Úg/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_audio/stt/generate.pyÚ__annotate__r      s   € ÷ ^#ñ ^#”Xœd¤3�iÕ(ñ ^#ó    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	7       VP                  R\        R. R4ORR7       VP                  RRRR7       VP                  R\        RRR7       VP                  R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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7       VP                  R/\        P                  RR0R7       VP                  R1\        R2R3R7       VP                  V 4      # )5z(Generate transcriptions from audio files)Údescriptionz--modelz$mlx-community/whisper-large-v3-turbozPath to the model)ÚdefaultÚtypeÚhelpz--audioTzPath to the audio file)r   Úrequiredr   z--output-pathzPath to save the outputz--formatÚtxtz&Output format (txt, srt, vtt, or json))r   r   Úchoicesr   z	--verboseÚ
store_truezVerbose output)Úactionr   z--max-tokensi    z(Maximum number of new tokens to generate)r   r   r   z--max-parallel-segmentsÚ
batch_sizeNÚSEGMENTSzcMaximum number of audio segments to transcribe in parallel for models that support segment batching)Údestr   r   Úmetavarr   z
--languageÚenz)Language code (e.g. en, es, fr, de, etc.)z--chunk-durationg      >@z)Chunk duration in seconds (default: 30.0)z--frame-thresholdzFrame threshold (default: 25)z--streamz<Stream the transcription as it is generated (default: False)z	--contextz?Context string with hotwords or metadata to guide transcriptionz--prefill-step-sizei   z!Prefill step size (default: 2048)z--promptz@Custom prompt for the model (e.g. 'Describe the audio content.')z--gen-kwargszGAdditional generate kwargs as JSON (e.g. '{"min_chunk_duration": 1.0}')z--textÚ z+Text to align (for forced alignment models))r   ÚsrtÚvttÚjson)	ÚargparseÚArgumentParserÚadd_argumentr   ÚintÚfloatr#   ÚloadsÚ
parse_args)r   Úparsers   & r   r*   r*      s5  € Ü×$Ò$Ø>ô€Fð ×ÑØØ6ÜØ ð	 ô ð ×ÑØœ dÐ1Ið ô ð ×ÑØœc¨DÐ7Pð ô ð ×ÑØÜØÚ-Ø5ð ô ð ×Ñ˜¨LÐ?OÐÔPØ
×ÑØÜØØ7ð	 ô ð ×ÑØ!ØÜØØð3ð ô 
ð ×ÑØÜØØ8ð	 ô ð ×ÑØÜØØ8ð	 ô ð ×ÑØÜØØ,ð	 ô ð ×ÑØØØKð ô ð
 ×ÑØÜØØNð	 ô ð ×ÑØÜØØ0ð	 ô ð ×ÑØÜØØOð	 ô ð ×ÑØÜ�Z‰ZØØXð	 ô ð ×ÑØÜØØ:ð	 ô ð ×Ñ˜TÓ"Ð"r   c                ó0   € V ^8„  d   QhR\         R\        /# ©r
   ÚsecondsÚreturn©r(   r   )r   s   "r   r   r   s   s   € ÷ Jñ Jœeð J¬ñ Jr   c                ó¤   € \        V R,          4      p\        V R,          ^<,          4      pV ^<,          p VR RVR RV R 2P                  RR4      # )z2Convert seconds to HH:MM:SS,mmm format for SRT/VTTi  Ú02dÚ:z06.3fÚ.Ú,)r'   Úreplace)r.   ÚhoursÚminutess   &  r   Úformat_timestampr9   s   sV   € ä�˜4•Ó €EÜ�7˜T•> bÕ(Ó)€GØ˜�l€GØ�Cˆ[˜˜' #˜ a¨° Ð7×?Ñ?ÀÀSÓIÐIr   c                ó0   € V ^8„  d   QhR\         R\        /# r-   r0   )r   s   "r   r   r   {   s   € ÷ 7ñ 7¤%ð 7¬Cñ 7r   c                ó8   € \        V 4      P                  RR4      # )z.Convert seconds to HH:MM:SS.mmm format for VTTr5   r4   )r9   r6   )r.   s   &r   Úformat_vtt_timestampr<   {   s   € ä˜GÓ$×,Ñ,¨S°#Ó6Ð6r   c                óâ  € \        V R4      '       dA   V P                   Uu. uF)  pRVP                  RVP                  RVP                  /NK+  	  up# . pV P
                   F…  pVP                  RVR,          RVR,          RVR,          /4       RV9   g   K8  VR,          '       g   KI  VR,           F/  pVP                  RVR,          RVR,          RVR,          /4       K1  	  K‡  	  V# u upi )z‘Extract unified cues from any model's output (Parakeet or Whisper).

Uses word-level cues when available, otherwise falls back to segment-level.
Ú	sentencesÚstartÚendÚtextÚwordsÚword)Úhasattrr>   r?   r@   rA   ÚsegmentsÚappend)rE   ÚsÚcuesÚws   &   r   Ú	_get_cuesrJ   €   sÙ   € ô
 ˆx˜×%Ò%àFN×FXÒFXó
ÙFXÀˆW�a—g‘g˜u a§e¡e¨V°Q·V±VÓ<ÑFXñ
ð 	
ð €DØ×ÔˆØ�‰�W˜a �j¨%°°5µ¸6À1ÀVÅ9ÐMÔNØ�aŽ<˜A˜gŸJžJØ�w—Z�Z�Ø—‘˜W a¨¥j°%¸¸5½À6È1ÈVÍ9ÐUÖVó  ñ ð
 €Kùò
s   ¡/C,c                ó$   € V ^8„  d   QhR\         /# ©r
   Úoutput_path©r   )r   s   "r   r   r   ’   s   € ÷ ñ ¤sñ r   c                 óþ   € VR 8w  d   \        V R2RRR7      M#\        P                  ! \        P                  4      ;_uu_ 4       pVP                  V P                  4       RRR4       R#   + '       g   i     R# ; i)Ú-z.txtrI   úutf-8©ÚencodingN)ÚopenÚ
contextlibÚnullcontextÚsysÚstdoutÚwriterA   )rE   rM   Úfs   && r   Úsave_as_txtr[   ’   sg   € ð ˜#Ôô 	�ˆ}˜DÐ! 3°Õ9ä×#Ò#¤C§J¡JÓ/÷	0ð 	0ð 
Ø	�‰�—‘Ô÷		0÷ 	0÷ 	0ò 	0ús   ÁA+Á+A<	c                ó$   € V ^8„  d   QhR\         /# rL   rN   )r   s   "r   r   r   ›   s   € ÷ *ñ *¤sñ *r   c                 óÐ  € VR 8w  d   \        V R2RRR7      M#\        P                  ! \        P                  4      ;_uu_ 4       p\        \        V 4      ^4       Fk  w  r4VP                  V R24       VP                  \        VR,          4       R\        VR,          4       R24       VP                  VR	,           R
24       Km  	  RRR4       R#   + '       g   i     R# ; i)rP   z.srtrI   rQ   rR   Ú
r?   ú --> r@   rA   ú

N)	rT   rU   rV   rW   rX   Ú	enumeraterJ   rY   r9   ©rE   rM   rZ   ÚiÚcues   &&   r   Úsave_as_srtre   ›   sÌ   € ð ˜#Ôô 	�ˆ}˜DÐ! 3°Õ9ä×#Ò#¤C§J¡JÓ/÷	0ð 	0ð 
Ü¤	¨(Ó 3°QÖ7‰FˆAØ�G‰G�q�c˜�HÔØ�G‰GÜ# C¨¥LÓ1Ð2°%Ô8HÈÈUÍÓ8TÐ7UÐUWÐXôð �G‰G�s˜6•{�m 4Ð(Ö)ñ 8÷		0÷ 	0÷ 	0ò 	0ús   ÁBCÃC%	c                ó$   € V ^8„  d   QhR\         /# rL   rN   )r   s   "r   r   r   ©   s   € ÷ *ñ *¤sñ *r   c                 óò  € VR 8w  d   \        V R2RRR7      M#\        P                  ! \        P                  4      ;_uu_ 4       pVP                  R4       \        \        V 4      ^4       Fk  w  r4VP                  V R24       VP                  \        VR,          4       R\        VR	,          4       R24       VP                  VR
,           R24       Km  	  RRR4       R#   + '       g   i     R# ; i)rP   z.vttrI   rQ   rR   zWEBVTT

r^   r?   r_   r@   rA   r`   N)	rT   rU   rV   rW   rX   rY   ra   rJ   r<   rb   s   &&   r   Úsave_as_vttrh   ©   sÛ   € ð ˜#Ôô 	�ˆ}˜DÐ! 3°Õ9ä×#Ò#¤C§J¡JÓ/÷	0ð 	0ð 
Ø	�‰�ÔÜ¤	¨(Ó 3°QÖ7‰FˆAØ�G‰G�q�c˜�HÔØ�G‰GÜ'¨¨G­Ó5Ð6°eÔ<PÐQTÐUZÕQ[Ó<\Ð;]Ð]_Ð`ôð �G‰G�s˜6•{�m 4Ð(Ö)ñ 8÷	0÷ 	0÷ 	0ò 	0ús   ÁBC%Ã%C6	c                ó$   € V ^8„  d   QhR\         /# rL   rN   )r   s   "r   r   r   ¸   s   € ÷ 4;ñ 4;¬ñ 4;r   c                 ól  € \        V R 4      '       dù   RV P                  R V P                   UUu. uF�  pRVP                  RVP                  RVP                  RVP
                  RVP                   Uu. uF5  pRVP                  RVP                  RVP                  RVP
                  /NK7  	  up/NKƒ  	  upp/p\        V P                  4       F6  w  rR\        VR4      '       g   K  VP                  VR ,          V,          R&   K8  	  M¤RV P                  R. /pV P                   F„  pRVR,          RVR,          RVR,          RVR,          VR,          ,
          /pRV9   d   VR,          '       d   VR,          VR&   RV9   d   VR,          VR&   VR,          P                  V4       K†  	  VR	8w  d   \        V R
2RRR7      M#\        P                  ! \        P                  4      ;_uu_ 4       p\         P"                  ! WGR^R7       RRR4       R# u upi u uppi   + '       g   i     R# ; i)r>   rA   r?   r@   ÚdurationÚtokensÚ
speaker_idrE   rB   rP   z.jsonrI   rQ   rR   F)Úensure_asciiÚindentN)rD   rA   r>   r?   r@   rk   rl   ra   rm   rE   rF   rT   rU   rV   rW   rX   r#   Údump)rE   rM   rG   ÚtÚresultrc   ÚsegrZ   s   &&      r   Úsave_as_jsonrt   ¸   s  € Üˆx˜×%Ò%à�H—M‘MØð  "×+Ò+ô!ñ  ,�Að ˜AŸF™FØ˜QŸW™WØ˜1Ÿ5™5Ø §
¡
Øð "#§¢óñ "*˜Að # A§F¡FØ# Q§W¡WØ! 1§5¡5Ø&¨¯
©
ó	ñ "*ñóñ ,ò!ð
ˆô, ˜h×0Ñ0Ö1‰DˆAÜ�q˜,×'Ô'Ø78·|±|��{Õ# AÕ& |Ó4ò 2ð
 �H—M‘MØ˜ð
ˆð ×"Ô"ˆAà˜˜&�	Ø˜˜7�Ø�q˜•xØ˜A˜e�H q¨¥zÕ1ð	ˆCð ˜!Œ|  '§
¤
Ø  �z��G‘à˜qÔ Ø$% l¥O��LÑ!Ø�:Õ×%Ñ% cÖ*ñ #ð" ˜#Ôô 	�ˆ}˜EÐ" C°'Õ:ä×#Ò#¤C§J¡JÓ/÷	0ð 	0ð 
Ü�	Š	�&¨%¸Õ:÷		0ñ 	0ùòMùó÷X	0÷ 	0ð 	0ús$   ¯AHÁ3;H$Â.HÇ3H"ÈHÈ"H3	c                ó„   € V ^8„  d   QhR\         P                  R\        \        \        P
                  ,          ,          /# )r
   ÚmodelÚstreams)ÚnnÚModuler   r   ÚmxÚStream)r   s   "r   r   r   ô   s+   € ÷ $*ñ $*”r—y‘yð $*¬8´D¼¿¹µOÕ+Dñ $*r   c              #  ó´  "  € \         P                  P                  4       '       g    Rx € R# \        R V ^ 4      p\         P                  P	                  4       R,          pVRV,          8”  d%   VR,          pVR,          p\        RV RV R24       \         P                  ! V4      p Rx € Ve!   V F  p\         P                  ! V4       K  	  M\         P                  ! 4        \         P                  ! V4       R#   i ; i  Te!   T F  p\         P                  ! T4       K  	  M\         P                  ! 4        \         P                  ! T4       i ; i5i)	zî
A context manager to temporarily change the wired limit.

Note, the wired limit should not be changed during an async eval.  If an
async eval could be running pass in the streams to synchronize with prior
to exiting the context manager.
Nc                 ój   € \        V\        P                  4      '       d   WP                  ,           # T # ©N)Ú
isinstancerz   ÚarrayÚnbytes)ÚaccÚxs   &&r   Ú<lambda>Úwired_limit.<locals>.<lambda>  s"   € ¬Z¸¼2¿8¹8×-DÒ-D˜3§¡�>ÐMÈ#ÐMr   Ú max_recommended_working_set_sizegÍÌÌÌÌÌì?z0[WARNING] Generating with a model that requires z6 MB which is close to the maximum recommended size of zƒ MB. This can be slow. See the documentation for possible work-arounds: https://github.com/ml-explore/mlx-lm/tree/main#large-modelsi   )rz   ÚmetalÚis_availabler   Údevice_infoÚprintÚset_wired_limitÚsynchronize)rv   rw   Úmodel_bytesÚmax_rec_sizeÚmodel_mbÚ
max_rec_mbÚ	old_limitrG   s   &&      r   Úwired_limitr’   ó   s)  é € ô �8‰8× Ñ ×"Ò"ð	Ûáä!ÙMÈuÐVWó
ˆô —x‘x×+Ñ+Ó-Ð.PÕQˆØ˜˜|Õ+Ô+Ø" eÕ+ˆHØ%¨Õ.ˆJÜØBÀ8À*ð MEØEOÀLð QNðNôô ×&Ò& |Ó4ˆ	ð	*ÛàÒ"Û �AÜ—N’N 1Ö%ò !ô —’Ô Ü×Ò˜yÖ)øð1 ûð& Ò"Û �AÜ—N’N 1Ö%ò !ô —’Ô Ü×Ò˜yÕ)üs6   ‚%E¨C? ¬A=EÂ*D Â.AEÃ?DÄEÄAEÅEc                óâ   € V ^8„  d   QhR\         \        \        \        P                  3,          ,          R\        \        \
        P                  3,          R\        R\        R\        R\        /# )r
   rv   ÚaudiorM   r   ÚverboserA   )r   r   r   rx   ry   rz   r€   Úbool)r   s   "r   r   r     sk   € ÷ Mñ MÜ”Eœ#œrŸy™y˜.Õ)Õ*ðMä””b—h‘h�ÕðMô ðMô ð	Mô
 ðMô ñMr   c                ój
  € ^RI Hp V f   \        R4      h\        V \        4      '       d   \        V 4      p \        P                  ! 4        \        P                  ! 4       pV'       d6   \        R14       \        RV 24       \        RV 24       \        RV 24       VP                  RR4      p	V	'       d   VP                  V	4       V'       d   WVR&   \        P                  ! V P                  4      p
VP                  4        UUu/ uF  w  r¼WºP                   9   g   K  W¼bK  	  pppVP#                  R	R
4      '       EdP   . pRpRp^ p^ pV P                  ! V3RV/VB  FÇ  pRVP$                  RVP&                  RVP(                  RVP*                  /pVP-                  V4       VVP$                  ,          pVP.                  p\1        VR4      '       d   VP2                  ^ 8”  d   VP2                  p\1        VR4      '       g   K¨  VP4                  ^ 8”  g   K»  VP4                  pKÉ  	  \        P                  ! 4       pVV,
          pT! VP7                  4       TTTTVV,           TV^ 8”  d
   VV,          M^ V^ 8”  d
   VV,          M^ R7	      pMV P                  ! V3RVR\8        /VB pV'       dŒ   \1        VR4      '       d+   \        R4       \        VP$                  R,           R24       \1        VR4      '       d>   VP:                  e0   \        R4       \=        VP:                  R,          R.,           4       \        P                  ! 4       pV'       d¾   \        R24       \        RV RV 24       \        RVV,
          R R 24       \        VV4      '       dO   \        R!VP2                   R"VP>                  R# R$24       \        R%VP4                   R"VP@                  R# R$24       \        R&\        PB                  ! 4       R',          R R(24       \D        PF                  ! \D        PH                  PK                  \D        PH                  PM                  V4      4      R)R*7       \1        VR4      ;'       d    VP:                  RJp\1        VR+4      ;'       d    VPN                  RJpVR,8X  g   V'       g2   V'       g*   V'       g   V'       g   \        R-4       \Q        VV4       V# VR.8X  d   \S        VV4       V# VR/8X  d   \U        VV4       V# VR08X  d   \W        VV4       V# u uppi )3aà  Generate transcriptions from audio files.

Args:
    model: Path to the model or the model instance.
    audio: Path to the audio file (str), or audio waveform (mx.array).
    output_path: Path to save the output.
    format: Output format (txt, srt, vtt, or json).
    verbose: Verbose output.
    text: Text to align (for forced alignment models).
    **kwargs: Additional arguments for the model's generate method.

Returns:
    segments: The generated transcription segments.
)Ú	STTOutputNz.Model path or model instance must be provided.z[94mAudio path:[0m z[94mOutput path:[0m z[94mFormat:[0m Ú
gen_kwargsrA   ÚstreamFr    r   r•   r?   r@   Úis_finalÚprompt_tokensÚgeneration_tokens)	rA   rE   Úlanguagerœ   r�   Útotal_tokensÚ
total_timeÚ
prompt_tpsÚgeneration_tpsÚgeneration_streamz[94mTranscription:[0m
:Niô  Nz...
rE   z[94mSegments:[0m
:Né   Nz...z[94mSaving file to:[0m ./r4   z[94mProcessing time:[0m z.2fz secondsz[94mPrompt:[0m z	 tokens, z.3fz tokens-per-secz[94mGeneration:[0m z[94mPeak memory:[0m g    eÍÍAz GBT)Úexist_okr>   r   z2[WARNING] No segments found, saving as plain text.r!   r"   r#   z
==========z
==========),Úmodels.baser˜   Ú
ValueErrorr   r   r   rz   Úreset_peak_memoryÚtimerŠ   ÚpopÚupdateÚinspectÚ	signatureÚgenerateÚitemsÚ
parametersÚgetrA   Ú
start_timeÚend_timer›   rF   rž   rD   rœ   r�   Ústripr£   rE   r   r¡   r¢   Úget_peak_memoryÚosÚmakedirsÚpathÚdirnameÚabspathr>   r[   re   rh   rt   )rv   r”   rM   r   r•   rA   Úkwargsr˜   r²   r™   r­   ÚkÚvÚall_segmentsÚaccumulated_textrž   rœ   r�   rr   Úsegment_dictÚstream_end_timeÚstream_durationrE   r³   Úhas_segmentsÚhas_sentencess   &&&&&&,                   r   Úgenerate_transcriptionrÅ     sœ  € õ. 'à‚}ÜÐIÓJÐJä�%œ×Òä˜5Ó!ˆä×ÒÔÜ—’“€JßÜˆhŒÜÐ+¨E¨7Ð3Ô4ÜÐ,¨[¨MÐ:Ô;ÜÐ'¨ xÐ0Ô1ð —‘˜L¨$Ó/€JßØ�‰�jÔ!÷ Øˆv‰ä×!Ò! %§.¡.Ó1€IØ%Ÿ|™|œ~ÔK™~‘t�q°×6JÑ6JÑ1JŒdˆaŠd™~€FÑKà‡z�z�(˜E×"Ó"ØˆØÐØˆØˆØÐØ—n’n UÑF°GÐF¸vÔFˆFà˜Ÿ™Ø˜×*Ñ*Ø�v—‘Ø˜FŸO™Oð	ˆLð ×Ñ Ô-à §¡Õ+ÐØ—‘ˆHô �v˜×/Ò/°F×4HÑ4HÈ1Ô4LØ &× 4Ñ 4�Ü�vÐ2×3Ô3¸×8PÑ8PÐSTÖ8TØ$*×$<Ñ$<Ò!ñ# Gô& Ÿ)š)›+ˆØ)¨JÕ6ˆÙØ!×'Ñ'Ó)Ø!ØØ'Ø/Ø&Ð):Õ:Ø&Ø:IÈAÔ:M�} Ö6ÐSTà7FÈÔ7JÐ! OÖ3ÐPQô
‰ð —>’>Øñ
Ø"ð
Ü6Gð
ØKQñ
ˆ÷ Ü�8˜V×$Ò$ÜÐ3Ô4Ü�X—]‘] 4Õ(Ð)¨Ð/Ô0ä�8˜Z×(Ò(¨X×->Ñ->Ò-JÜÐ.Ô/Ü�8×$Ñ$ RÕ(¨E¨7Õ2Ô3ä�yŠy‹{€HçÜˆoÔÜÐ1°+°¸aÀ¸xÐHÔIÜÐ0°¸JÕ1FÀsÐ0KÈ8ÐTÔUÜ�h 	×*Ò*ÜØ)¨(×*@Ñ*@Ð)AÀØ×&Ñ& sÐ+¨?ð<ôô Ø-¨h×.HÑ.HÐ-IÈØ×*Ñ*¨3Ð/¨ð@ôô 	Ð,¬R×-?Ò-?Ó-AÀCÕ-GÈÐ,LÈCÐPÔQô ‡K‚K”—‘—‘¤§¡§¡°Ó <Ó=ÈÕMô ˜8 ZÓ0×RÐR°X×5FÑ5FÈdÐ5R€LÜ˜H kÓ2×UÐU°x×7IÑ7IÐQUÐ7U€Mà�„Ÿ|·Mß§MÜÐFÔGÜ�H˜kÔ*ð €Oð 
�5ŒÜ�H˜kÔ*ð €Oð 
�5ŒÜ�H˜kÔ*ð €Oð 
�6Ô	Ü�X˜{Ô+à€Oùów Ls   ÄT/Ä!T/c                  óB   € \        4       p \        R/ \        V 4      B  R # )N© )r*   rÅ   Úvars)Úargss    r   ÚmainrÊ   «  s   € Ü‹<€DÜÑ(œT $›ZÔ(r   Ú__main__r~   )NNÚ
transcriptr   Fr    )%r$   rU   r¬   r#   r¶   rW   r©   r   Útypingr   r   r   Úmlx.coreÚcorerz   Úmlx.nnrx   Ú	mlx.utilsr   Úmlx_audio.stt.utilsr   r*   r9   r<   rJ   r[   re   rh   rt   Ú
new_streamÚdefault_devicer£   Úcontextmanagerr’   rÅ   rÊ   Ú__name__rÇ   r   r   Ú<module>r×      s°   ðÛ Û Û Û Û 	Û 
Û Ý ß (Ñ (å Ý Ý !å *÷^#õBJõ7ò
õ$õ*õ*õ4;ðp —M’M "×"3Ò"3Ó"5Ó6Ð ð ×Ñö$*ó ð$*÷NMò`)ð
 ˆzÔÙ†Fñ r   