ó
    ð“,jP  ã                   ó@  • S r SSK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rSSKJs  Jr  SSKrSSKJr  S\4S jrS!S\S	\S
\4S jjr  S!S\S	\S
\4S jjrS"S\S\4S jjr\" SS9S\S\R6                  4S j5       r   S#S\\\	R:                  \R6                  4   S\S\S\\\\R<                  4      4S jjrS$S\R6                  S\S\R6                  4S jjr S\R6                  S\RB                  S\R6                  4S jr"S\\R6                     4S jr#S  r$g)%zúModified from https://github.com/openai/whisper/blob/main/whisper/audio.py
Add rename_weights() & onnx2torch() & make_non_pad_mask() & mask_to_bias()
Copy merge_tokenized_segments() from https://github.com/Mddct/s3tokenizer-long/blob/main/example.py
é    N)Ú	lru_cache)ÚListÚOptionalÚUnion)Úpad_sequenceÚweights_dictc                 óÈ  • 0 nU R                  5        HË  nSU;   a  US:X  a	  X   US'   M  SU;   a  X   X'   M&  M(  SU;   a  X   X'   M6  SU;   a  X   X'   MD  SU;   d   eUSS	 R                  S
S5      R                  SS5      R                  SS5      R                  SS5      R                  SS5      R                  SS5      R                  SS5      nX   USU 3'   MÍ     U$ )zÍ
Rename onnx weights to pytorch format.

Parameters
----------
weight_dict: dict
    The dict containing weights in onnx format

Returns
-------
A new weight dict containing the weights in pytorch format.
Ú	quantizerz,/quantizer/rq/model/layers.0/_codebook/Pow_1zquantizer._codebook.embedÚproject_downÚpositional_embeddingÚconvÚblocksé   NÚ/Ú.ÚMatMulÚweightÚAdd_1ÚbiasÚMulÚAddzmlp.mlpÚmlpzfsmn_block.Convúfsmn_block.weightúencoder.)ÚkeysÚreplace)r   Únew_weight_dictÚkÚnew_ks       ÚŸC:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\s3tokenizer/utils.pyÚ_rename_weightsr!       s  € ð €OØ×ÑÖ ˆØ˜!ÓØÐBÓBØ?K¹�Ð ;Ó<Ø 1Ó$Ø%1¡_�Ó"ñ %à# qÓ(Ø!-¡ˆOÓØ�q‹[Ø!-¡ˆOÓà˜q“=Ð �=Ø�q�r�U—]‘] 3¨Ó,×4Ñ4Ø˜(ó$ß$+¡G¨G°VÓ$<¿W¹WØ˜8ó>%ß%,¡W¨U°FÓ%;¿G¹GØ! 5ó=*ß+2©7Ð3DØ3Fó,Hð ð 3?±/ˆO˜h u gÐ.Ó/ñ% !ð& Ðó    Ú	onnx_pathÚ
torch_pathÚverbosec                 ó  • [         R                  " U 5      n0 nUR                  R                   Vs0 s H  nUR                  U_M     nnUR                  R
                   GH  nUR                   GH  nX†;   d  M  Su  pšXh   nUS;   a  SnOyUS;   a  SnOpUS;   a  SnOgUS;   a  S	nO^US
:X  a  SnOUUS:X  a  SnOLUS:X  a  SnOCUR                  S:X  a'  UR                  R                  SS5      nUS-   n
US-   n	OUR                  nU
bÞ  U	bÛ  UR                  nUS   nUS   nXæ;   a/  [         R                  R                  Xn   5      R                  5       OSnXö;   a/  [         R                  R                  Xo   5      R                  5       OSnSUR                  l        SUR                  l        [        R                  " U5      n[        R                  " U5      nUXI'   UXJ'   GMv  [         R                  R                  U5      R                  5       nSUR                  l        [        R                  " U5      n[!        UR"                  5      S:”  d  WS;   a  UUW'   GMñ  UR%                  5       XK'   GM     GM     ['        U5      nU(       aO  UR)                  5        H-  u  nn[+        U SUR"                   SUR,                   35        M/     [+        SU 35        AAU(       a  [        R.                  " UU5        gU$ s  snf )a›  
Open an onnx file and convert to pytorch format.

Parameters
----------
onnx_path: str
    The onnx file to open, typically `speech_tokenizer_v1.onnx`

torch_path: str
    The path to save the torch-formated checkpoint.

verbose: bool
    Logging info or not.

Returns
-------
A checkpoint dict containing the weights and their names, if torch_path is
None. Otherwise save checkpoint dict to the desired path.
)NN)zonnx::Conv_1519zencoders.conv1.weightzonnx::Conv_2216úencoder.conv1.weight)zonnx::Conv_1520zencoders.conv1.biaszonnx::Conv_2217úencoder.conv1.bias)zonnx::Conv_1521zencoders.conv2.weightzonnx::Conv_2218úencoder.conv2.weight)zonnx::Conv_1522zencoders.conv2.biaszonnx::Conv_2219úencoder.conv2.biaszencoders.positional_embeddingúencoder.positional_embeddingúquantizer.project_in.biasú%quantizer._codebook.project_down.biaszonnx::MatMul_2536ú'quantizer._codebook.project_down.weightÚLayerNormalizationz/LayerNormalizationÚ z.weightz.biasNr   é   T)r+   ú : Ú úPyTorch weights saved to )ÚonnxÚloadÚgraphÚinitializerÚnameÚnodeÚinputÚop_typer   Únumpy_helperÚto_arrayÚcopyÚflagsÚ	writeableÚtorchÚ
from_numpyÚlenÚshapeÚtr!   ÚitemsÚprintÚdtypeÚsave)r#   r$   r%   Ú
onnx_modelr   r8   Úinitializer_mapr:   Ú
input_nameÚln_bias_nameÚln_weight_nameÚweight_nameÚln_nameÚ	ln_inputsÚ
scale_nameÚ	bias_nameÚscaler   Úweight_tensorÚbias_tensorÚweight_arrayÚnew_weights_dictr   Úvs                           r    Ú
onnx2torchr[   D   s  € ô( —’˜9Ó%€JØ€Lð &×+Ñ+×7Ò7óâ7ˆKð 	×Ñ˜+Ò%Ù7ð ð ð × Ñ ×%Õ%ˆØŸ*�*ˆJØÕ,Ø/9Ñ,�Ø-Ñ9�Øð "ó ð
 #9‘KØð $ó ð
 #7‘KØð $ó ð
 #9‘KØð $ó ð
 #7‘KØÐ#BÓBØ"@‘KØÐ#>Ó>Ø"I‘KØÐ#6Ó6Ø"K‘Kà—|‘|Ð';Ó;Ø"&§)¡)×"3Ñ"3Ð4IÈ2Ó"N˜Ø)0°9Ñ)<˜Ø'.°Ñ'8™à&*§i¡i˜Ø!Ñ-°,Ñ2JØ $§
¡
�IØ!*¨1¡�JØ )¨!¡�Ið (Ó:ô !×-Ñ-×6Ñ6Ø'Ñ3ó5ß59±Tô 6Ø@Dð ð
 'Ó9ô  ×,Ñ,×5Ñ5Ø'Ñ2ó4ß48±Dô 5Ø?Cð ð -1�E—K‘KÔ)Ø+/�D—J‘JÔ(Ü$)×$4Ò$4°UÓ$;�MÜ"'×"2Ò"2°4Ó"8�Kà1<�LÑ.Ø3@�LÔ0ä#'×#4Ñ#4×#=Ñ#=Ø#ó$%ß%)¡T£Vð !à37�L×&Ñ&Ô0Ü$)×$4Ò$4°\Ó$B�MÜ˜=×.Ñ.Ó/°!Ó3°{ð Gó 8ð 5B˜ [Ô1à4A·O±OÓ4E˜Ô1ôI %ñ &ôN ' |Ó4ÐÞØ$×*Ñ*Ö,‰DˆAˆqÜ�Q�C�s˜1Ÿ7™7˜) 1 Q§W¡W IÐ.Ö/ñ -äÐ)¨*¨Ð6Ô7Ø�jÞÜ�
Š
Ð# ZÕ0àÐùòis   ±Lc                 óx	  ^^^• [         R                  " U 5      n0 nUR                  R                   Vs0 s H  nUR                  U_M     snm0 mUR                  R
                   Hs  nUR                  S:X  d  M  UR                   HN  nUR                  S:X  d  M  [         R                  R                  UR                  5      TUR                  S   '   MP     Mu     SBUU4S jjmU4S jnUR                  R
                   GH{  nUR                  n	UR                  n
UR                  nU	S:X  a-  T" US   5      US'   [        U5      S	:”  a  T" US	   5      US
'   GOU	S:X  a-  T" US   5      US'   [        U5      S	:”  a  T" US	   5      US'   GOäU	R                  S5      (       GaÍ  U	R                  S5      nUS   nUR                  S5      S   nSU 3nSU	;   a  U
S:X  a  T" US   5      XO S3'   GO€SU	;   a.  U
S:X  a(  U" U5      nUb  UR!                  5       S:”  a  UXO S3'   GOLSU	;   a  U
S:X  a  T" US   5      XO S3'   GO.SU	;   a-  U
S:X  a'  U" U5      nUb  UR!                  5       S:”  a  UXO S3'   OûSU	;   a  T" US   SS9XO S 3'   OåS!U	;   a  U" U5      XO S"3'   OÑS#U	;   a  T" US   SS9XO S$3'   O»S%U	;   a  U" U5      XO S&3'   O§S'U	;   a  T" US   SS9XO S(3'   O‘S)U	;   a  U" U5      XO S*3'   O}S+U	;   a  T" US   SS9XO S,3'   OgS-U	;   a  U" U5      XO S.3'   OSS/U	;   a  T" US   SS9XO S03'   O=S1U	;   a  U" U5      XO S23'   O)S3U	;   a  T" US   SS9XO S43'   OS5U	;   a  U" U5      XO S63'   S7U	;   d  GM{  GM~     T H*  nS8U;   a  T" U5      US9U 3'   S:U;   d  M  T" U5      US;'   M,     UR                  R
                   H>  nS<UR                  ;   d  M  S=UR                  ;   d  M'  T" UR                  S   SS9US>'   M@     UR#                  5        VVs0 s H  u  nnUc  M  UU_M     nnnU(       aT  UR#                  5        H2  u  nnUc  M  [%        U S?UR&                   S@UR(                   35        M4     [%        SAU 35        AU(       a  [*        R,                  " XA5        gU$ s  snf s  snnf )Cz$
Convert V3 ONNX to PyTorch format.
ÚConstantÚvaluer   c                 ó&  >• U T;   a1  [         R                  R                  TU    5      R                  5       nOU T;   a  TU    R                  5       nOg [        R
                  " U5      nU(       a   UR                  S:X  a  UR                  5       nU$ )Nr1   )r5   r=   r>   r?   rB   rC   ÚndimrF   )r9   Ú	transposeÚarrrF   Úconstant_maprL   s       €€r    Ú
get_tensorÚ!onnx2torch_v3.<locals>.get_tensorÈ   sz   ø€ Ø�?Ó"Ü×#Ñ#×,Ñ,¨_¸TÑ-BÓC×HÑHÓJ‰CØ�\Ó!Ø˜tÑ$×)Ñ)Ó+‰Càä×Ò˜SÓ!ˆÞ˜Ÿ™ 1›Ø—‘“ˆAØˆr"   c                 óJ   >• U R                    H  nT" U5      nUc  M  Us  $    g)z_Helper to find bias tensor for an Add node.
Checks both inputs to see which one is a parameter.N)r;   )r:   ÚinprF   rd   s      €r    Úget_bias_tensorÚ&onnx2torch_v3.<locals>.get_bias_tensorÕ   s+   ø€ ð —:”:ˆCÙ˜3“ˆAØ‹}Ø’ñ ð r"   z/conv1/Convr   r'   r1   r(   z/conv2/Convr)   r*   z/blocks.r   r   zencoder.blocks.zattn_ln/Mulr   z.attn_ln.weightzattn_ln/Addr   Nz.attn_ln.biasz
mlp_ln/Mulz.mlp_ln.weightz
mlp_ln/Addz.mlp_ln.biaszattn/query/MatMulT)ra   z.attn.query.weightzattn/query/Addz.attn.query.biaszattn/key/MatMulz.attn.key.weightzattn/key/Addz.attn.key.biaszattn/value/MatMulz.attn.value.weightzattn/value/Addz.attn.value.biaszattn/out/MatMulz.attn.out.weightzattn/out/Addz.attn.out.biaszmlp/mlp.0/MatMulz.mlp.0.weightzmlp/mlp.0/Addz.mlp.0.biaszmlp/mlp.2/MatMulz.mlp.2.weightzmlp/mlp.2/Addz.mlp.2.biaszfsmn_block/Convr   r   r,   r-   r
   r   r.   r2   r3   r4   )F)r5   r6   r7   r8   r9   r:   r<   Ú	attributer=   r>   rF   Úoutputr;   rD   Ú
startswithÚsplitÚnumelrG   rH   rE   rI   rB   rJ   )r#   r$   r%   rK   r   r8   r:   Úattrrh   r9   ÚopÚinputsÚpartsÚ
block_partÚ	block_idxÚprefixrF   Ú	init_namer   rZ   rc   rd   rL   s                       @@@r    Úonnx2torch_v3rw   ±   sk  ú€ ô —’˜9Ó%€JØ€Lð &×+Ñ+×7Ò7óâ7ˆKð 	×Ñ˜+Ò%Ù7ñ€Oð €LØ× Ñ ×%Ô%ˆØ�<‰<˜:Õ%ØŸœ�Ø—9‘9 Õ'Ü37×3DÑ3D×3MÑ3MØŸ™ó4 �L §¡¨Q¡Ó0ó 'ñ &÷ð õð × Ñ ×%Õ%ˆØ�y‰yˆØ�\‰\ˆØ—‘ˆð �=Ó Ù3=¸fÀQ¹iÓ3HˆLÐ/Ñ0Ü�6‹{˜Q‹Ù5?ÀÀqÁ	Ó5J�Ð1Ñ2ùØ�]Ó"Ù3=¸fÀQ¹iÓ3HˆLÐ/Ñ0Ü�6‹{˜Q‹Ù5?ÀÀqÁ	Ó5J�Ð1Ñ2ùð �_‰_˜Z×(Ò(à—J‘J˜s“OˆEØ˜q™ˆJØ"×(Ñ(¨Ó-¨aÑ0ˆIØ& y kÐ2ˆFð  Ó$¨¨u«Ù;EØ˜1‘Ió<�˜x Ð7Ó8à $Ó&¨2°«;Ù# DÓ)�Ø‘= Q§W¡W£Y°£]Ø=>�L 8¨=Ð!9Ñ:ùØ Ó%¨"°«+Ù:DÀVÈAÁYÓ:O�˜x ~Ð6Ó7Ø Ó%¨"°«+Ù# DÓ)�Ø‘= Q§W¡W£Y°£]Ø<=�L 8¨<Ð!8Ñ9øð %¨Ó,Ù>HØ˜1‘I¨ñ?/�˜xÐ'9Ð:Ò;à! TÓ)Ù<KØó=�˜xÐ'7Ð8Ò9ð # dÓ*Ù<FØ˜1‘I¨ñ=/�˜xÐ'7Ð8Ò9à 4Ó'Ù:IÈ$Ó:O�˜x ~Ð6Ò7ð %¨Ó,Ù>HØ˜1‘I¨ñ?/�˜xÐ'9Ð:Ò;à! TÓ)Ù<KØó=�˜xÐ'7Ð8Ò9ð # dÓ*Ù<FØ˜1‘I¨ñ=/�˜xÐ'7Ð8Ò9à 4Ó'Ù:IÈ$Ó:O�˜x ~Ð6Ò7ð $ tÓ+Ù9CØ˜1‘I¨ñ:/�˜x }Ð5Ò6à  DÓ(Ù7FÀtÓ7L�˜x {Ð3Ò4Ø# tÓ+Ù9CØ˜1‘I¨ñ:/�˜x }Ð5Ò6à  DÓ(Ù7FÀtÓ7L�˜x {Ð3Ñ4ð  Ö$Úñi &ón %ˆ	Ø )Ó+Ù3=¸iÓ3HˆL˜8 I ;Ð/Ñ0à&¨)Õ3ÙDNØóEˆLÐ@ÓAñ %ð × Ñ ×%Ô%ˆØ˜$Ÿ)™)Õ#¨°D·L±LÕ(@ñ >HØ—J‘J˜q‘M¨Tñ>3ð Ø9ó;ñ &ð &2×%7Ñ%7Ô%9ÔKÒ%9™T˜Q ¸Q“D�A�q’DÑ%9€LÑKæØ ×&Ñ&Ö(‰DˆAˆqØ‹}Ü˜˜˜3˜qŸw™w˜i q¨¯©¨	Ð2Ö3ñ )ô 	Ð)¨*¨Ð6Ô7àÞÜ�
Š
�<Õ,àÐùòuùó\ Ls   ´R1Ð
R6Ð+R6ÚfileÚsrc                 ó”   • [         R                  " U 5      u  p#X1:w  a%  [         R                  R                  X15      " U5      nUS   nU$ )a  
Open an audio file and read as mono waveform, resampling as necessary

Parameters
----------
file: str
    The audio file to open

sr: int
    The sample rate to resample the audio if necessary

Returns
-------
A torch.Tensor containing the audio waveform, in float32 dtype.
r   )Ú
torchaudior6   Ú
transformsÚResample)rx   ry   ÚaudioÚsample_rates       r    Ú
load_audior€   V  sD   € ô  $Ÿš¨Ó.Ñ€EØÓÜ×%Ñ%×.Ñ.¨{Ô?ÀÓFˆØ�!‰H€EØ€Lr"   )ÚmaxsizeÚn_melsÚreturnc                 ó\  • US;   d
   SU 35       e[         R                  R                  [         R                  R                  [        5      SS5      n[
        R                  " USS9 n[        R                  " USU 3   5      R                  U 5      sSSS5        $ ! , (       d  f       g= f)	aD  
load the mel filterbank matrix for projecting STFT into a Mel spectrogram.
Allows decoupling librosa dependency; saved using:

    np.savez_compressed(
        "mel_filters.npz",
        mel_80=librosa.filters.mel(sr=16000, n_fft=400, n_mels=80),
        mel_128=librosa.filters.mel(sr=16000, n_fft=400, n_mels=128),
    )
>   éP   é€   zUnsupported n_mels: Úassetszmel_filters.npzF)Úallow_pickleÚmel_N)
ÚosÚpathÚjoinÚdirnameÚ__file__Únpr6   rB   rC   Úto)Údevicer‚   Úfilters_pathÚfs       r    Ú_mel_filtersr”   m  s…   € ð �YÓÐ?Ð"6°v°hÐ ?Ó?Ðä—7‘7—<‘<¤§¡§¡´Ó 9¸8Ø 1ó3€Lä	�Š�¨EÒ	2°aÜ×Ò  D¨¨ /Ñ 2Ó3×6Ñ6°vÓ>÷ 
3×	2×	2ús   Á(+BÂ
B+r~   Úpaddingr‘   c                 ó|  • [         R                  " U 5      (       d   [        U [        5      (       a  [	        U 5      n Ub  U R                  U5      n US:”  a  [        R                  " U SU45      n [         R                  " S5      R                  U R                  5      n[         R                  " U SSUSS9nUSSS24   R                  5       S	-  n[        U R                  U5      nXv-  n[         R                  " US
S9R                  5       n	[         R                  " X™R!                  5       S-
  5      n	U	S-   S-  n	U	$ )a5  
Compute the log-Mel spectrogram of

Parameters
----------
audio: Union[str, np.ndarray, torch.Tensor], shape = (*)
    The path to audio or either a NumPy array or Tensor containing the
    audio waveform in 16 kHz

n_mels: int
    The number of Mel-frequency filters, only 80 is supported

padding: int
    Number of zero samples to pad to the right

device: Optional[Union[str, torch.device]]
    If given, the audio tensor is moved to this device before STFT

Returns
-------
torch.Tensor, shape = (128, n_frames)
    A Tensor that contains the Mel spectrogram
Nr   i�  é    T)ÚwindowÚreturn_complex.éÿÿÿÿr1   g»½×Ùß|Û=)Úming       @g      @)rB   Ú	is_tensorÚ
isinstanceÚstrr€   r�   ÚFÚpadÚhann_windowr‘   ÚstftÚabsr”   ÚclampÚlog10ÚmaximumÚmax)
r~   r‚   r•   r‘   r˜   r¢   Ú
magnitudesÚfiltersÚmel_specÚlog_specs
             r    Úlog_mel_spectrogramr¬   �  s
  € ô: �?Š?˜5×!Ñ!Ü�eœS×!Ñ!Ü˜uÓ%ˆEàÑØ—‘˜Ó ˆØ�ƒ{Ü—’�e˜a ˜\Ó*ˆÜ×Ò˜sÓ#×&Ñ& u§|¡|Ó4€FÜ�:Š:�e˜S #¨fÀTÑJ€DØ�c˜3˜B˜3�h‘×#Ñ#Ó% qÑ(€Jä˜5Ÿ<™<¨Ó0€GØÑ#€Hä�{Š{˜8¨Ñ/×5Ñ5Ó7€HÜ�}Š}˜X§|¡|£~¸Ñ';Ó<€HØ˜3‘ #Ñ%€HØ€Or"   ÚlengthsÚmax_lenc                 ó>  • U R                  S5      nUS:”  a  UOU R                  5       R                  5       n[        R                  " SU[        R
                  U R                  S9nUR                  S5      R                  X!5      nU R                  S5      nXE:¬  nU) $ )a  Make mask tensor containing indices of non-padded part.

The sequences in a batch may have different lengths. To enable
batch computing, padding is need to make all sequence in same
size. To avoid the padding part pass value to context dependent
block such as attention or convolution , this padding part is
masked.

1 for non-padded part and 0 for padded part.

Parameters
----------
    lengths (torch.Tensor): Batch of lengths (B,).

Returns:
-------
    torch.Tensor: Mask tensor containing indices of padded part (B, max_T).

Examples:
    >>> import torch
    >>> import s3tokenizer
    >>> lengths = torch.tensor([5, 3, 2])
    >>> masks = s3tokenizer.make_non_pad_mask(lengths)
    masks = [[1, 1, 1, 1, 1],
             [1, 1, 1, 0, 0],
             [1, 1, 0, 0, 0]]
r   )rI   r‘   rš   )	Úsizer§   ÚitemrB   ÚarangeÚint64r‘   Ú	unsqueezeÚexpand)r­   r®   Ú
batch_sizeÚ	seq_rangeÚseq_range_expandÚseq_length_expandÚmasks          r    Úmake_non_pad_maskr»   ³  sŒ   € ð8 —‘˜a“€JØ  1›‰g¨'¯+©+«-×*<Ñ*<Ó*>€GÜ—’˜QØ$Ü#(§;¡;Ø$+§N¡Nñ4€Ið !×*Ñ*¨1Ó-×4Ñ4°ZÓIÐØ×)Ñ)¨"Ó-ÐØÑ0€DØˆ5€Lr"   rº   rI   c                 óâ   • U R                   [        R                  :X  d   eU[        R                  [        R                  [        R
                  4;   d   eU R                  U5      n SU -
  S-  n U $ )a  Convert bool-tensor to float-tensor for flash attention.

