Ë
    ÛÓ^jg3  ã                   óÖ   — d dl ZddlmZmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZmZmZ  e«       rd dlZ ej$                  e«      Z G d„ d	ed
¬«      Ze G d„ de	«      «       ZdgZy)é    Né   )Ú
AudioInputÚ make_list_of_audio_chat_template)ÚBatchFeature)ÚProcessingKwargsÚProcessorMixinÚUnpack)Ú	TextInput)Úauto_docstringÚis_torch_availableÚloggingc                   ó*   — e Zd Zddiddddœdddœd	œZy
)ÚGlmAsrProcessorKwargsÚpaddingTi€>  Ú
max_length)Úsampling_rateÚreturn_attention_maskr   ÚptÚleft)Úreturn_tensorsÚpadding_side)Útext_kwargsÚaudio_kwargsÚcommon_kwargsN)Ú__name__Ú
__module__Ú__qualname__Ú	_defaults© ó    úw/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/glmasr/processing_glmasr.pyr   r   &   s2   „ ð �tð
ð #Ø%)Ø#ñ
ð #Ø"ñ
ñ�Ir    r   F)Útotalc                   ó‚  ‡ — e Zd ZeZ	 	 	 	 dˆ fd„	Ze	 	 ddeee   z  de	dz  de
dz  dee   def
ˆ fd	„«       Z	 	 dde	dz  deee   z  dz  dee   fˆ fd
„Zdd„Zde	fd„Zdededefd„Zedee   fˆ fd„«       Zedee   fd„«       Z	 ddeee   z  e	z  deee   z  dz  dee   defd„Zddœd„Zd„ Zdedefd„Zˆ xZS )ÚGlmAsrProcessorNc                 ó€   •— || _         |j                  |«      | _        || _        || _        t
        ‰| �  |||¬«       y)a‡  
        audio_token (`Optional[str]`, *optional*, defaults to `"<|pad|>`"):
            Special token used to represent audio inputs in the chat template.
        default_transcription_prompt (`str`, *optional*, defaults to `"Please transcribe this audio into text"`):
            Default prompt to use for transcription tasks when applying transcription requests.
        max_audio_len (`int`, *optional*, defaults to 655):
            Maximum length of audio sequences in seconds. Audio longer than this will be truncated.
            655 gives approximately 8192 tokens, corresponding to the maximum sequence length of the text model.
        )Úchat_templateN)Úaudio_tokenÚconvert_tokens_to_idsÚaudio_token_idÚdefault_transcription_promptÚmax_audio_lenÚsuperÚ__init__)ÚselfÚfeature_extractorÚ	tokenizerr&   r'   r*   r+   Ú	__class__s          €r!   r-   zGlmAsrProcessor.__init__;   sE   ø€ ð$ 'ˆÔØ'×=Ñ=¸kÓJˆÔØ,HˆÔ)Ø*ˆÔÜ‰ÑÐ*¨IÀ]ÐÕSr    FÚtextÚaudioÚoutput_labelsÚkwargsÚreturnc                 óJ  •— d|v r*|d   dk7  r"t        | j                  j                  › d�«      ‚|rd|d<   t        ‰| �  d||dœ|¤Ž}|rM|j                  d«      }|d   j                  «       }d	||d
k7  <   d	||| j                  j                  k(  <   ||d<   t        |d¬«      S )a0  
        output_labels (bool, *optional*, default=False):
            Whether to return labels for training.

        Returns:
            [`BatchFeature`]: A dictionary with tokenized text (`input_ids`, `attention_mask`) and
            audio features (`input_features`, `input_features_mask`).
        r   r   z% only supports `return_tensors='pt'`.TÚreturn_mm_token_type_ids©r3   r2   Úmm_token_type_idsÚ	input_idsiœÿÿÿr   Úlabels)ÚdataÚtensor_typer   )
