ó
    ð“,j+M  ã                   ó   • S r SSKJr  SSKJrJrJr  SSKrSSK	r	SSK
Js  Jr  SSKJr  SSK	JrJr  SSKJrJrJrJr  \ " S	 S
5      5       r " S S\R.                  5      r " S S\R0                  5      r " S S\R2                  5      rSS jr " S S\R6                  5      r " S S\R6                  5      r " S S\R6                  5      r " S S\R6                  5      r " S S\R6                  5      r  " S S\R6                  5      r!g)zvModified from https://github.com/openai/whisper/blob/main/whisper/model.py
Add EuclideanCodebook & VectorQuantization
é    )Ú	dataclass)ÚIterableÚOptionalÚTupleN©Ú	rearrange)ÚTensorÚnné   )Úmake_non_pad_maskÚmask_to_biasÚ
onnx2torchÚmerge_tokenized_segmentsc                   óx   • \ rS rSr% Sr\\S'   Sr\\S'   Sr\\S'   Sr	\\S	'   S
r
\\S'   Sr\\S'   Sr\\S'   Srg)ÚModelConfigé   é€   Ún_melsiÜ  Ún_audio_ctxi   Ún_audio_stateé   Ún_audio_headé   Ún_audio_layeri   Ún_codebook_sizeFÚuse_sdpa© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   ÚintÚ__annotations__r   r   r   r   r   r   ÚboolÚ__static_attributes__r   ó    ÚŸC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\s3tokenizer/model.pyr   r      sH   ‡ à€FˆCÓØ€K�ÓØ€M�3ÓØ€L�#ÓØ€M�3ÓØ€O�SÓà€HˆdÖr&   r   c                   ó&   • \ rS rSrS\S\4S jrSrg)Ú	LayerNormé+   ÚxÚreturnc                 óH  • [         R                  " UR                  5       U R                  U R                  b  U R                  R                  5       OS U R
                  b  U R
                  R                  5       OS U R                  5      R                  UR                  5      $ ©N)	ÚFÚ
layer_normÚfloatÚnormalized_shapeÚweightÚbiasÚepsÚtypeÚdtype©Úselfr+   s     r'   ÚforwardÚLayerNorm.forward-   so   € Ü�|Š|Ø�G‰G‹IØ×!Ñ!Ø#'§;¡;Ñ#:ˆD�K‰K×ÑÔÀØ!%§¡Ñ!6ˆD�I‰I�O‰OÔ¸DØ�H‰Hó
÷ ‰$ˆq�w‰w‹-ð	r&   r   N©r   r   r    r!   r	   r:   r%   r   r&   r'   r)   r)   +   s   † ð˜ð  F÷ r&   r)   c                   ó&   • \ rS rSrS\S\4S jrSrg)ÚLinearé7   r+   r,   c                 óä   • [         R                  " UU R                  R                  UR                  5      U R
                  c  S 5      $ U R
                  R                  UR                  5      5      $ r.   )r/   Úlinearr3   Útor7   r4   r8   s     r'   r:   ÚLinear.forward9   sV   € Ü�xŠxØØ�K‰K�N‰N˜1Ÿ7™7Ó#Ø—I‘IÑ%ˆDó
ð 	
ð ,0¯9©9¯<©<¸¿¹Ó+@ó
ð 	
r&   r   Nr<   r   r&   r'   r>   r>   7   s   † ð
˜ð 
 F÷ 