Parameters
----------
    lengths (torch.Tensor): Batch of lengths (B, ?).

Returns:
-------
    torch.Tensor: Mask tensor containing indices of padded part (B, ?).

Examples:
    >>> import torch
    >>> import s3tokenizer
    >>> lengths = torch.tensor([5, 3, 2])
    >>> masks = s3tokenizer.make_non_pad_mask(lengths)
    masks = [[1, 1, 1, 1, 1],
             [1, 1, 1, 0, 0],
             [1, 1, 0, 0, 0]]
    >>> new_masks = s3tokenizer.mask_to_bias(masks, torch.float32)
    new_masks =
        [[-0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00, -0.0000e+00],
         [-0.0000e+00, -0.0000e+00, -0.0000e+00, -1.0000e+10, -1.0000e+10],
         [-0.0000e+00, -0.0000e+00, -1.0000e+10, -1.0000e+10, -1.0000e+10]]
g      ð?g    _ Â)rI   rB   ÚboolÚfloat32Úbfloat16Úfloat16r�   )rº   rI   s     r    Úmask_to_biasrÁ   Û  s]   € ð2 �:‰:œŸ™Ó#Ð#Ð#Ø”U—]‘]¤E§N¡N´E·M±MÐBÓBÐBÐBØ�7‰7�5‹>€Dð
 �$‰J˜(Ñ"€DØ€Kr"   Údatac                 óH  • U n[        U[        5      (       d   e[        R                  " U Vs/ s H  o"R	                  S5      PM     sn[        R
                  S9nU Vs/ s H  o"R                  5       PM     nn[        USSS9nUR                  SS5      U4$ s  snf s  snf )z¨Padding the data into batch data

Parameters
----------
    data: List[Tensor], shape of Tensor (128, T)

Returns:
-------
    feats [B, 128, T_max], feats lengths [B]
r   )rI   Tr   )Úbatch_firstÚpadding_valuer1   )	r�   ÚlistrB   Útensorr°   Úint32rF   r   ra   )rÂ   ÚsampleÚsÚfeats_lengthsÚfeatsÚpadded_featss         r    r•   r•   ÿ  sŽ   € ð €FÜ�fœd×#Ñ#Ð#Ð#Ü—L’L±VÓ!<²V°§&¡&¨¦)±VÑ!<Ü',§{¡{ñ4€Má"Ó#šF�q�S‰SŽU™F€EÐ#Ü °4ÀqÑI€Là×!Ñ! ! QÓ'¨Ð6Ð6ùò "=ùâ#s   ®BÁ Bc                 ó¼   • / nUS-  U-  n[        U 5       HB  u  pVUS:X  a  SOUnU[        U 5      S-
  :w  a  U* O
[        U5      nUR                  XgU 5        MD     U$ )aP  
Merges tokenized outputs by keeping the middle and dropping half of the overlapped tokens.

Args:
- tokenized_segments (List[List[int]]): List of tokenized sequences.
- overlap (int): Overlapping duration in seconds (default: 4s).
- token_rate (int): Number of tokens per second.

Returns:
- List[int]: A single merged token sequence.
r1   r   r   )Ú	enumeraterD   Úextend)	Útokenized_segmentsÚoverlapÚ
token_rateÚmerged_tokensÚoverlap_tokensÚiÚtokensÚlÚrs	            r    Úmerge_tokenized_segmentsrÚ     s   € ð €MàØ	ñ	
Øñ€Nô Ð1Ö2‰	ˆØ�a“‰A˜^ˆØ ¤CÐ(:Ó$;¸aÑ$?Ó?ˆ^‰OÄSØóFˆð 	×Ñ˜V a˜[Ö)ñ 3ð Ðr"   )NF)i€>  )r†   r   N)r   )%Ú__doc__rŠ   Ú	functoolsr   Útypingr   r   r   Únumpyr�   r5   rB   Útorch.nn.functionalÚnnÚ
functionalrŸ   r{   Útorch.nn.utils.rnnr   Údictr!   rž   r½   r[   rw   Úintr€   ÚTensorr”   Úndarrayr‘   r¬   r»   rI   rÁ   r•   rÚ   © r"   r    Ú<module>rè      s€  ðñó
 
Ý ß (Ñ (ã Û Û ß Ð Û Ý +ð! $ô !ñHj ˜#ð j ¨3ð j Àõ j ð\ %)Ø"'ñb˜Sð bØ!ðbàõbñJ�Sð ˜cõ ñ. �4Ñð? ð ?¨¯©ó ?ó ð?ð* ØØ15ñ	/Ø��b—j‘j %§,¡,Ð.Ñ/ð/àð/ð ð/ð �U˜3 §¡Ð,Ñ-Ñ.õ	/ñd%˜uŸ|™|ð %°cð %À%Ç,Á,õ %ðP!�u—|‘|ð !¨E¯K©Kð !¸E¿L¹Lô !ðH7�$�u—|‘|Ñ$ô 7ó*r"   