Ú
ValueErrorr1   r   r,   Ú__call__ÚpopÚcloner0   Úpad_token_idr   )	r.   r2   r3   r4   r5   Úmodel_inputsr:   r<   r1   s	           €r!   r@   zGlmAsrProcessor.__call__S   sÇ   ø€ ð" ˜vÑ%¨&Ð1AÑ*BÀdÒ*JÜ §¡× 7Ñ 7Ð8Ð8]Ð^Ó_Ð_áØ15ˆFÐ-Ñ.Ü‘wÑ'ÐI¨e¸$ÑIÀ&ÑIˆáØ ,× 0Ñ 0Ð1DÓ EÐØ! +Ñ.×4Ñ4Ó6ˆFØ-1ˆFÐ$¨Ñ)Ñ*Ø<@ˆF�6˜TŸ^™^×8Ñ8Ñ8Ñ9Ø%+ˆL˜Ñ"Ü ¸4Ô@Ð@r    c                 ó¬   •— t        ‰| �  d||dœ|¤Ž |�?|�<t        |«      t        |«      k7  r$t        dt        |«      › dt        |«      › d�«      ‚y y y )Nr9   zGot z
 text but z audios; they must match 1:1.r   )r,   Úvalidate_inputsÚlenr?   )r.   r3   r2   r5   r1   s       €r!   rF   zGlmAsrProcessor.validate_inputss   se   ø€ ô 	‰ÑÐA e°$ÑA¸&ÒAàÐ Ð 1´c¸$³iÄ3ÀuÃ:Ò6MÜ˜t¤C¨£I ;¨j¼¸U»¸ÐDaÐbÓcÐcð 7NÐ 1Ðr    c                 ód   — d}dD ]  \  }}}|d|z  z   |dz
  z
  dz
  |z  dz   }Œ ||z
  |z  dz   }|S )Né   ))é   r   rJ   )rJ   r   é   rK   rJ   r   )r.   Úaudio_lengthsÚmerge_factorr   Úkernel_sizeÚstrideÚ
num_tokenss          r!   Ú_get_audio_token_lengthz'GlmAsrProcessor._get_audio_token_length~   sc   € ØˆØ,Bò 	`Ñ(ˆG�[ &Ø*¨Q°©[Ñ8¸KÈ!¹OÑLÈqÑPÐU[Ñ[Ð^_Ñ_‰Mð	`ð $ lÑ2°|ÑCÀaÑGˆ
ØÐr    c           
      ó6  — t        |d   | j                  j                  z  «      }t        | j                  | j                  j                  z  «      }g }g }|D ]Ë  }t        |j                  d   «      }t        d||z   dz
  |z  «      }	|	|kD  r<t        j                  d||d   z  d›d| j                  › d| j                  › d�«       |}	|j                  |	«       t        ||	|z  «      }
t        |	«      D ]-  }||z  }t        |dz   |z  |
«      }|j                  ||| «       Œ/ ŒÍ | j                  j                  |«      } | j                  |fi |¤Ž}|j                  d	«      |d
<   t        j                  t        j                  |d
   j!                  d«      |«      D �cg c]  }|j!                  «       ‘Œ c}«      }| j#                  |«      |d<   g }t        t%        |«      «      D ]&  }| j'                  ||¬«      }|j                  |«       Œ( ||fS c c}w )Nr   r   rJ   zAudio duration (z.1fzs) exceeds zs; truncating to first zs.Úattention_maskÚinput_features_maskéÿÿÿÿÚnum_audio_tokens)Ú	audio_idx)Úintr/   Úchunk_lengthr+   ÚshapeÚmaxÚloggerÚwarningÚappendÚminÚrangeÚfetch_audiorA   ÚtorchÚstackÚsplitÚsumrQ   rG   Úreplace_audio_token)r.   r3   r5   Úwindow_sizeÚmax_windowsÚper_sample_windowsÚflat_chunksÚaudio_elÚ	n_samplesÚn_winÚtime_capÚiÚstartÚendÚaudio_inputsÚsrL   Úaudio_replacementsÚidxÚreplacement_texts                       r!   Ú_process_audiozGlmAsrProcessor._process_audio†   sU  € ä˜& Ñ1°D×4JÑ4J×4WÑ4WÑWÓXˆÜ˜$×,Ñ,°×0FÑ0F×0SÑ0SÑSÓTˆà(*ÐØ(*ˆØò 	8ˆHÜ˜HŸN™N¨1Ñ-Ó.ˆIÜ˜˜I¨Ñ3°aÑ7¸KÑGÓHˆEØ�{Ò"Ü—‘Ø& y°6¸/Ñ3JÑ'JÈ3Ð&OÈ{Ð[_×[mÑ[mÐZnð  oFð  GK÷  GYñ  GYð  FZð  Z\ð  ]ôð $�Ø×%Ñ% eÔ,ä˜9 e¨kÑ&9Ó:ˆHÜ˜5“\ò 8�Ø˜K™�Ü˜1˜q™5 KÑ/°Ó:�Ø×"Ñ" 8¨E°#Ð#6Õ7ñ8ð	8ð  ×&Ñ&×2Ñ2°5Ó9ˆØ-�t×-Ñ-¨kÑD¸VÑDˆØ.:×.>Ñ.>Ð?OÓ.PˆÐ*Ñ+ô
 Ÿ™Ü#Ÿk™k¨,Ð7LÑ*M×*QÑ*QÐRTÓ*UÐWiÓjÖk˜ˆQ�U‰U�WÒkó
