+
    TV-jÖx  ã            
       ó  € R t ^ RIt^ RIt. R3Ot^ RIHt ^ RIHt ^ RIH	t
 ^ RIt]! RR	7      R4R
 l4       t]! RR	7      R4R l4       t]! RR	7      R4R l4       t]! RR	7      R4R l4       tR]R]R]R]R]/tR R ltR R ltR R ltR R ltR R ltR5R R lltR R ltR R ltR6R R  lltR7R! lt]! RR	7      R8R" R# ll4       t ! R$ R4      tR9R% R& lltR' R( ltR) R* lt R+ R, lt!R- R. lt"R/ R0 lt#R:R1 R2 llt$R# );z×Pure audio processing utilities - no TTS/STT imports.

This module contains only audio processing functions (window functions, STFT, mel filterbanks)
that can be imported without pulling in TTS or STT dependencies.
NÚhanningÚhammingÚblackmanÚbartlettÚ
ISTFTCache)Ú	lru_cache)ÚOptional)Úmaxsizec                ó  € V'       d   T MV ^,
          p\         P                  ! \        V 4       Uu. uFJ  pR^\        P                  ! ^\        P
                  ,          V,          V,          4      ,
          ,          NKL  	  up4      # u upi )zyHanning (Hann) window.

Args:
    size: Window length
    periodic: If True, use periodic window (for spectral analysis)
ç      à?©ÚmxÚarrayÚrangeÚmathÚcosÚpi©ÚsizeÚperiodicÚdenomÚns   &&  Ú^/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_audio/dsp.pyr   r   '   sb   € ÷ ‰D $¨¥(€EÜ�8Š8Ü@EÀdÄÓLÁ¸1ˆ�”D—H’H˜Q¤§¡�[¨1�_¨uÕ4Ó5Õ5×	6Ð	6ÁÑLóð ùÚLó   ±ABc                ó  € V'       d   T MV ^,
          p\         P                  ! \        V 4       Uu. uFJ  pRR\        P                  ! ^\        P
                  ,          V,          V,          4      ,          ,
          NKL  	  up4      # u upi )zrHamming window.

Args:
    size: Window length
    periodic: If True, use periodic window (for spectral analysis)
çHáz®Gá?çq=
×£pÝ?r   r   s   &&  r   r   r   5   sb   € ÷ ‰D $¨¥(€EÜ�8Š8ÜBGÈÄ+ÓNÁ+¸Qˆ�”t—x’x ¤D§G¡G¥¨a¥°%Õ 7Ó8Õ8×	8Ð	8Á+ÑNóð ùÚNr   c                ó¤  € V'       d   T MV ^,
          p\         P                  ! \        V 4       Uu. uF�  pRR\        P                  ! ^\        P
                  ,          V,          V,          4      ,          ,
          R\        P                  ! ^\        P
                  ,          V,          V,          4      ,          ,           NK‘  	  up4      # u upi )zBlackman window.gáz®GáÚ?r   g{®Gáz´?r   r   s   &&  r   r   r   C   sŸ   € ÷ ‰D $¨¥(€EÜ�8Š8ô
 ˜4”[ó		
ñ !�ð Ø”D—H’H˜Q¤§¡�[¨1�_¨uÕ4Ó5Õ5õ6à”T—X’X˜a¤$§'¡'�k¨A�o°Õ5Ó6Õ6÷7ð 7ñ !ñ		
óð ùò	
s   ±BCc                óæ   € V'       d   T MV ^,
          p\         P                  ! \        V 4       Uu. uF0  p^^\        W2^,          ,
          4      ,          V,          ,
          NK2  	  up4      # u upi )zBartlett (triangular) window.)r   r   r   Úabsr   s   &&  r   r   r   Q   sS   € ÷ ‰D $¨¥(€EÜ�8Š8ÄÀtÄÓMÁ¸A�Q˜œS ¨Q¥Y¥Ó/Õ/°%Õ7×7Ð7ÁÑMÓNÐNùÒMs   ±6A.Úhannc                óT   € V ^8„  d   QhR\         P                  R\        R\        RR/# )é   ÚdataÚrateÚ
block_sizeÚreturnN©ÚnpÚndarrayÚintÚfloat)Úformats   "r   Ú__annotate__r-   a   s3   € ÷ Pñ P¤2§:¡:ð P´Sð PÄeð PÐPTñ Pó    c                 ó–  € \        V \        P                  4      '       g   \        R 4      h\        P                  ! V P
                  \        P                  4      '       g   \        R4      hV P                  ^8X  d$   V P                  ^,          ^8”  d   \        R4      hV P                  ^ ,          W!,          8  d   \        R4      hR# )z#Data must be of type numpy.ndarray.zData must be floating point.z&Audio must have five channels or less.z3Audio must have length greater than the block size.N)	Ú
isinstancer(   r)   Ú
ValueErrorÚ
issubdtypeÚdtypeÚfloatingÚndimÚshape)r#   r$   r%   s   &&&r   Ú_validate_loudness_audior7   a   sŽ   € Ü�dœBŸJ™J×'Ò'ÜÐ>Ó?Ð?ä�=Š=˜Ÿ™¤R§[¡[×1Ò1ÜÐ7Ó8Ð8à‡y�y�A„~˜$Ÿ*™* Q�-¨!Ô+ÜÐAÓBÐBà‡z�z�!…}�zÕ(Ô(ÜÐNÓOÐOñ )r.   c                óª   € V ^8„  d   QhR\         R\         R\         R\        R\        R\        \        P
                  \        P
                  3,          /# )r"   Úgain_dbÚq_factorÚcenter_freqr$   Úfilter_typer&   )r+   r*   ÚstrÚtupler(   r)   )r,   s   "r   r-   r-   o   s^   € ÷ ,Dñ ,DÜð,Däð,Dô ð,Dô ð	,Dô
 ð,Dô Œ2�:‰:”r—z‘zÐ!Õ"ñ,Dr.   c                 ó|  € ^
V R,          ,          pR\         P                  ,          W#,          ,          p\         P                  ! V4      RV,          ,          pVR8X  Edõ   VV^,           V^,
          \         P                  ! V4      ,          ,           ^\         P                  ! V4      ,          V,          ,           ,          pRV,          V^,
          V^,           \         P                  ! V4      ,          ,           ,          p	VV^,           V^,
          \         P                  ! V4      ,          ,           ^\         P                  ! V4      ,          V,          ,
          ,          p
V^,           V^,
          \         P                  ! V4      ,          ,
          ^\         P                  ! V4      ,          V,          ,           p^V^,
          V^,           \         P                  ! V4      ,          ,
          ,          pV^,           V^,
          \         P                  ! V4      ,          ,
          ^\         P                  ! V4      ,          V,          ,
          pM«VR8X  d—   ^\         P                  ! V4      ,           ^,          p^\         P                  ! V4      ,           ) p	^\         P                  ! V4      ,           ^,          p
^V,           pR\         P                  ! V4      ,          p^V,
          pM\        RV 24      h\        P                  ! W‰V
.4      V,          \        P                  ! W¼V.4      V,          3# )é
   g      D@ç       @Ú
high_shelfÚ	high_passzUnsupported filter type: éþÿÿÿ)r   r   Úsinr   Úsqrtr1   r(   r   )r9   r:   r;   r$   r<   Ú	amplitudeÚomegaÚalphaÚb0Úb1Úb2Úa0Úa1Úa2s   &&&&&         r   Ú_biquad_coefficientsrP   o   sT  € ð �w •~Õ&€IØ”$—'‘'�M˜[Õ/Õ0€EÜ�HŠH�U‹O˜s X�~Õ.€Eà�lÕ"ØØ˜�]Ø˜1�}¤§¢¨£Õ/õ0à”$—)’)˜IÓ&Õ&¨Õ.õ/õ
ˆð
 �)�^ 	¨A¥°)¸aµ-Ä4Ç8Â8ÈEÃ?Õ1RÕRÕSˆØØ˜�]Ø˜1�}¤§¢¨£Õ/õ0à”$—)’)˜IÓ&Õ&¨Õ.õ/õ