r&   r>   c                   óB   ^ • \ rS rSrS\S\S\\   S\4U 4S jjrSrU =r$ )ÚConv1déA   r+   r3   r4   r,   c                 óš   >• [         TU ]  XR                  UR                  5      Uc  S 5      $ UR                  UR                  5      5      $ r.   )ÚsuperÚ_conv_forwardrB   r7   )r9   r+   r3   r4   Ú	__class__s       €r'   rI   ÚConv1d._conv_forwardC   sI   ø€ ä‰wÑ$Ø�y‰y˜Ÿ™Ó!¨4©< 4óOð 	OØ=A¿W¹WÀQÇWÁWÓ=MóOð 	Or&   r   )	r   r   r    r!   r	   r   rI   r%   Ú__classcell__©rJ   s   @r'   rE   rE   A   s6   ø† ðO˜vð O¨vð OØ$ VÑ,ðOØ17÷Oõ Or&   rE   c                 ó¼  • US-  S:X  d   e[         R                  " U5      US-  S-
  -  n[        R                  " U* [        R                  " US-  5      -  5      n[        R                  " U 5      SS2[         R
                  4   U[         R
                  SS24   -  n[        R                  " [        R                  " U5      [        R                  " U5      /SS9$ )z*Returns sinusoids for positional embeddingé   r   r   N©Údim)	ÚnpÚlogÚtorchÚexpÚarangeÚnewaxisÚcatÚsinÚcos)ÚlengthÚchannelsÚmax_timescaleÚlog_timescale_incrementÚinv_timescalesÚscaled_times         r'   Ú	sinusoidsra   I   s´   € à�a‰<˜1ÓÐÐÜ Ÿfšf ]Ó3°xÀ1±}ÀqÑ7HÑIÐÜ—Y’YÐ 7Ð7Ü$Ÿ|š|¨H¸©MÓ:ñ ;ó <€Nä—,’,˜vÓ&¢q¬"¯*©* }Ñ5¸Ü
�
‰
’Aˆñ9ñ €Kä�9Š9”e—i’i Ó,¬e¯iªi¸Ó.DÐEÈ1ÑMÐMr&   c            
       ó€   ^ • \ rS rSrSS\S\S\4U 4S jjjr SS\S\\   4S jjr	 SS	\S
\S\S\\   4S jjr
SrU =r$ )ÚMultiHeadAttentionéT   Ún_stateÚn_headr   c                 ó¸   >• [         TU ]  5         X l        [        X5      U l        [        XSS9U l        [        X5      U l        [        X5      U l        X0l        g )NF)r4   )	rH   Ú__init__rf   r>   ÚqueryÚkeyÚvalueÚoutr   )r9   re   rf   r   rJ   s       €r'   rh   ÚMultiHeadAttention.__init__V   sJ   ø€ Ü‰ÑÔØŒÜ˜GÓ-ˆŒ
Ü˜'°Ñ7ˆŒÜ˜GÓ-ˆŒ
Ü˜'Ó+ˆŒà �r&   r+   Úmaskc                 ó¶   • U R                  U5      nU R                  U5      nU R                  U5      nU R                  X4XR5      u  pgU R	                  U5      U4$ r.   )ri   rj   rk   Úqkv_attentionrl   )r9   r+   rn   ÚqÚkÚvÚwvÚqks           r'   r:   ÚMultiHeadAttention.forward`   sR   € ð
 �J‰J�q‹MˆØ�H‰H�Q‹KˆØ�J‰J�q‹Mˆà×#Ñ# A¨!Ó2‰ˆØ�x‰x˜‹|˜RÐÐr&   rq   rr   rs   c           	      ó$  • UR                   u    pVX`R                  -  S-  nUR                  " / UR                   S S QU R                  PSP76 R                  SSSS5      U-  nUR                  " / UR                   S S QU R                  PSP76 nUR                  " / UR                   S S QU R                  PSP76 R                  SSSS5      nU R                  (       d¦  UR                  SSSS5      U-  nX-  nUb  X„-   nUR                  5       n[        R                  R                  R                  USS9R                  UR                  5      n	X“-  R                  SSSS5      R                  SS9UR                  5       4$ UR                  SSSS5      U-  nUc   e[        R                  R                  R                  UUUUS	S
S9n
U
R                  SS5      R!                  5       R                  UR#                  S5      SU5      n
U
S 4$ )Ng      Ð¿rO   éÿÿÿÿr   r   é   rP   )Ú	start_dimg        g      ð?)Ú	attn_maskÚ	dropout_pÚscale)Úshaperf   ÚviewÚpermuter   r1   rT   r
   Ú