ˆð ,0×+GÑ+GÈÓ+VˆÐ'Ñ(àÐÜœ˜U›Ó$ò 	8ˆCØ#×7Ñ7¸ÐPSÐ7ÓTÐØ×%Ñ%Ð&6Õ7ð	8ð Ð/Ð/Ð/ùò ls   Æ!Hrr   rW   c                 ó0   — |d   |   }| j                   |z  S )NrV   )r'   )r.   rr   rW   rV   s       r!   rf   z#GlmAsrProcessor.replace_audio_token°   s%   € Ø'Ð(:Ñ;¸IÑFÐØ×ÑÐ"2Ñ2Ð2r    c                 ó    •— t         ‰| �  dgz   S )NrT   )r,   Úmodel_input_names)r.   r1   s    €r!   rz   z!GlmAsrProcessor.model_input_names´   s   ø€ ä‰wÑ(Ð,AÐ+BÑBÐBr    c                 ó   — dgS )zNInput names returned always by subprocessors but not used in model's `forward`rV   r   )r.   s    r!   Úunused_input_namesz"GlmAsrProcessor.unused_input_names¸   s   € ð #Ð#Ð#r    Úpromptc           	      óp  — t        t        |«      «      }t        «       rU|D �cg c]J  }t        |t        j
                  «      r,|j                  «       j                  «       j                  «       n|‘ŒL }}t        |«      }|dk(  rt        d«      ‚|€| j                  g|z  }nµt        |t        «      r|g|z  }nžt        |t         t        f«      r}t        |«      |k7  rt        dt        |«      › d|› d�«      ‚g }|D ]L  }|€|j                  | j                  «       Œ!t        |t        «      r|j                  |«       ŒCt        d«      ‚ nt        d«      ‚t!        ||«      D �	�
cg c](  \  }	}
dt        |
t        «      rd	|
d
œnd	|
dœd|	dœgdœg‘Œ* }}	}
 | j"                  |fddddœ|¤ŽS c c}w c c}
}	w )a	  
        Prepare inputs for automatic speech recognition without manually writing the default transcription prompt.

        Args:
            audio (`str`, `list[str]`, `np.ndarray`, `torch.Tensor`, `list[np.ndarray]`, `list[torch.Tensor]`):
                Audio to transcribe. Strings are interpreted as local paths or URLs and will be loaded automatically by
                the chat template loader; NumPy arrays and PyTorch tensors are forwarded directly.
            prompt (`str` or `list[str]`, *optional*):
                Custom prompt(s) to include in the user turn. A list must be the same length as the batch. When `None`,
                each sample uses `"Transcribe the input speech."`.
            **kwargs:
                Additional keyword arguments forwarded to [`~GlmAsrProcessor.apply_chat_template`] (for example
                `text_kwargs`, `audio_kwargs`, ...).

        Returns:
            [`BatchFeature`]: Processor outputs ready to be passed to [`GlmAsrForConditionalGeneration.generate`].

        r   z)`audio` must contain at least one sample.z	Received z prompt(s) for z$ audio sample(s); counts must match.z'Each prompt must be a string or `None`.z<`prompt` must be a string, a sequence of strings, or `None`.Úuserr3   )ÚtypeÚpath)r€   r3   r2   )r€   r2   )ÚroleÚcontentT)ÚtokenizeÚadd_generation_promptÚreturn_dict)Úlistr   r   Ú