ˆð ˜�]Ø˜1�}¤§¢¨£Õ/õ0à”$—)’)˜IÓ&Õ&¨Õ.õ/ð 	ð
 �9˜q•= Y°¥]´d·h²h¸u³oÕ$EÕEÕFˆà˜�]Ø˜1�}¤§¢¨£Õ/õ0à”$—)’)˜IÓ&Õ&¨Õ.õ/ñ 	ð
 
˜Ô	#Ø”$—(’(˜5“/Õ! QÕ&ˆØ”4—8’8˜E“?Õ"Ð#ˆØ”$—(’(˜5“/Õ! QÕ&ˆØ��YˆØ”$—(’(˜5“/Õ!ˆØ��Y‰äÐ4°[°MÐBÓCÐCä�8Š8�R˜R�LÓ! BÕ&¬¯ª°"¸"°Ó(>ÀÕ(CÐCÐCr.   c                ó˜   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  /# ©r"   ÚbÚar#   r&   ©r(   r)   )r,   s   "r   r-   r-   ž   s8   € ÷ (ñ (Œr�z‰zð (œbŸj™jð (´·
±
ð (¼r¿z¹zñ (r.   c                ó4  € \         P                  ! V \         P                  R7      p \         P                  ! V\         P                  R7      p\         P                  ! V4      pVP                  ^8w  d   \	        R4      hVP
                  ^ 8X  g   V^ ,          ^ 8X  d   \	        R4      hV P
                  ^ 8X  d   \         P                  ! V4      # W^ ,          ,          p W^ ,          ,          p\         P                  ! VP                  V P                  VP                  4      pVP                  VRR7      p\         P                  ! WCR7      p\        \        V4      \        V 4      4      ^,
          pV^ 8X  d   V ^ ,          V,          # \         P                  ! WcR7      p\        V4       Fè  w  r‰V ^ ,          V	,          V^ ,          ,           p
\        ^V4       Fd  pV\        V 4      8  d   W,          V	,          MRpV\        V4      8  d   W,          V
,          MRpW{,          V,           V,
          W{^,
          &   Kf  	  V\        V 4      8  d   W,          V	,          MRpV\        V4      8  d   W,          V
,          MRpWÍ,
          VR&   W¥V&   Kê  	  V# )z‘Apply a 1-D causal linear filter.

This implements the standard direct-form II transposed recurrence for the
1-D DSP paths used in this package.
©r3   z#dsp.lfilter only supports 1-D inputz4filter denominator must have a non-zero leading termF©Úcopyç        éÿÿÿÿ)r(   ÚasarrayÚfloat64r5   r1   r   Ú
zeros_likeÚresult_typer3   ÚastypeÚ
empty_likeÚmaxÚlenÚzerosÚ	enumerater   )rS   rT   r#   r3   ÚxÚyÚ	state_lenÚstater   ÚsampleÚoutputÚiÚfeedforwardÚfeedbacks   &&&           r   Úlfilterro   ž   så  € ô 	�
Š
�1œBŸJ™JÔ'€AÜ
�
Š
�1œBŸJ™JÔ'€AÜ�:Š:�dÓ€Dà‡y�y�A„~ÜÐ>Ó?Ð?Ø‡v�v�„{�a˜•d˜a”iÜÐOÓPÐPØ‡v�v�„{Ü�}Š}˜TÓ"Ð"à	ˆa�D�€AØ	ˆa�D�€Aä�NŠN˜4Ÿ:™: q§w¡w°·±Ó8€EØ�‰�E ˆÓ&€AÜ
�Š�aÔ%€Aä”C˜“FœC ›FÓ# aÕ'€IØ�A„~Ø��t�a�xˆä�HŠH�YÔ,€EÜ˜q–\‰	ˆØ�1•˜•  q¥Õ)ˆÜ�q˜)Ö$ˆAØ+,¬s°1«v¬:˜!�$ ž-¸3ˆKØ()¬C°«F¬
�q•t˜f–}¸ˆHØ �8 kÕ1°HÕ<ˆE�a•%‹Lñ %ð 09¼3¸q»6Ô/A�a•l VÖ+ÀsˆØ,5¼¸A»Ô,>�1•< &Ö(ÀCˆØÕ*ˆˆb‰	Øˆ!‹ñ "ð €Hr.   c                ó˜   € V ^8„  d   QhR\         P                  R\         P                  R\         P                  R\         P                  /# rR   rU   )r,   s   "r   r-   r-   É   s8   € ÷ ñ ”b—j‘jð ¤R§Z¡Zð ´r·z±zð ÄbÇjÁjñ r.   c                 ó   € \        WV4      # ©N)ro   )rS   rT   r#   s   &&&r   Ú_apply_lfilterrs   É   s   € Ü�1˜ÓÐr.   c                ód   € V ^8„  d   QhR\         P                  R\        R\         P                  /# )r"   r#   r$   r&   )r(   r)   r*   )r,   s   "r   r-   r-   Í   s)   € ÷ ñ œ"Ÿ*™*ð ¬Cð ´B·J±Jñ r.   c                 ó|  € \         P                  ! V \         P                  R R7      p\        R^\        P
                  ! ^4      ,          RVR4      w  r4\        RRRVR4      w  rV\        VP                  ^,          4       F7  p\        W4VR	V3,          4      VR	V3&   \        WVVR	V3,          4      VR	V3&   K9  	  V# )
T)r3   rY   g      @g     p—@rB   rZ   r   g      C@rC   ºNNN)	r(   r   r]   rP   r   rF   r   r6   rs   )r#   r$   ÚweightedÚhigh_shelf_bÚhigh_shelf_aÚhigh_pass_bÚhigh_pass_aÚchannels   &&      r   Ú_k_weight_audior}   Í   s·   € Ü�xŠx˜¤B§J¡J°TÔ:€Hä!5ØˆQ”—’˜1“Õ˜v t¨\ó"Ñ€Lô  4°C¸¸dÀDÈ+ÓVÑ€Kä˜Ÿ™¨Õ*Ö+ˆÜ-Ø¨°°G°Õ(<ó 
ˆ��G�Ñô  .Ø h¨q°'¨zÕ&:ó 
ˆ��G�Óñ	 ,ð €Or.   c          
      óh   € V ^8„  d   QhR\         P                  R\        R\        R\        R\        /# )r"   r#   r$   r%   Úoverlapr&   r'   )r,   s   "r   r-   r-   à   sE   € ÷ q
ñ q
Ü
�*‰*ðq
ä
ðq
ô ðq
ô ð	q
ô
 ñq
r.   c                ó<  € \         P                  ! V RR7      p\        WAV4       VP                  ^8X  d$   VP	                  VP
                  ^ ,          ^4      p\        WA4      pVP
                  ^,          pVP
                  ^ ,          p. R
OpRpRV,
          p	Wa,          p