functionalÚsoftmaxrB   r7   ÚflattenÚdetachÚscaled_dot_product_attentionÚ	transposeÚ
contiguousÚsize)r9   rq   rr   rs   rn   Ú_ÚDr}   ru   ÚwÚoutputs              r'   rp   Ú MultiHeadAttention.qkv_attentionl   s  € ð
 —'‘'‰ˆˆ1Ø—k‘kÑ! EÑ)ˆØ�FŠFÐ1�A—G‘G˜B˜Q�KÐ1 §¡Ð1¨bÒ1×9Ñ9¸!¸QÀÀ1ÓEÈÑMˆØ�FŠFÐ1�A—G‘G˜B˜Q�KÐ1 §¡Ð1¨bÒ1ˆØ�FŠFÐ1�A—G‘G˜B˜Q�KÐ1 §¡Ð1¨bÒ1×9Ñ9¸!¸QÀÀ1ÓEˆà�}�}Ø—	‘	˜!˜Q  1Ó%¨Ñ-ˆAØ‘ˆBØÑØ‘Y�Ø—‘“ˆBÜ—‘×#Ñ#×+Ñ+¨B°BÐ+Ð7×:Ñ:¸1¿7¹7ÓCˆAØ‘E—?‘? 1 a¨Ø#$ó&ß&-¡g¸ gÐ&:¸B¿I¹I»KðHð Hð —	‘	˜!˜Q  1Ó%¨Ñ-ˆAØÑ#Ð#Ð#Ü—X‘X×(Ñ(×EÑEØØØØØØð Fð ˆFð ×&Ñ& qØ'(ó*ß*4©*«,·t±t¸A¿F¹FÀ1»IÀrÈ1Ó7Mð ð ˜4�<Ðr&   )rj   rf   rl   ri   r   rk   )Fr.   )r   r   r    r!   r"   r$   rh   r	   r   r:   rp   r%   rL   rM   s   @r'   rc   rc   T   s{   ø† ñ! ð !¨Sð !¸D÷ !ð !ð "&ñ
 àð
 ð �vÑõ
 ð  04ñ	" Øð" àð" ð  ð" ð % VÑ,÷	" ó " r&   rc   c                   óV   ^ • \ rS rSrS\S\S\4U 4S jjr S