isinstancerb   ÚTensorÚdetachÚcpuÚnumpyrG   r?   r*   ÚstrÚtupler^   Ú	TypeErrorÚzipÚapply_chat_template)r.   r3   r}   r5   Úaudio_itemsÚelÚ
batch_sizeÚpromptsÚitemÚprompt_textÚ
audio_itemÚconversationss               r!   Úapply_transcription_requestz+GlmAsrProcessor.apply_transcription_request½   sß  € ô2 /3Ô3SÐTYÓ3ZÓ.[ˆÜÔØgrÖsÐac¼
À2ÄuÇ|Á|Ô8T˜2Ÿ9™9›;Ÿ?™?Ó,×2Ñ2Ô4ÐZ\Ñ\ÐsˆKÐsä˜Ó%ˆ
Ø˜Š?ÜÐHÓIÐIàˆ>Ø×8Ñ8Ð9¸JÑF‰GÜ˜¤Ô$Ø�h Ñ+‰GÜ˜¤¤u Ô.Ü�6‹{˜jÒ(Ü Ø¤ F£˜}¨O¸J¸<ÐGkÐlóð ð ˆGØò O�Ø�<Ø—N‘N 4×#DÑ#DÕEÜ ¤cÔ*Ø—N‘N 4Õ(ä#Ð$MÓNÐNñOô ÐZÓ[Ð[ô ,/¨w¸Ó+D÷
ñ (�˜Zð #ô & j´#Ô6ð ")°*Ò=à&-¸
ÑCØ!'°Ñ=ð	 ñò
ð
ˆñ 
ð (ˆt×'Ñ'Øð
àØ"&Øñ	
ð
 ñ
ð 	
ùòS tùó4
s   £AF-Å&-F2)Ústrip_prefixc                óˆ   —  | j                   j                  |i |¤Ž}|r|D �cg c]  }| j                  |«      ‘Œ }}|S c c}w )aj  
        Forward arguments to [`~PreTrainedTokenizer.decode`] and optionally remove the assistant framing the model
        was trained to produce.

        AF3 transcription requests respond with sentences such as `"The spoken content of the audio is "..."."`.
        Setting `strip_prefix=True` trims the fixed prefix for just the transcription text.
        )r0   ÚdecodeÚ"_strip_assistant_prefix_and_quotes)r.   r›   Úargsr5   Údecodedr2   s         r!   r�   zGlmAsrProcessor.decode	  sK   € ð (�$—.‘.×'Ñ'¨Ð8°Ñ8ˆÙØQXÖYÈ�t×>Ñ>¸tÕDÐYˆGÐYØˆùò Zs   £?c                 ó&   —  | j                   |i |¤ŽS )z)BC as previous examples used batch_decode)r�   )r.   rŸ   r5   s      r!   Úbatch_decodezGlmAsrProcessor.batch_decode  s   € àˆt�{‰{˜DÐ+ FÑ+Ð+r    c                 ó@  — |j                  «       }dD ]1  }|j                  |«      sŒ|t        |«      d j                  «       } n |j                  d«      r|dd j                  «       }t        |«      dk\  r%|d   |d   k(  r|d   dv r|dd j                  «       }|S )	zi
        Remove the assistant prefix and surrounding quotes from a decoded transcription string.
        )z"The spoken content of the audio isz!The transcription of the audio isz!The content of the input audio isNú.rU   rK   r   >   ú"ú'rJ   )ÚstripÚ
startswithrG   Úendswith)r.   r2   ÚstrippedÚprefixs       r!   rž   z2GlmAsrProcessor._strip_assistant_prefix_and_quotes  s°   € ð
 —:‘:“<ˆð
ò 	ˆFð
 ×"Ñ" 6Õ*Ø#¤C¨£K MÐ2×8Ñ8Ó:�Ùð	ð ×Ñ˜SÔ!Ø  �}×*Ñ*Ó,ˆHäˆx‹=˜AÒ (¨1¡+°¸"±Ò"=À(È1Á+ÐQ[ÑB[Ø  "�~×+Ñ+Ó-ˆHàˆr    )Nz<|pad|>z&Please transcribe this audio into texti�  )NF)NN)rL   útorch.Tensorr6   r¬   )N)r   r   r   r   Úvalid_processor_kwargsr-   r   r
   r‡   r   Úboolr	   r   r@   r   rF   rQ   rw   ÚdictrX   r�   rf   Úpropertyrz   r|   rš   r�   r¢   rž   Ú__classcell__)r1   s   @r!   r$   r$   7   s´  ø„ à2Ðð ØØ%MØõTð0 ð $(Ø%*ñ	Aà˜$˜y™/Ñ)ðAð ˜DÑ ðAð ˜d‘{ð	Að
 Ð.Ñ/ðAð 
ôAó ðAðB $(Ø37ñ	dà˜DÑ ð	dð ˜$˜y™/Ñ)¨DÑ0ð	dð Ð)Ñ*õ		dóð(0 Jó (0ðT3°ð 3Àð 3Èó 3ð ðC 4¨¡9ô Có ðCð ð$ D¨¡Iò $ó ð$ð *.ñJ
à�T˜#‘Y‰ Ñ+ðJ
ð �d˜3‘i‘ $Ñ&ðJ
ð Ð.Ñ/ð	J
ð
 
óJ
ðX */ô ò,ð°sð ¸s÷ r    r$   )rŒ   ÚnpÚaudio_utilsr   r   Úfeature_extraction_utilsr   Úprocessing_utilsr   r   r	   Útokenization_utils_baser
   Úutilsr   r   r   rb   Ú
get_loggerr   r\   r   r$   Ú__all__r   r    r!   ú<module>rº      sv   ðó, ç GÝ 4ß HÑ HÝ 0ß @Ñ @ñ ÔÛð 
ˆ×	Ñ	˜HÓ	%€ôÐ,°Eõ ð" ôx�nó xó ðxðv Ð
�r    