\        \         P                  ! W¢,
          W),          ,          4      ^,           4      p\         P                  ! ^ V4      p\         P                  ! W[3\         P                  R7      p\        V4       Fž  pV F•  p\        W/V	,          ,          V,          4      p\        W/V	,          ^,           ,          V,          4      pRW!,          ,          \         P                  ! \         P                  ! VVV1V3,          4      4      ,          WÞV3&   K—  	  K   	  \        P                   ! 4       ;_uu_ 4        \        P"                  ! R\$        R7       V UUu. uFi  pRR\         P&                  ! \         P                  ! \        V4       Uu. uF  pW~,          WÞV3,          ,          NK  	  up4      4      ,          ,           NKk  	  pppRRR4       \)        X4       UUu. uF  w  ppVV8¼  g   K  VNK  	  ppp\        P                   ! 4       ;_uu_ 4        \        P"                  ! R\$        R7       \        V4       UUu. uF0  p\         P*                  ! V Uu. uF  qýWï3,          NK  	  up4      NK2  	  pppRRR4       RR\         P&                  ! \         P                  ! \        V4       Uu. uF  pW~,          XV,          ,          NK  	  up4      4      ,          ,           R,
          p\)        V4       UUu. uF  w  ppVV8”  g   K  VV8”  g   K  VNK  	  ppp\        P                   ! 4       ;_uu_ 4        \        P"                  ! R\$        R7       \         P,                  ! \         P                  ! \        V4       UUu. uF1  p\         P*                  ! V Uu. uF  pWÞV3,          NK  	  up4      NK3  	  upp4      4      pRRR4       \         P.                  ! RR	7      ;_uu_ 4        \1        RR\         P&                  ! \         P                  ! \        V4       Uu. uF  pW~,          XV,          ,          NK  	  up4      4      ,          ,           4      uuRRR4       # u upi u uppi   + '       g   i     ELµ; iu uppi u upi u uppi   + '       g   i     EL); iu upi u uppi u upi u uppi   + '       g   i     EL; iu upi   + '       g   i     R# ; i)z>Measure integrated loudness in LUFS using BS.1770 K-weighting.TrX   ç      ð?rW   Úignore)Úcategoryç      $@N)Údivide)r�   r�   r�   ç�Âõ(\�ö?r†   g     €QÀgé&1¬æ¿)r(   r   r7   r5   Úreshaper6   r}   r*   ÚroundÚarangerd   r]   r   ÚsumÚsquareÚwarningsÚcatch_warningsÚsimplefilterÚRuntimeWarningÚlog10re   ÚmeanÚ
nan_to_numÚerrstater+   )r#   r$   r%   r   Ú
input_dataÚnum_channelsÚnum_samplesÚchannel_gainsÚabsolute_thresholdÚstepÚduration_secondsÚ
num_blocksÚblock_indicesÚmean_squarer|   Úblock_indexÚlowerÚupperÚblock_loudnessÚloudnessÚgated_blocksÚgated_mean_squareÚrelative_thresholds   &&&&                   r   Úintegrated_loudnessr¦   à   sà  € ô —’˜$ TÔ*€JÜ˜Z¨zÔ:à‡�˜!ÔØ×'Ñ'¨
×(8Ñ(8¸Õ(;¸QÓ?ˆ
ä  Ó2€Jà×#Ñ# AÕ&€LØ×"Ñ" 1Õ%€KÚ/€MØÐØ��=€Dà"Õ)ÐÜÜ
�ŠÐ#Õ0°ZÕ5FÕGÓIÈAÕMó€Jô —I’I˜a Ó,€MÜ—(’(˜LÐ5¼R¿Z¹ZÔH€Kä˜Ö&ˆÛ(ˆKÜ˜
°DÕ&8Õ9¸DÕ@ÓAˆEÜ˜
°DÕ&8¸1Õ&<Õ=ÀÕDÓEˆEØ14¸
Õ8IÕ1JÌbÏfÊfÜ—	’	˜* U¨5 [°'Ð%9Õ:Ó;óOõ 1ˆK Ð,Ó-ó )ñ 'ô 
×	 Ò	 ×	"Õ	"Ü×Ò˜h´Õ@ñ  -ô
ñ  -�ð ØÜ�hŠhÜ—’ô (-¨\Ô':óá':˜Gð &Õ.°ÀkÐ=QÕ1R×RÐRÙ':ñóóõ÷	ð 	ñ  -ð 	ñ 
÷ 
#ô$ &/¨~Ô%>ôá%>Ñ!ˆK˜ØÐ)Ñ)÷ 	ˆÙ%>ð ñ ô 
×	 Ò	 ×	"Õ	"Ü×Ò˜h´Õ@ô ! Ô.ô
á.�ô �GŠGÉ,ÓWÉ,¸; Ð!5×6Ð6É,ÑWÖXÙ.ð 	ñ 
÷ 
#ð 	Ø
Ü
�(Š(Ü�FŠFô $)¨Ô#6óá#6˜ð "Õ*Ð->¸wÕ-G×GÐGÙ#6ñóó
õ
õ		
ð õ
	ð ô  &/¨~Ô%>ôá%>Ñ!ˆK˜ØÐ(Ñ(ô 	à-5Ð8JÑ-J÷ 	ˆÙ%>ð ñ ô 
×	 Ò	 ×	"Õ	"Ü×Ò˜h´Õ@ÜŸMšMÜ�HŠHô $)¨Ô#6ôñ $7˜ô —G’Gñ 0<óá/; ð (°Ð(<×=Ð=Ù/;ñöñ $7òó
ó
Ð÷ 
#ô  
�Š˜H×	%Ö	%ÜØØÜ�hŠhÜ—’ô (-¨\Ô':óá':˜Gð &Õ.Ð1BÀ7Õ1K×KÐKÙ':ñóóõõ	ó
÷ 
&Ò	%ùòuùó
÷ 
#×	"Ð	"üó ùò Xùó
÷ 
#×	"Ð	"üòùóùòùó÷	 
#×	"Ð	"üò,÷ 
&×	%Ð	%úsÓ   Ç""T"È4T
È8 TÉT
É3T"ÊT6ÊT6Ë+UË.U
ÌT<ÌU
Ì$UÍUÎ)U Î:U ÏU Ï)AU1Ð4U+ÑU&Ñ U+Ñ+U1Ò5V
ÓVÓ2V
ÔT
ÔT"Ô"T3	Ô<U
ÕUÕU	Õ&U+Õ+U1Õ1V	ÖV
Ö
V	c                óp   € V ^8„  d   QhR\         P                  R\        R\        R\         P                  /# )r"   r#   Úinput_loudnessÚtarget_loudnessr&   ©r(   r)   r+   )r,   s   "r   r-   r-   T  s8   € ÷ ñ Ü
�*‰*ðäðô ðô ‡Z�Zñ	r.   c                óì   € W!,
          p\         P                  ! RVR,          4      pW@,          p\         P                  ! \         P                  ! V4      4      R8¼  d   \        P
                  ! R4       V# )z-Normalize audio to a target loudness in LUFS.r„   ç      4@r�   ú#Possible clipped samples in output.)r(   Úpowerrb   r   rŒ   Úwarn)r#   r¨   r©   Údelta_loudnessÚgainrk   s   &&&   r   Únormalize_loudnessr²   T  sS   € ð %Õ5€NÜ�8Š8�D˜.¨4Õ/Ó0€DØ�[€Fä	‡v‚vŒb�fŠf�V‹nÓ Ô$Ü�ŠÐ;Ô<à€Mr.   c                ód   € V ^8„  d   QhR\         P                  R\        R\         P                  /# )r"   r#   Útarget_peak_dbr&   rª   )r,   s   "r   r-   r-   d  s)   € ÷ 	ñ 	œŸ™ð 	´Uð 	¼r¿z¹zñ 	r.   c                ó>  € \         P                  ! \         P                  ! V 4      4      p\         P                  ! RVR,          4      V,          pW0,          p\         P                  ! \         P                  ! V4      4      R8¼  d   \        P
                  ! R4       V# )z)Normalize audio to a target peak in dBFS.r„   r¬   r�   r­   )r(   rb   r   r®   rŒ   r¯   )r#   r´   Úcurrent_peakr±   rk   s   &&   r   Únormalize_peakr·   d  sd   € ä—6’6œ"Ÿ&š& ›,Ó'€LÜ�8Š8�D˜.¨4Õ/Ó0°<Õ?€DØ�[€Fä	‡v‚vŒb�fŠf�V‹nÓ Ô$Ü�ŠÐ;Ô<à€Mr.   c                óN   € V ^8„  d   QhR\         P                  \        ,          /# )r"   Úwindow)r   r   r=   )r,   s   "r   r-   r-   q  s   € ÷ 0#ñ 0#ô
 �H‰H”s�Nñ0#r.   c                 ó  € Vf
   V^,          pVf   Tp\        V\        4      '       d?   \        P                  VP	                  4       4      pVf   \        RV 24      hV! V4      pMTpVP                  ^ ,          V8  dI   WP                  ^ ,          ,
          p	\        P                  ! V\        P                  ! V	34      .^ R7      pR
R lp
V'       d   V
! W^,          V4      p ^V P                  ^ ,          V,
          V,          ,           pV^ 8:  d*   \        RV P                  ^ ,           RV RV RV R2	4      hW±3pV^3p\        P                  ! WVR	7      p\        P                  P                  Wè,          4      # )NúUnknown window function: ©Úaxisc                 óô   € VR 8X  d   \         P                  ! WV3.4      # VR8X  dE   V ^V^,            RRR1,          pW^,           ) R RRR1,          p\         P                  ! W0V.4      # \        RV 24      h)ÚconstantÚreflectNzInvalid pad_mode r[   )r   ÚpadÚconcatenater1   )rf   ÚpaddingÚpad_modeÚprefixÚsuffixs   &&&  r   Ú_padÚstft.<locals>._pad‹  s‚   € Ø�zÔ!Ü—6’6˜!¨Ð0Ð1Ó2Ð2Ø˜Ô"Ø�q˜7 Q�;Ð'©¨"¨Õ-ˆFØ 1��~¨Ð+©D¨b¨DÕ1ˆFÜ—>’> 6¨fÐ"5Ó6Ð6äÐ0°°
Ð;Ó<Ð<r.   zInput is too short (length=z) for n_fft=z with hop_length=z and center=Ú.©r6   Ústrides)rÀ   )r0   r=   ÚSTR_TO_WINDOW_FNÚgetrŸ   r1   r6   r   rÂ   rd   Ú
as_stridedÚfftÚrfft)rf   Ún_fftÚ
hop_lengthÚ
win_lengthr¹   ÚcenterrÄ   Ú	window_fnÚwÚpad_sizerÇ   Ú
num_framesr6   rË   Úframess   &&&&&&&        r   ÚstftrÚ   q  sX  € ð ÒØ˜a•Zˆ
ØÒØˆ
ä�&œ#×ÒÜ$×(Ñ(¨¯©«Ó8ˆ	ØÒÜÐ8¸¸ÐAÓBÐBÙ�jÓ!‰àˆà‡w�wˆq…z�EÔØŸ7™7 1�:Õ%ˆÜ�NŠN˜AœrŸxšx¨¨Ó4Ð5¸AÔ>ˆô=÷ Ù�˜Q•J Ó)ˆà�a—g‘g˜a•j 5Õ(¨ZÕ7Õ7€JØ�Q„ÜØ)¨!¯'©'°!­*¨°\À%ÀÐHYÐZdÐYeÐeqÐrxÐqyÐyzÐ{ó
ð 	
ð Ð€EØ˜1ˆo€GÜ�]Š]˜1°7Ô;€FÜ�6‰6�;‰;�v•zÓ"Ð"r.   c                óL  € Vf"   V P                   ^,          ^,
          ^,          pVf
   V^,          p\        V\        4      '       dI   \        P	                  VP                  4       4      pVf   \        RV 24      hV! V^,           4      RR pMTpVP                   ^ ,          V8  dG   \        P                  ! V\        P                  ! W(P                   ^ ,          ,
          34      .^ R7      pV P                   ^,          p	V	^,
          V,          V,           p
\        P                  ! V
4      p\        P                  ! V
4      p\        P                  P                  V ^ R7      P                  ^^ 4      p\        P                  ! V	4      V,          pVR,          \        P                  ! V4      ,           pVP                  4       pWØ,          P                  4       pV'       d	   Wˆ,          MTp\        P                  ! VV	34      P                  4       pVP                   V,          P#                  V4      pVP                   V,          P#                  V4      p\        P$                  ! VR8„  W¼,          V4      pV'       d   Vf   W²^,          V) ^,           pVe   VRV pV# )a?  Inverse Short-Time Fourier Transform.