S\S\\   4S jjr	S	r
U =r$ )ÚResidualAttentionBlocké‘   re   rf   r   c                 ó  >• [         TU ]  5         [        XUS9U l        [	        U5      U l        US-  n[        R                  " [        X5      [        R                  " 5       [        XA5      5      U l
        [	        U5      U l        g )N©r   é   )rH   rh   rc   Úattnr)   Úattn_lnr
   Ú
Sequentialr>   ÚGELUÚmlpÚmlp_ln)r9   re   rf   r   Ún_mlprJ   s        €r'   rh   ÚResidualAttentionBlock.__init__“   sd   ø€ Ü‰ÑÔä& wÀÑJˆŒ	Ü  Ó)ˆŒà˜!‘ˆÜ—=’=¤¨Ó!7¼¿º»Ü!'¨Ó!7ó9ˆŒä Ó(ˆ�r&   r+   rn   c                 ó’   • XR                  U R                  U5      US9S   -   nXR                  U R                  U5      5      -   nU$ )N)rn   r   ©r”   r•   r˜   r™   )r9   r+   rn   s      r'   r:   ÚResidualAttentionBlock.forwardž   sD   € ð
 —	‘	˜$Ÿ,™, q›/°�	Ð5°aÑ8Ñ8ˆØ—‘˜Ÿ™ Q›Ó(Ñ(ˆØˆr&   r�   r.   )r   r   r    r!   r"   r$   rh   r	   r   r:   r%   rL   rM   s   @r'   r�   r�   ‘   sC   ø† ð	) ð 	)¨Sð 	)¸D÷ 	)ð "&ñàðð �vÑ÷ó r&   r�   c                   óh   ^ • \ rS rSrS\S\S\S\S\S\S\4U 4S	 jjrS
\S\S\\\4   4S jr	Sr
U =r$ )ÚAudioEncoderé¨   r   Ún_ctxre   rf   Ún_layerÚstrider   c                 ó0  >• [         T	U ]  5         X`l        [        UUSUSS9U l        [        UUSSSS9U l        U R                  S[        X#5      5        [        R                  " [        U5       Vs/ s H  n[        X4US9PM     sn5      U l        g s  snf )Nry   r   )Úkernel_sizer¤   ÚpaddingrO   Úpositional_embeddingr’   )rH   rh   r¤   rE   Úconv1Úconv2Úregister_bufferra   r
   Ú
ModuleListÚranger�   Úblocks)
r9   r   r¢   re   rf   r£   r¤   r   r‰   rJ   s
            €r'   rh   ÚAudioEncoder.__init__ª   s¡   ø€ ô 	‰ÑÔØŒÜ˜FØ#Ø()Ø#)Ø$%ñ	'ˆŒ
ô
 ˜GØ#Ø()Ø#$Ø$%ñ	'ˆŒ
ð
 	×ÑÐ3´Y¸uÓ5NÔOä8:¿ºä˜7”^óG
â#�ô # 7¸XÔFÙ#ñG
ó 9ˆ�ùò G
s   Á2Br+   Úx_lenr,   c                 ó¶  • [        U5      R                  S5      n[        R                  " U R	                  X-  5      5      nUS-   S-
  S-
  U R
                  -  S-   n[        U5      R                  S5      n[        R                  " U R                  X-  5      5      nUS-   S-
  S-
  S-  S-   n[        U5      R                  S5      nUR                  SSS5      n[        X1R                  5      nXR                  SUR                  S   2SS24   -   R                  UR                  5      nU R                   H  nU" XR                  S5      5      nM     X4$ )z¡
x : torch.Tensor, shape = (batch_size, n_mels, T)
    the mel spectrogram of the audio
x_len: torch.Tensor, shape = (batch_size,)
    length of each audio in x
r   rO   r   N)r   Ú	unsqueezer/   Úgelur©   r¤   rª   r€   r   r7   r¨   r~   rB   r®   )r9   r+   r°   rn   Úblocks        r'   r:   ÚAudioEncoder.forwardÇ   s/  € ô ! Ó'×1Ñ1°!Ó4ˆÜ�FŠF�4—:‘:˜a™hÓ'Ó(ˆØ˜‘˜[Ñ(¨1Ñ,°·±Ñ<¸qÑ@ˆÜ  Ó'×1Ñ1°!Ó4ˆÜ�FŠF�4—:‘:˜a™hÓ'Ó(ˆØ˜‘˜[Ñ(¨1Ñ,°Ñ2°QÑ6ˆÜ  Ó'×1Ñ1°!Ó4ˆØ�I‰I�a˜˜AÓˆä˜D§'¡'Ó*ˆà×*Ñ*¨;¨A¯G©G°A©J¨;º¨>Ñ:Ñ:×>Ñ>¸q¿w¹wÓGˆà—[”[ˆEÙ�aŸ™¨Ó*Ó+ŠAñ !ð ˆxˆr&   )r®   r©   rª   r¤   )r   r   r    r!   r"   r$   rh   r	   r   r:   r%   rL   rM   s   @r'   r    r    ¨   st   ø† ðàðð ðð ð	ð
 ðð ðð ðð ÷ð:˜ð ¨ð °5¸À¸Ñ3H÷ ò r&   r    c                   óˆ  ^ • \ rS rSrSrS\S\4U 4S jjr\R                  " 5       S\	S\	4S j5       r
\R                  " 5       S\	S\	4S	 j5       r\R                  " 5       S
 5       r\R                  " 5       S\	S\	4S j5       r\R                  " 5       S\	S\	4S j5       r\R                  " 5       S\	S\	4S j5       rSrU =r$ )ÚEuclideanCodebookéá   z{Codebook with Euclidean distance (inference-only).
Args:
    dim (int): Dimension.
    codebook_size (int): Codebook size.
rQ   Úcodebook_sizec                 ó~   >• [         TU ]  5         [        R                  " X!5      nX l        U R                  SU5        g )NÚembed)rH   rh   rT   Úzerosr¹   r«   )r9   rQ   r¹   r»   rJ   s       €r'   rh   ÚEuclideanCodebook.__init__è   s2   ø€ Ü‰ÑÔÜ—’˜MÓ/ˆØ*ÔØ×Ñ˜W eÕ,r&   r+   r,   c                 ó   • [        US5      nU$ )Nz... d -> (...) dr   r8   s     r'   Ú
preprocessÚEuclideanCodebook.preprocessî   s   € ä�aÐ+Ó,ˆØˆr&   c                 ó0  • U R                   R                  5       R                  UR                  5      nUR	                  S5      R                  SSS9SU-  U-  -
  UR	                  S5      R                  SSS9-   * nUR                  SS9R                  nU$ )NrO   r   T)Úkeepdimr   rx   rP   )r»   ÚtrB   r7   ÚpowÚsumÚmaxÚindices)r9   r+   r»   ÚdistÚ	embed_inds        r'   ÚquantizeÚEuclideanCodebook.quantizeó   sˆ   € à—
‘
—‘“×!Ñ! !§'¡'Ó*ˆØ—‘�q“—‘˜a¨�Ð.°°Q±¸±Ñ>Ø—‘˜1“×!Ñ! !¨TÐ!Ð2ñ3ð 4ˆà—H‘H �HÐ$×,Ñ,ˆ	ØÐr&   c                 ó&   • UR                   " US S 6 $ )Nrx   )r   )r9   rÉ   r~   s      r'   Úpostprocess_embÚ!EuclideanCodebook.postprocess_embû   s   € à�~Š~˜u S b˜zÐ*Ð*r&   rÉ   c                 óF   • [         R                  " XR                  5      nU$ r.   )r/   Ú	embeddingr»   ©r9   rÉ   rÊ   s      r'   Ú
dequantizeÚEuclideanCodebook.dequantizeÿ   s   € ä—;’;˜y¯*©*Ó5ˆØˆr&   c                 ó„   • UR                   nU R                  U5      nU R                  U5      nU R                  X25      nU$ r.   )r~   r¿   rÊ   rÍ   )r9   r+   r~   rÉ   s       r'   ÚencodeÚEuclideanCodebook.encode  s=   € à—‘ˆà�O‰O˜AÓˆà—M‘M !Ó$ˆ	à×(Ñ(¨Ó:ˆ	ØÐr&   c                 ó(   • U R                  U5      nU$ r.   )rÒ   rÑ   s      r'   ÚdecodeÚEuclideanCodebook.decode  s   € à—?‘? 9Ó-ˆØˆr&   )r¹   )r   r   r    r!   Ú__doc__r"   rh   rT   Úinference_moder	   r¿   rÊ   rÍ   rÒ   rÕ   rØ   r%   rL   rM   s   @r'   r·   r·   á   s  ø† ñð-˜Cð -°÷ -ð ×ÒÓð˜Fð  vó ó ðð ×ÒÓð˜&ð  Vó ó ðð ×ÒÓñ+ó ð+ð ×ÒÓð Fð ¨vó ó ðð ×ÒÓð˜ð  6ó ó ðð ×ÒÓð ð ¨6ó ó ör&   r·   c                   ó¼   ^ • \ rS rSrSrS\S\4U 4S jjr\S 5       r\	R                  " 5       S\S\4S	 j5       r\	R                  " 5       S
\S\4S j5       rSrU =r$ )ÚVectorQuantizationi  z{Vector quantization implementation (inference-only).
Args:
    dim (int): Dimension
    codebook_size (int): Codebook size
rQ   r¹   c                 óL   >• [         TU ]  5         [        UUS9U l        X l        g )N)rQ   r¹   )rH   rh   r·   Ú	_codebookr¹   )r9   rQ   r¹   rJ   s      €r'   rh   ÚVectorQuantization.__init__  s&   ø€ Ü‰ÑÔÜ*¨sØ9FñHˆŒà*Õr&   c                 ó.   • U R                   R                  $ r.   )rß   r»   ©r9   s    r'   ÚcodebookÚVectorQuantization.codebook"  s   € à�~‰~×#Ñ#Ð#r&   r+   r,   c                 ó„   • [         R                  " UR                  5       SSS9nU R                  R	                  U5      nU$ )NrO   rx   )ÚprQ   )r/   Ú	normalizer1   rß   rÕ   )r9   r+   Úembed_ins      r'   rÕ   ÚVectorQuantization.encode&  s3   € ä�KŠK˜Ÿ™›	 Q¨BÑ/ˆØ—>‘>×(Ñ(¨Ó+ˆØˆr&   rÉ   c                 óT   • U R                   R                  U5      n[        US5      nU$ )Nzb n d -> b d n)rß   rØ   r   rÑ   s      r'   rØ   ÚVectorQuantization.decode,  s(   € à—>‘>×(Ñ(¨Ó3ˆÜ˜XÐ'7Ó8ˆØˆr&   )rß   r¹   )r   r   r    r!   rÚ   r"   rh   Úpropertyrã   rT   rÛ   r	   rÕ   rØ   r%   rL   rM   s   @r'   rÝ   rÝ     s…   ø† ñð+˜Cð +°÷ +ð ñ$ó ð$ð ×ÒÓð˜ð  6ó ó ðð
 ×ÒÓð ð ¨6ó ó ör&   rÝ   c                   ó2  ^ • \ rS rSrSr\" 5       4S\S\4U 4S jjjrS\S\S\	\\4   4S	 jr
\R                  " 5       S\S\S\	\\4   4S
 j5       r\R                  " 5       S\S\S\S\S\	\\4   4
S j5       r\S 5       rS\4S jrS\4S jrS rSrU =r$ )ÚS3Tokenizeri3  zVS3 tokenizer implementation (inference-only).
Args:
    config  (ModelConfig): Config
ÚnameÚconfigc           	      óØ  >• [         TU ]  5         Xl        X l        [	        U R                  R
                  U R                  R                  U R                  R                  U R                  R                  U R                  R                  US:X  a  SOSU R                  R                  5      U l        [        U R                  R                  U R                  R                  5      U l        g )NÚspeech_tokenizer_v1_25hzrO   r   )rH   rh   rï   rð   r    r   r   r   r   r   r   ÚencoderrÝ   r   Ú	quantizer)r9   rï   rð   rJ   s      €r'   rh   ÚS3Tokenizer.__init__9  s§   ø€ Ü‰ÑÔØŒ	ØŒÜ#Ø�K‰K×ÑØ�K‰K×#Ñ#Ø�K‰K×%Ñ%Ø�K‰K×$Ñ$Ø�K‰K×%Ñ%ØÐ3Ó3‰A¸Ø�K‰K× Ñ ó
ˆŒô ,¨D¯K©K×,EÑ,EØ,0¯K©K×,GÑ,GóIˆ�r&   ÚmelÚmel_lenr,   c                 ó$   • U R                  X5      $ r.   )rÊ   )r9   rö   r÷   s      r'   r:   ÚS3Tokenizer.forwardI  s   € Ø�}‰}˜SÓ*Ð*r&   c                 óÀ   • SnX#:„  nUR                  5       (       a  U R                  XUU5      $ U R                  X5      u  pVU R                  R	                  U5      nXv4$ )a0  
Quantize mel spectrogram to tokens, with automatic long audio handling.

Args:
    mel: mel spectrogram tensor, shape (batch_size, n_mels, T)
    mel_len: mel length tensor, shape (batch_size,)

Returns:
    code: quantized tokens, shape (batch_size, T')
    code_len: token length, shape (batch_size,)
i¸  )ÚanyÚ_quantize_mixed_batchró   rô   rÕ   )r9   rö   r÷   Ú
max_framesÚlong_audio_maskÚhiddenÚcode_lenÚcodes           r'   rÊ   ÚS3Tokenizer.quantizeL  sk   € ð ˆ
ð "Ñ.ˆà×Ñ× Ñ à×-Ñ-¨c¸OØ.8ó:ð :ð  $Ÿ|™|¨CÓ9ÑˆFØ—>‘>×(Ñ(¨Ó0ˆDØ�>Ð!r&   rþ   rý   c                 ó†	  • UR                  S5      nSnSnSnSn	X†-  U-  n
X–-  U-  nX«-
  n/ n/ n/ n[        U5       GH¥  nUU   nUU   nUU   R                  5       nU(       d–  USS2SU24   nUR                  5       nUU
:  a  U
U-
  n[        R                  " USU45      nUR                  U5        UR                  [        R                  " UUR                  S95        UR                  USSS	S
.5        M¾  SnSnUU:  a¶  [        UU
-   U5      nUSS2UU24   nUR                  S	5      nUU
:  a  U
U-
  n[        R                  " USU45      nUR                  U5        UR                  [        R                  " UUR                  S95        UR                  USUSS
.5        US	-  nUU-  nUU:  a  M¶  UnU H  nUS   U:X  d  M  US   (       d  M  UUS'   M!     GM¨     U(       d]  [        R                  " US[        R                  UR                  S9[        R                  " U[        R                  UR                  S94$ [        R                  " U5      n[        R                  " U5      nU R                  UU5      u  nnU R                  R                  U5      n 0 n![!        U5       H¿  u  n"nUS   nUS   nUS   nU U"SUU"   R                  5       24   R#                  5       R%                  5       R'                  5       n#U(       d@  [        R                  " U#[        R                  UR                  S9n$U$[)        U#5      4U!U'   M   UU!;  a  / U!U'   U!U   R                  U#5        MÁ     [        U5       H‘  nUU   R                  5       (       d  M  U!U   n%[+        U S5      (       a  U R,                  S:X  a  Sn&OSn&[/        U%U	U&S9n'[        R                  " U'[        R                  UR                  S9n(U([)        U'5      4U!U'   M“     [1        S U!R3                  5        5       5      n)[        R                  " UU)[        R                  UR                  S9n*[        R                  " U[        R                  UR                  S9n+U!R5                  5        H  u  nu  n$nU$U*USU24'   UU+U'   M     U*U+4$ )a¯  
Handle mixed batch with both short and long audio using unified batch processing.

Args:
    mel: mel spectrogram tensor, shape (batch_size, n_mels, T)
    mel_len: mel length tensor, shape (batch_size,)
    long_audio_mask: boolean mask for long audio, shape (batch_size,)
    max_frames: maximum frames for short audio

Returns:
    code: quantized tokens, shape (batch_size, T')
    code_len: token length, shape (batch_size,)
r   i€>  é    é   r“   N)ÚdeviceFr   )Ú	batch_idxÚis_long_audioÚsegment_idxÚtotal_segmentsTr  r  r
  )r7   r  r	  rï   Úspeech_tokenizer_v1é2   é   )ÚoverlapÚ
token_ratec              3   ó*   #   • U  H	  oS    v •  M     g7f)r   Nr   )Ú.0Ú	code_infos     r'   Ú	<genexpr>Ú4S3Tokenizer._quantize_mixed_batch.<locals>.<genexpr>
  s   é € ÐJÒ9I¨I Qž<Ò9Iùs   ‚)rˆ   r­   Úitemr/   ÚpadÚappendrT   Útensorr  Úminr¼   ÚlongÚstackró   rô   rÕ   Ú	enumerateÚcpuÚnumpyÚtolistÚlenÚhasattrrï   r   rÆ   ÚvaluesÚitems),r9   rö   r÷   rþ   rý   Ú
batch_sizeÚsample_rateÚ
hop_lengthÚwindow_sizer  Úframes_per_windowÚframes_per_overlapÚframes_per_strideÚall_segmentsÚall_segments_lenÚsegment_infor  Ú	audio_melÚaudio_mel_lenr  ÚsegmentÚseg_lenÚpad_sizeÚstartr	  Úendr
  ÚinfoÚunified_batch_melÚunified_batch_lensrÿ   r   ÚcodesÚresultsÚseg_idxÚsegment_codeÚcode_tensorÚaudio_codesr  Úmerged_codesÚmerged_codes_tensorÚmax_code_lenÚoutput_codesÚoutput_codes_lens,                                               r'   rü   Ú!S3Tokenizer._quantize_mixed_batchj  sý  € ð" —X‘X˜a“[ˆ
ð ˆØˆ
ØˆØˆð (Ñ5¸ÑCÐØ$Ñ2°jÑ@ÐØ-ÑBÐð ˆØÐð
ˆô ˜z×*ˆIØ˜I™ˆIØ# IÑ.ˆMØ+¨IÑ6×;Ñ;Ó=ˆMæ à#¢A ~¨ ~Ð$5Ñ6�Ø'×,Ñ,Ó.�ð Ð.Ó.Ø0°7Ñ:�HÜŸeše G¨a°¨]Ó;�Gà×#Ñ# GÔ,Ø ×'Ñ'Ü—L’L °·±Ñ<ô>à×#Ñ#Ø!*Ø%*Ø#$Ø&'ñ	%ö ð �Ø�Ø˜mÓ+Ü˜eÐ&7Ñ7¸ÓG�CØ'ª¨5°¨9¨Ñ5�Gà%Ÿl™l¨1›o�GàÐ!2Ó2Ø#4°wÑ#>˜Ü"#§%¢%¨°!°X°Ó"?˜à ×'Ñ'¨Ô0Ø$×+Ñ+ÜŸš W°S·Z±ZÑ@ôBà ×'Ñ'Ø%.Ø)-Ø'2Ø*.ñ	)ô ð   1Ñ$�KØÐ.Ñ.�Eð+ ˜mÕ+ð0 "-�Û(�DØ˜KÑ(¨IÕ5¸$¸×:OÑ:OØ1?˜Ð-Ó.ô )ñk +ör ä—;’;˜zØ Ü%*§Z¡ZØ&)§j¡jñ2ô 49·;²;Ø#-Ü).¯©Ø*-¯*©*ñ46ð6ð 6ô "ŸKšK¨Ó5ÐÜ"Ÿ[š[Ð)9Ó:Ðð  Ÿ<™<Ð(9Ð;MÓNÑˆ�Ø—‘×%Ñ% fÓ-ˆð ˆä& |Ö4‰MˆG�TØ˜[Ñ)ˆIØ  Ñ1ˆMØ˜}Ñ-ˆKð !ØÐ2˜( 7Ñ+×0Ñ0Ó2Ð2Ð2ñ4ß47±C³E¿%¹%»'Ç&Á&Ã(ð ö !ä#Ÿlšl¨<Ü16·±Ø25·*±*ñ>�ð '2´3°|Ó3DÐ%E�˜	Ó"ð  GÓ+Ø)+�G˜IÑ&Ø˜	Ñ"×)Ñ)¨,Ö7ñ' 5ô, ˜zÖ*ˆIØ˜yÑ)×.Ñ.×0Ó0à% iÑ0�ô ˜4Ø!÷#ñ #Ø'+§y¡yÐ4IÓ'IØ!#‘Jà!#�Jä7¸Ø@GØCMñ O�ô
 ',§l¢l°<Ü9>¿¹Ø:=¿*¹*ñ'FÐ#ð ':¼3¸|Ó;LÐ%M�˜	Ó"ñ) +ô. ÑJ¸¿¹Ô9IÓJÓJˆä—{’{ :Ø#/Ü).¯©Ø*-¯*©*ñ6ˆô !Ÿ;š; zÜ-2¯Z©ZØ.1¯j©jñ:Ðð 3:·-±-¶/Ñ.ˆIÑ.˜ XØ1<ˆL˜ I X IÐ-Ñ.Ø*2Ð˜YÓ'ñ 3Bð Ð-Ð-Ð-r&   c                 óH   • [        U R                  5       5      R                  $ r.   )ÚnextÚ
parametersr  râ   s    r'   r  ÚS3Tokenizer.device  s   € ä�D—O‘OÓ%Ó&×-Ñ-Ð-r&   Ú	onnx_pathc                 ó>   • [        US S5      nU R                  USS9  g )NFT©Ústrict)r   Úload_state_dict)r9   rH  Úckpts      r'   Úinit_from_onnxÚS3Tokenizer.init_from_onnx  s#   € Ü˜) T¨5Ó1ˆØ×Ñ˜T¨$ÐÒ/r&   Ú	ckpt_pathc                 óP   • [         R                  " USSS9nU R                  USS9  g )Nr  T)Úmap_locationÚmmaprJ  )rT   ÚloadrL  )r9   rP  rM  s      r'   Úinit_from_ptÚS3Tokenizer.init_from_pt"  s'   € Ü�zŠz˜)°%¸dÑCˆØ×Ñ˜T¨$ÐÒ/r&   c                 óD   • U R                  5        H  u  pSUl        M     g )NF)Únamed_parametersÚrequires_grad)r9   r‰   Úparams      r'   ÚfreezeÚS3Tokenizer.freeze&  s   € Ø×-Ñ-Ö/‰HˆAØ"'ˆEÖò 0r&   )rð   ró   rï   rô   )r   r   r    r!   rÚ   r   Ústrrh   r	   r   r:   rT   rÛ   rÊ   r"   rü   rì   r  rN  rU  r[  r%   rL   rM   s   @r'   rî   rî   3  s  ø† ññ
 9D»ñ I˜Sð I¨+÷ Ið Ið +˜6ð +¨Fð +°u¸VÀV¸^Ñ7Lô +ð ×ÒÓð"˜Fð "¨Vð "¸¸fÀf¸nÑ8Mó "ó ð"ð: ×ÒÓðm.¨ð m.¸&ð m.Ø/5ðm.à*-ðm.à27¸À¸Ñ2Góm.ó ðm.ð^ ñ.ó ð.ð0¨ô 0ð0 cô 0÷(ð (r&   rî   )i'  )"rÚ   Údataclassesr   Útypingr   r   r   r  rR   rT   Útorch.nn.functionalr
   r�   r/   Úeinopsr   r	   Úutilsr   r   r   r   r   r)   r>   rE   ra   ÚModulerc   r�   r    r·   rÝ   rî   r   r&   r'   Ú<module>rd     sã   ðñõ "ß ,Ñ ,ã Û ß Ð Ý ß ç XÓ Xð ÷ð ó ðô	�—‘ô 	ô
ˆR�Y‰Yô 
ôOˆR�Y‰Yô OôNô: ˜Ÿ™ô : ôz˜RŸY™Yô ô.6�2—9‘9ô 6ôr1˜Ÿ	™	ô 1ôh˜Ÿ™ô ô<u(�"—)‘)õ u(r&   