Args:
    x: Complex STFT output of shape (n_fft // 2 + 1, num_frames)
    hop_length: Hop length between frames (default: win_length // 4)
    win_length: Window length (default: (n_fft - 1) * 2)
    window: Window function name or array (default: "hann")
    center: If True, remove center padding (default: True)
    length: Target output length (default: None)
    normalized: If True, use window squared (COLA) normalization. If False, use simple window normalization (default: True)

Returns:
    Reconstructed time-domain signal
Nr»   r¼   ç»½×Ùß|Û=r[   ©rv   N)r6   r0   r=   rÌ   rÍ   rŸ   r1   r   rÂ   rd   rÏ   ÚirfftÚ	transposer‰   ÚflattenÚtileÚatÚaddÚwhere)rf   rÒ   rÓ   r¹   rÔ   ÚlengthÚ
normalizedrÕ   rÖ   rØ   ÚtÚreconstructedÚ
window_sumÚframes_timeÚframe_offsetsÚindicesÚindices_flatÚupdates_reconstructedÚwindow_normÚupdates_windows   &&&&&&&             r   Úistftrñ   ¤  s  € ð. ÒØ—g‘g˜a•j 1•n¨Õ)ˆ
ØÒØ 1•_ˆ
ä�&œ#×ÒÜ$×(Ñ(¨¯©«Ó8ˆ	ØÒÜÐ8¸¸ÐAÓBÐBÙ�j 1•nÓ% c rÐ*‰àˆà‡w�wˆq…z�JÔÜ�NŠN˜AœrŸxšx¨·g±g¸aµjÕ)@Ð(BÓCÐDÈ1ÔMˆà—‘˜•€JØ	�a�˜:Õ%¨
Õ2€Aä—H’H˜Q“K€MÜ—’˜!“€Jô —&‘&—,‘,˜q q�,Ó)×3Ñ3°A°qÓ9€Kô —I’I˜jÓ)¨JÕ6€MØ˜GÕ$¤r§y¢y°Ó'<Õ<€GØ—?‘?Ó$€Là(�_×5Ñ5Ó7Ðç'�1–5¨Q€KÜ—W’W˜[¨:¨-Ó8×@Ñ@ÓB€Nð "×$Ñ$ \Õ2×6Ñ6Ð7LÓM€MØ—‘˜|Õ,×0Ñ0°Ó@€Jô —H’HØ�UÑ˜MÕ6¸ó€M÷ �&’.Ø%°A¥o¸¸ÀqÕ8HÐIˆàÒØ% g vÐ.ˆàÐr.   c                óÄ   € V ^8„  d   QhR\         R\         R\         R\        R\        \        ,          R\        \        ,          R\        R\        R	\
        P                  /	# )
r"   Úsample_raterÑ   Ún_melsÚf_minÚf_maxÚnormÚ	mel_scaleÚpreciser&   )r*   r+   r   r=   Úboolr   r   )r,   s   "r   r-   r-   ô  sy   € ÷ Yñ YÜðYäðYô ðYô ð	Yô
 ”E�?ðYô ”3�-ðYô ðYô ðYô ‡X�XñYr.   c           	     ó   a aaaaaaa	a
€ RR lo	RR lo
S;'       g
    S ^,          oVVV	VV
VVVV 3	R lpV'       dk   \         P                  ! \         P                  4      ;_uu_ 4        V! \         P                  4      P	                  \         P
                  4      uuRRR4       # V! \         P
                  4      #   + '       g   i     L&; i)uÅ  Triangular mel filterbank as an mx.array of shape (n_mels, n_fft // 2 + 1).

Args:
    precise: If True, compute the filterbank in float64 on the CPU stream
        and cast to float32 before returning. Default float32 path drifts
        ~5e-6 from a torchaudio float64 reference â€” enough to perturb the
        CTC decode in numerically sensitive models (e.g. granite_speech_nar).
        One-time cost at lru_cache miss; runtime use is unaffected.
c                 óJ  € VR 8X  d,   R\         P                  ! RV R,          ,           4      ,          # RRr2W,
          V,          pRpWR,
          V,          p\         P                  ! R4      R,          pW8¼  d+   V\         P                  ! W,          4      V,          ,           pV# )	Úhtkç     F¤@r�   ç     à…@rZ   ç     @�@çš™™™™™@ç      ;@ç«ªªªªªP@)r   r�   Úlog)Úfreqrø   rõ   Úf_spÚmelsÚ
min_log_hzÚmin_log_melÚlogsteps   &&      r   Ú	hz_to_melÚmel_filters.<locals>.hz_to_mel  s†   € Ø˜ÔØœDŸJšJ s¨T°E­\Õ'9Ó:Õ:Ð:ð ˜9ˆtØ• Õ$ˆØˆ
Ø!Õ)¨TÕ1ˆÜ—(’(˜3“- $Õ&ˆØÔØ¤§¢¨$Õ*;Ó!<¸wÕ!FÕFˆDØˆr.   c           	      óT  € VR 8X  d   RRV R,          ,          R,
          ,          # RR	r2W#V ,          ,           pRpWR,
          V,          p\         P                  ! R4      R,          p\        P                  ! W8¬  V\        P                  ! WpV,
          ,          4      ,          V4      pV# )
rý   rÿ   r„   rþ   r�   rZ   r   r  r  r  )r   r  r   rä   Úexp)r  rø   rõ   r  Úfreqsr  r	  r
  s   &&      r   Ú	mel_to_hzÚmel_filters.<locals>.mel_to_hz  s“   € Ø˜ÔØ˜D T¨F¥]Õ3°cÕ9Õ:Ð:ð ˜9ˆtØ˜t�Õ#ˆØˆ
Ø!Õ)¨TÕ1ˆÜ—(’(˜3“- $Õ&ˆÜ—’ØÑØœŸš °+Õ+=Õ >Ó?Õ?Øó
ˆð
 ˆr.   c                 óê  <	€ S^,          ^,           p\         P                  ! ^ S^,          WR7      pS! SS4      pS! SS4      p\         P                  ! W4S^,           V R7      pS! VS4      pVR,          VRR ,
          p\         P                  ! V^ 4      \         P                  ! V^4      ,
          pVRRR13,          ) VRR ,          p	VR	,          VR,          ,          p
\         P                  ! \         P                  ! V	4      \         P
                  ! Wš4      4      pSR8X  d<   RV^S^,            VRS ,
          ,          pV\         P                  ! V^ 4      ,          pVP                  ^ ^4      # )
r"   rW   ºé   NNNrv   ÚslaneyrA   r[   rD   )rv   :r"   NN)r   ÚlinspaceÚexpand_dimsÚmaximumr^   ÚminimumÚmoveaxis)r3   Ún_freqsÚ	all_freqsÚm_minÚm_maxÚm_ptsÚf_ptsÚf_diffÚslopesÚdown_slopesÚ	up_slopesÚ
filterbankÚenormrö   rõ   r  rø   r  rÑ   rô   r÷   ró   s   &            €€€€€€€€€r   Ú_buildÚmel_filters.<locals>._build)  sD  ø€ ð ˜1•*˜q•.ˆÜ—K’K  ;°!Õ#3°WÔJˆ	ñ ˜% Ó+ˆÙ˜% Ó+ˆÜ—’˜E¨&°1­*¸EÔBˆÙ˜% Ó+ˆð �r•˜U 3 B˜ZÕ'ˆÜ—’  qÓ)¬B¯NªN¸9ÀaÓ,HÕHˆð ˜q # 2 #˜v��¨&°°"¨+Õ5ˆØ˜5•M F¨2¥JÕ.ˆ	Ü—Z’ZÜ�MŠM˜+Ó&¬¯
ª
°;Ó(Jó
ˆ
ð �8ÔØ˜5  V¨a¥ZÐ0°5¸¸&°>ÕAÕBˆEØœ"Ÿ.š.¨°Ó2Õ2ˆJà×"Ñ" 1 aÓ(Ð(r.   N)rý   )r   ÚstreamÚcpur]   r`   Úfloat32)ró   rÑ   rô   rõ   rö   r÷   rø   rù   r'  r  r  s   fffffff& @@r   Úmel_filtersr,  ó  s   ÿø€ ô*ôð" ×$Ð$�[ 1•_€E÷)õ )÷@ ä�YŠY”r—v‘v×ÕÙœ"Ÿ*™*Ó%×,Ñ,¬R¯Z©ZÓ8÷ Òá”"—*‘*ÓÐ÷ ×ús   Á)3B=Â=C	c                   óp   a € ] tR tRt o RtR tV 3R lR ltV 3R lR ltRV 3R	 lR
 lltR t	R t
RtV tR# )r   iP  zÔ
Advanced caching for iSTFT operations. Fully vectorized Overlap-Add for MLX.
Handles multiple configurations efficiently.
Automatically caches normalization buffers and position indices for maximum performance.
c                ó"   € / V n         / V n        R # rr   ©Únorm_buffer_cacheÚposition_cache©Úselfs   &r   Ú__init__ÚISTFTCache.__init__W  s   € Ø!#ˆÔØ ˆÖr.   c                ó,   <€ V ^8„  d   QhRS[ RS[ RS[ /# )r"   rØ   Úframe_lengthrÒ   ©r*   )r,   Ú__classdict__s   "€r   r-   ÚISTFTCache.__annotate__[  s"   ø€ ÷ (ñ (©ð (¹3ð (ÉCñ (r.   c                ó  € WV3pW@P                   9  de   \        P                  ! V4      R,          V,          \        P                  ! V4      R,          ,           pVP                  R4      V P                   V&   V P                   V,          # )z.Get cached position indices or create new onesrÝ   ©Nrv   r[   )r1  r   r‰   r‡   )r3  rØ   r7  rÒ   ÚkeyÚ	positionss   &&&&  r   Úget_positionsÚISTFTCache.get_positions[  sw   € à¨Ð4ˆà×)Ñ)Ô)ä—	’	˜*Ó% gÕ.°Õ;Ü—)’)˜LÓ)¨'Õ2õ3ð ð (1×'8Ñ'8¸Ó'<ˆD×Ñ Ñ$à×"Ñ" 3Õ'Ð'r.   c          
      óL   <€ V ^8„  d   QhRS[ RS[ RS[ RS[P                  RS[ /# )r"   rÑ   rÒ   rÓ   r¹   rØ   )r*   r   r   )r,   r9  s   "€r   r-   r:  h  sA   ø€ ÷ +ñ +áð+ñ ð+ñ ð	+ñ
 —‘ð+ñ ñ+r.   c                ó&  € \        \        VP                  4       4      4      pWW6V3pWpP                  9  dÉ   VP                  ^ ,          pV^,
          V,          V,           p	V P                  WXV4      p
V^,          p\        P                  ! V	\        P                  R7      p\        P                  ! Wµ4      pVP                  V
,          P                  V4      p\        P                  ! VR4      pWÀP                  V&   V P                  V,          # )z1Get cached normalization buffer or create new onerW   rÜ   )Úhashr>   Útolistr0  r6   r?  r   rd   r+  rá   râ   rã   r  )r3  rÑ   rÒ   rÓ   r¹   rØ   Úwindow_hashr=  r7  Úola_lenÚpositions_flatÚwindow_squaredÚnorm_bufferÚwindow_sq_tileds   &&&&&&        r   Úget_norm_bufferÚISTFTCache.get_norm_bufferh  sÖ   € ô œ5 §¡£Ó1Ó2ˆØ *¸:ÐFˆà×,Ñ,Ô,Ø!Ÿ<™<¨�?ˆLØ! A•~¨Õ3°lÕBˆGØ!×/Ñ/°
È*ÓUˆNà# Q�YˆNÜŸ(š( 7´"·*±*Ô=ˆKÜ Ÿgšg nÓAˆOØ%Ÿ.™.¨Õ8×<Ñ<¸_ÓMˆKÜŸ*š* [°%Ó8ˆKà*5×"Ñ" 3Ñ'à×%Ñ% cÕ*Ð*r.   Nc                ó    <€ V ^8„  d   QhRS[ P                  RS[ P                  RS[RS[RS[RS[ P                  RS[RS[R	S[ P                  /	# )
r"   Ú	real_partÚ	imag_partrÑ   rÒ   rÓ   r¹   rÔ   Úaudio_lengthr&   ©r   r   r*   rú   )r,   r9  s   "€r   r-   r:  ƒ  s€   ø€ ÷ Cñ Cá—8‘8ðCñ —8‘8ðCñ ð	Cñ
 ðCñ ðCñ —‘ðCñ ðCñ ðCñ 
�‰ñCr.   c	                óê  € VP                   ^ ,          V8  dS   W6P                   ^ ,          ,
          p	\        P                  ! V\        P                  ! V	3VP                  R7      .4      pVRV,          ,           p
\        P
                  P                  V
P                  ^ ^^4      VRR7      pW¶,          pVP                   w  rÞpV^,
          V,          V,           pV P                  W4WVV4      pV P                  WïV4      p\        P                  ! V4      V,          pVR,          VR,          ,           p\        P                  ! VV,          \        P                  R7      pVP                  VP                  R4      ,          P                  VP                  R4      4      pVP                  VV4      pVVR,          ,          pV'       d   V^,          pVRVR13,          pVe   VRRV13,          pV# )	a«  
iSTFT with automatic caching and vectorized overlap-add.

Args:
    real_part: Real part of STFT output (batch, freq, time)
    imag_part: Imaginary part of STFT output (batch, freq, time)
    n_fft: FFT size
    hop_length: Hop length
    win_length: Window length
    window: Window function
    center: If True, remove center padding
    audio_length: Target audio length

Returns:
    Reconstructed audio (batch, samples)
rW   y              ð?©r   r½   Nrv   r[   r<  rÝ   )r6   r   rÂ   rd   r3   rÏ   rÞ   rß   rK  r?  r‰   r+  râ   r‡   rã   )r3  rN  rO  rÑ   rÒ   rÓ   r¹   rÔ   rP  rÁ   Ústft_complexÚtime_framesÚwindowed_framesÚ
batch_sizerØ   r7  rF  rI  rG  Úbatch_offsetsÚglobal_indicesrk   Ú	start_cuts   &&&&&&&&&              r   rñ   ÚISTFTCache.istftƒ  s©  € ð8 �<‰<˜�?˜UÔ"ØŸ,™, q�/Õ)ˆCÜ—^’^ V¬R¯XªX°s°fÀFÇLÁLÔ-QÐ$RÓSˆFð ! 2¨	¥>Õ1ˆÜ—f‘f—l‘l <×#9Ñ#9¸!¸QÀÓ#BÀeÐRT�lÓUˆð &Õ.ˆà/>×/DÑ/DÑ,ˆ
 Ø •> ZÕ/°,Õ>ˆð ×*Ñ*Ø˜z°:ó
ˆð ×+Ñ+¨JÀjÓQˆô Ÿ	š	 *Ó-°Õ7ˆØ'¨Õ0°=ÀÕ3IÕIˆä—’˜:¨Õ/¼¿
¹
ÔCˆØ—‘˜>×1Ñ1°"Ó5Õ6×:Ñ:¸?×;RÑ;RÐSUÓ;VÓWˆØ—‘ 
¨GÓ4ˆð ˜+ gÕ.Õ.ˆ÷ Ø �
ˆIØ˜A˜y™z˜MÕ*ˆFàÒ#Ø˜A˜} ˜}Ð,Õ-ˆFàˆr.   c                ón   € V P                   P                  4        V P                  P                  4        R# )z$Clear all cached data to free memoryN)r0  Úclearr1  r2  s   &r   Úclear_cacheÚISTFTCache.clear_cacheÈ  s&   € à×Ñ×$Ñ$Ô&Ø×Ñ×!Ñ!Ö#r.   c           	     ó¸   € R\        V P                  4      R\        V P                  4      R\        V P                  4      \        V P                  4      ,           /# )z"Get information about cached itemsÚnorm_buffersÚposition_indicesÚtotal_cached_items)rc   r0  r1  r2  s   &r   Ú
cache_infoÚISTFTCache.cache_infoÍ  sQ   € ð œC × 6Ñ 6Ó7Ø¤ D×$7Ñ$7Ó 8Ø ¤# d×&<Ñ&<Ó"=Ü�$×%Ñ%Ó&õ#'ð
ð 	
r.   r/  )TN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r4  r?  rK  rñ   r^  rd  Ú__static_attributes__Ú__classdictcell__)r9  s   @r   r   r   P  s?   ø‡ € ñò!÷(ð (÷+ð +÷6Cò CòJ$÷

ð 
r.   c                óp   € V ^8„  d   QhR\         P                  R\        R\        R\         P                  /# )r"   ÚspecgramrÓ   Úmoder&   )r   r   r*   r=   )r,   s   "r   r-   r-   Ü  s4   € ÷ ,*ñ ,*Ü�h‰hð,*Ü$'ð,*Ü36ð,*ä‡X�Xñ,*r.   c                óÆ  € V^8  d   \        RV 24      hV P                  pV P                  RVR,          4      p V P                  ^ ,          pV^,
          ^,          p\        WU^,           ,          ^V,          ^,           ,          4      R,          pVR8X  d`   \        P
                  ! V R	,          V^R7      p\        P
                  ! V RRR13,          V^R7      p\        P                  ! WpV.^R7      p	M\        P                  ! V R
WU3.4      p	\        P                  ! V) V^,           V	P                  R7      p
V	P                  ^,          ^V,          ,
          p\        P                  ! WK3V	P                  R7      p\        V4       FB  pV	RWÝV,           13,          pWê,          p\        P                  ! V^R7      V,          VRV3&   KD  	  VP                  V4      # )aŸ  
Compute delta coefficients of a spectrogram (Kaldi-compatible).

The formula is:
d_t = sum_{n=1}^{N} n * (c_{t+n} - c_{t-n}) / (2 * sum_{n=1}^{N} n^2)

Args:
    specgram: MLX array of dimension (..., freq, time)
    win_length: The window length used for computing delta (default: 5)
    mode: Padding mode - "edge" or "constant" (default: "edge")

Returns:
    MLX array of deltas of dimension (..., freq, time)
zwin_length should be >= 3, got g      @Úedgerv   r¼   NrW   r[   ©rv   :é    r  N©rs  rs  )r1   r6   r‡   r+   r   ÚrepeatrÂ   rÁ   r‰   r3   rd   r   rŠ   )rn  rÓ   ro  Úoriginal_shapeÚnum_featuresr   r   Úpad_leftÚ	pad_rightÚpaddedÚkernel_weightsÚ
time_stepsrk   rl   r¹   rw   s   &&&             r   Úcompute_deltas_kaldir}  Ü  s‰  € ð" �A„~ÜÐ:¸:¸,ÐGÓHÐHà—^‘^€NØ×Ñ  N°2Õ$6Ó7€HØ—>‘> !Õ$€Là	�a�˜AÕ€AÜ�!˜1•u•+  Q¥¨¥Õ+Ó,¨sÕ2€Eð ˆv„~Ü—9’9˜X fÕ-¨q°qÔ9ˆÜ—I’I˜h q¨"©# vÕ.°¸Ô:ˆ	Ü—’ °YÐ ?ÀaÔH‰ä—’˜ 6¨A¨6Ð"2Ó3ˆä—Y’Y ˜r 1 q¥5°·±Ô=€NØ—‘˜a• 1 q¥5Õ(€JÜ�XŠX�|Ð0¸¿¹ÔE€Fä�:ÖˆØ˜˜1 :�~Ð-Ð-Õ.ˆØÕ*ˆÜ—v’v˜h¨QÔ/°%Õ7ˆˆq�!ˆt‹ñ ð
 �>‰>˜.Ó)Ð)r.   c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r"   r  r&   ©r   r   )r,   s   "r   r-   r-     s"   € ÷ /ñ /œ"Ÿ(™(ð /¤r§x¡xñ /r.   c                óX   € R\         P                  ! RV R,          ,           4      ,          # )z/Convert frequency to mel scale (Kaldi formula).ç     œ‘@r�   rÿ   )r   r  )r  s   &r   Úmel_scale_kaldir‚    s   € à”B—F’F˜3 ¨¥Õ-Ó.Õ.Ð.r.   c                óX   € V ^8„  d   QhR\         P                  R\         P                  /# )r"   Úmel_freqr&   r  )r,   s   "r   r-   r-     s"   € ÷ 5ñ 5¤b§h¡hð 5´2·8±8ñ 5r.   c                óX   € R\         P                  ! V R,          4      R,
          ,          # )z/Convert mel scale to frequency (Kaldi formula).rÿ   r�  r�   )r   r  )r„  s   &r   Úinverse_mel_scale_kaldir†    s    € à”B—F’F˜8 fÕ,Ó-°Õ3Õ4Ð4r.   c                ó0   € V ^8„  d   QhR\         R\         /# )r"   rf   r&   r8  )r,   s   "r   r-   r-     s   € ÷ 6ñ 6œð 6¤ñ 6r.   c                óP   € V ^ 8X  d   ^# ^V ^,
          P                  4       ,          # )z7Returns the smallest power of 2 that is greater than x.)Ú
bit_length)rf   s   &r   Ú_next_power_of_2rŠ    s%   € à�Q”ˆ1Ð5˜A ! a¥%×!3Ñ!3Ó!5Õ5Ð5r.   c          
      ó|   € V ^8„  d   QhR\         P                  R\        R\        R\        R\         P                  /# )r"   ÚwaveformÚwindow_sizeÚwindow_shiftÚ
snip_edgesr&   rQ  )r,   s   "r   r-   r-     sC   € ÷ Vñ VÜ�h‰hðVÜ%(ðVÜ8;ðVÜIMðVä‡X�XñVr.   c                ó8  € V P                   ^ ,          pV'       d4   WA8  d   \        P                  ! R4      # ^WA,
          V,          ,           pM±WB^,          ,           V,          pV^,          V^,          ,
          pV^ 8”  dW   V ^V^,            RRR1,          pV^8”  d   V RV) ^,
          R1,          MV R^ R1,          p\        P                  ! WpV.4      p M'V RRR1,          p\        P                  ! W) R V.4      p \        P                  ! WV3V^3R7      # )zCExtract frames from waveform using strided windowing (Kaldi-style).NrÊ   rt  r[   )r6   r   rd   rÂ   rÎ   )	rŒ  r�  rŽ  r�  r–   ÚmrÁ   rx  ry  s	   &&&&     r   Ú_get_strided_kaldir’    s  € ð —.‘. Õ#€KçØÔ$Ü—8’8˜FÓ#Ð#Ø�Õ*¨|Õ;Õ;‰à¨AÕ-Õ.°<Õ?ˆØ˜QÕ °Õ!2Õ2ˆà�Œ7Ø  C¨!¥GÐ,©T¨r¨TÕ2ˆHØ8;¸a¼˜  s d¨Q¥h°Ð!3Ö4ÀXÈbÐQRÐSUÈgÕEVˆIÜ—~’~ x¸9Ð&EÓF‰Hà ¡ 2 �ˆIÜ—~’~ x°° ¸	Ð&BÓCˆHä�=Š=˜¨[Ð)9ÀLÐRSÐCTÔUÐUr.   c                óª   € V ^8„  d   QhR\         R\         R\        R\        R\        R\        \        P                  \        P                  3,          /# )r"   Únum_binsÚwindow_length_paddedÚsample_freqÚlow_freqÚ	high_freqr&   )r*   r+   r>   r   r   )r,   s   "r   r-   r-   3  sV   € ÷ 0(ñ 0(Üð0(äð0(ô ð0(ô ð	0(ô
 ð0(ô Œ2�8‰8”R—X‘XÐÕñ0(r.   c                óê  € V ^8”  g   Q R4       hV^,          ^ 8X  g   Q hV^,          pRV,          pVR8:  d	   WF,          pRTu;8:  d   V8  d   M Q hRTu;8  d	   V8:  g   Q h Q hW!,          p\        \        \        P                  ! V4      4      4      p\        \        \        P                  ! V4      4      4      p	W˜,
          V ^,           ,          p
\        P                  ! V 4      P                  R^4      pW‹V
,          ,           pW‹R,           V
,          ,           pW‹R,           V
,          ,           p\        V4      p\        V\        P                  ! V4      ,          4      P                  ^R4      pVV,
          WÜ,
          ,          pVV,
          Wí,
          ,          p\        P                  ! \        P                  ! ^4      \        P                  ! VV4      4      pVVP                  4       3# )ay  
Create Kaldi-compatible mel filterbank matrix.

Args:
    num_bins: Number of mel bins
    window_length_padded: Padded window length (FFT size)
    sample_freq: Sample frequency in Hz
    low_freq: Low frequency cutoff
    high_freq: High frequency cutoff (0 or negative = relative to Nyquist)

Returns:
    (bins, center_freqs): Mel filterbank matrix and center frequencies
zMust have at least 3 mel binsr   rZ   r�   rA   r[   )r+   r‚  r   r   r‰   r‡   r†  r  rd   r  Úsqueeze)r”  r•  r–  r—  r˜  Únum_fft_binsÚnyquistÚfft_bin_widthÚmel_low_freqÚmel_high_freqÚmel_freq_deltaÚbin_idxÚleft_melÚ
center_melÚ	right_melÚcenter_freqsÚmelÚup_slopeÚ
down_slopeÚbinss   &&&&&               r   Úget_mel_banks_kaldirª  3  s–  € ð( �aŒ<Ð8Ð8Ó8ˆ<Ø !Õ# qÔ(Ð(Ð(à'¨1Õ,€LØ�KÕ€Gà�CÔØÕˆ	à�8Ö%˜gÖ%ÐGÐG¨C°)Ö,F¸wÔ,FÐGÐGÐ,FÐGÐGàÕ6€MÜœ¬¯ª°(Ó);Ó<Ó=€LÜœ/¬"¯(ª(°9Ó*=Ó>Ó?€MØ#Õ2°xÀ!µ|ÕD€Nä�iŠi˜Ó!×)Ñ)¨"¨aÓ0€GØ¨Õ6Õ6€HØ¨3¥°.Õ @Õ@€JØ¨#¥°Õ?Õ?€Iä*¨:Ó6€LÜ
˜-¬"¯)ª)°LÓ*AÕAÓ
B×
JÑ
JÈ1ÈbÓ
Q€Cà�h• :Õ#8Õ9€HØ˜c•/ iÕ&<Õ=€JÜ�:Š:”b—h’h˜q“k¤2§:¢:¨h¸
Ó#CÓD€Dà�×%Ñ%Ó'Ð'Ð'r.   c                óÐ   € V ^8„  d   QhR\         P                  R\        R\        R\        R\        R\        R\        R\        R	\
        R
\        R\        R\         P                  /# )r"   rŒ  ró   Úwin_lenÚwin_incÚnum_melsÚwin_typeÚpreemphasisÚditherr�  r—  r˜  r&   )r   r   r*   r=   r+   rú   )r,   s   "r   r-   r-   f  s–   € ÷ cñ cÜ�h‰hðcäðcô ðcô ð	cô
 ðcô ðcô ðcô ðcô ðcô ðcô ðcô ‡X�Xñcr.   c                ó‚  € V P                   ^8X  d
   V ^ ,          p W!,          R,          pW1,          R,          p\        W,          R,          4      p\        W,          R,          4      p\        V4      p\        WWØ4      pVP                  ^ ,          ^ 8X  d   \
        P                  ! ^ V34      # VR8w  d:   \
        P                  P                  VP                  4      V,          pVV,           p\
        P                  ! V^RR7      pVV,
          pVR8w  dF   VR,          pVR,          VVRRR13,          ,          ,
          p\
        P                  ! VV.^R7      pVR	8X  dg   \
        P                  ! V4      pR
R\
        P                  ! ^\
        P                  ,          V,          V^,
          ,          4      ,          ,
          pEMVR8X  df   \
        P                  ! V4      pRR\
        P                  ! ^\
        P                  ,          V,          V^,
          ,          4      ,          ,
          pM™VR8X  d}   \
        P                  ! V4      pRR\
        P                  ! ^\
        P                  ,          V,          V^,
          ,          4      ,          ,
          p\
        P                  ! VR4      pM\
        P                  ! V4      pVV,          pWþ8w  d$   Wþ,
          p\
        P                   ! VR^ V3.4      p\
        P"                  P%                  VV^R7      p\
        P&                  ! V4      R,          p\)        WO\+        V4      Wš4      w  pp\
        P                   ! VRR.4      p\
        P,                  ! VVP.                  4      p\
        P0                  ! \
        P2                  ! VR4      4      pV# )aZ  
Compute Kaldi-compatible log mel-filterbank features.

Args:
    waveform: Input audio (1D array)
    sample_rate: Sample rate in Hz
    win_len: Window length in samples
    win_inc: Window shift in samples
    num_mels: Number of mel bins
    win_type: Window type ("hamming", "hanning", "povey", "rectangular")
    preemphasis: Preemphasis coefficient
    dither: Dither amount (0 to disable)
    snip_edges: If True, discard incomplete frames at edges
    low_freq: Low frequency cutoff
    high_freq: High frequency cutoff (0 = Nyquist)

Returns:
    Log mel-filterbank features (time, num_mels)
iè  gü©ñÒMbP?rZ   T)r½   Úkeepdimsrv   Nr¼   r   r   r   r   r   Úpoveyg333333ë?rS  rA   g:Œ0âŽyE>rr  )rv   r  r[   rt  )rs  r  )r5   r*   rŠ  r’  r6   r   rd   ÚrandomÚnormalr‘   rÂ   r‰   r   r   r®   ÚonesrÁ   rÏ   rÐ   r   rª  r+   ÚmatmulÚTr  r  )rŒ  ró   r¬  r­  r®  r¯  r°  r±  r�  r—  r˜  Úframe_length_msÚframe_shift_msÚwindow_shift_samplesr�  Úpadded_window_sizeÚstrided_inputÚ
rand_gaussÚ	row_meansÚ	first_colÚ
other_colsr   r¹   r    rÃ   Ú
fft_resultÚspectrumÚmel_energiesÚ_Úmel_featuress   &&&&&&&&&&&                   r   Úcompute_fbank_kaldirÈ  f  sê  € ð@ ‡}�}˜ÔØ˜A•;ˆàÕ+¨dÕ2€OØÕ*¨TÕ1€NÜ˜{Õ;¸eÕCÓDÐÜ�kÕ3°eÕ;Ó<€KÜ)¨+Ó6Ðô 'ØÐ3ó€Mð ×Ñ˜1Õ Ô"Ü�xŠx˜˜H˜Ó&Ð&ð �„}Ü—Y‘Y×%Ñ% m×&9Ñ&9Ó:¸VÕCˆ
Ø%¨
Õ2ˆô —’˜¨A¸Ô=€IØ! IÕ-€Mð �cÔØ! &Õ)ˆ	Ø" 5Õ)¨K¸-ÈÈ3ÈBÈ3ÈÕ:OÕ,OÕOˆ
ÜŸš¨	°:Ð'>ÀQÔGˆð �9ÔÜ�IŠI�kÓ"ˆØ˜œrŸvšv a¬"¯%©%¥i°!¥m°{ÀQµÕ&GÓHÕHÕHŠØ	�YÔ	Ü�IŠI�kÓ"ˆØ�sœRŸVšV A¬¯©¥I°¥M°[À1µ_Õ$EÓFÕFÕF‰Ø	�WÔ	Ü�IŠI�kÓ"ˆØ�Sœ2Ÿ6š6 !¤b§e¡e¥)¨a¥-°;Àµ?Õ"CÓDÕDÕDˆÜ—’˜$ Ó%‰ä—’˜Ó%ˆà! FÕ*€Mð Ô(Ø$Õ2ˆÜŸš˜}¨v¸¸7°|Ð.DÓEˆô —‘—‘˜]Ð.@Àq�ÓI€JÜ�vŠv�jÓ! SÕ(€Hô *Ø¤e¨KÓ&8¸(ó�O€L�!ô —6’6˜,¨°Ð(8Ó9€Lô —9’9˜X |§~¡~Ó6€LÜ—6’6œ"Ÿ*š* \°4Ó8Ó9€LàÐr.   )r   r   r   r   rÌ   rÚ   rñ   r   r,  r¦   ro   r²   r·   r}  r‚  r†  rª  rÈ  )F)gš™™™™™Ù?g      è?)i   NNr    TrÀ   )NNr    TNF)rs  NNrý   F)é   rq  )
i€»  i€  i€  é<   r   g
×£p=
ï?r�   Tr¬   rZ   )%rj  r   rŒ   Ú__all__Ú	functoolsr   Útypingr   Úmlx.coreÚcorer   Únumpyr(   r   r   r   r   rÌ   r7   rP   ro   rs   r}   r¦   r²   r·   rÚ   rñ   r,  r   r}  r‚  r†  rŠ  r’  rª  rÈ  © r.   r   Ú<module>rÒ     sA  ðñó Û ò€õ*  Ý å Û ñ �4Ôó
ó ð
ñ �4Ôó
ó ð
ñ �4Ôó
ó ð
ñ �4ÔóOó ðOð ˆGØˆwØˆwØ�Ø�ðÐ õPõ,Dõ^(õVõ÷&q
õhõ 	÷0#ôfIñ^ �4ÔöYó ðY÷xD
ñ D
÷X,*õ^/õ
5õ
6õ
Võ20(÷fcñ cr.   