§
    ‚Štj¦:  ã                   ó^  — d dl mZ d dlZd dlmZ ddlmZ ddl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mZ ddlmZ ddlmZ ddlmZ ddlmZmZmZmZ ddl m!Z!  G d„ de¦  «        Z" G d„ de¦  «        Z# G d„ de¦  «        Z$ ed¬¦  «         G d„ de¦  «        ¦   «         Z% G d„ dej&        ¦  «        Z' ed¬¦  «        e G d„ d e¦  «        ¦   «         ¦   «         Z( ed!¬¦  «         G d"„ d#e$¦  «        ¦   «         Z) ed$¬¦  «         G d%„ d&e$e	¦  «        ¦   «         Z*g d'¢Z+dS )(é    )Ú	dataclassN)Únné   )ÚACT2FN)ÚCache)ÚGenerationMixin)ÚBaseModelOutputWithPastÚBaseModelOutputWithPoolingÚCausalLMOutputWithPast)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚtorch_compilable_check)Úmerge_with_config_defaults)Úcapture_outputsé   )Ú	AutoModel)ÚQwen2AudioAttentionÚQwen2AudioEncoderÚQwen2AudioEncoderLayerÚQwen2AudioPreTrainedModelé   )ÚVoxtralConfigc                   ó   — e Zd ZdS )ÚVoxtralAttentionN©Ú__name__Ú
__module__Ú__qualname__© ó    úi/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/voxtral/modular_voxtral.pyr   r   +   ó   € € € € € Ø€Dr"   r   c                   ó   — e Zd ZdS )ÚVoxtralEncoderLayerNr   r!   r"   r#   r&   r&   /   r$   r"   r&   c                   ó"   — e Zd ZdZdZdZdZdZdS )ÚVoxtralPreTrainedModelTN)r   r   r    Ú_supports_flex_attnÚ_supports_cache_classÚ_supports_attention_backendÚ_can_compile_fullgraphÚ_no_split_modulesr!   r"   r#   r(   r(   3   s.   € € € € € ØÐØ ÐØ"&ÐØ!ÐØÐÐÐr"   r(   z:
    The Voxtral encoder, which is a Whisper encoder.
    ©Úcustom_introc                   ó^   — e Zd ZeedœZee	 ddee	         de
ez  fd„¦   «         ¦   «         ZdS )ÚVoxtralEncoder)Ú
attentionsÚhidden_statesNÚkwargsÚreturnc           	      ór  — | j         j        | j        j        d         z  | j        j        d         z  }|j        d         |k    r$t          d|› d|j        d         › d|› d�¦  «        ‚|                     | j        j        j	        | j        j        j
        ¬¦  «        }t          j                             |                      |¦  «        ¦  «        }t          j                             |                      |¦  «        ¦  «        }|                     ddd	¦  «        }| j        j        }||z                        |j	        ¦  «        }t          j                             || j        | j        ¬
¦  «        }t%          | j        ¦  «        D ]\  }}	 |	||¬¦  «        }Œ|                      |¦  «        }t+          |¬¦  «        S )aÙ  
        Args:
            input_features (`torch.LongTensor` of shape `(batch_size, feature_size, sequence_length)`):
                Float values of mel features extracted from the raw speech waveform. Raw speech waveform can be
                obtained by loading a `.flac` or `.wav` audio file into an array of type `list[float]` or a
                `numpy.ndarray`, *e.g.* via the soundfile library (`pip install soundfile`). To prepare the array into
                `input_features`, the [`AutoFeatureExtractor`] should be used for extracting the mel features, padding
                and conversion into a tensor of type `torch.FloatTensor`. See [`~WhisperFeatureExtractor.__call__`]
            attention_mask (`torch.Tensor`)`, *optional*):
                Voxtral does not support masking of the `input_features`, this argument is preserved for compatibility,
                but it is not used. By default the silence in the input log mel spectrogram are ignored.
        r   éÿÿÿÿz7Voxtral expects the mel input features to be of length z, but found z-. Make sure to pad the input mel features to ú.©ÚdtypeÚdevicer   r   )ÚpÚtraining)Úattention_mask)Úlast_hidden_state)ÚconfigÚmax_source_positionsÚconv1ÚstrideÚconv2ÚshapeÚ
ValueErrorÚtoÚweightr:   r;   r   Ú
functionalÚgeluÚpermuteÚembed_positionsÚdropoutr=   Ú	enumerateÚlayersÚ
layer_normr
   )
ÚselfÚinput_featuresr>   r4   Úexpected_seq_lengthÚinputs_embedsÚ	embed_posr3   ÚidxÚencoder_layers
             r#   ÚforwardzVoxtralEncoder.forwardG   sÛ  € ð( #œkÔ>ÀÄÔARÐSTÔAUÑUÐX\ÔXbÔXiÐjkÔXlÑlÐØÔ Ô#Ð':Ò:Ð:Ýð IÐJ]ð  Ið  IÐkyÔkð  ACô  lDð  Ið  Ið  sFð  Ið  Ið  Iñô ð ð (×*Ò*°´Ô1BÔ1HÐQUÔQ[ÔQbÔQiÐ*ÑjÔjˆÝœ×*Ò*¨4¯:ª:°nÑ+EÔ+EÑFÔFˆÝœ×*Ò*¨4¯:ª:°mÑ+DÔ+DÑEÔEˆØ%×-Ò-¨a°°AÑ6Ô6ˆàÔ(Ô/ˆ	Ø&¨Ñ2×6Ò6°}Ô7JÑKÔKˆÝœ×-Ò-¨m¸t¼|ÐVZÔVcÐ-ÑdÔdˆå"+¨D¬KÑ"8Ô"8ð 	ð 	ÑˆC�Ø)˜MØØ-ðñ ô ˆMˆMð
 Ÿš¨Ñ6Ô6ˆå)Ø+ð
ñ 
ô 
ð 	
r"   ©N)r   r   r    r   r&   Ú_can_record_outputsr   r   r   r   Útupler
   rX   r!   r"   r#   r1   r1   <   s~   € € € € € ð 'Ø,ðð Ðð
  Øð ð+
ð +
ð Ð+Ô,ð	+
ð
 
Ð+Ñ	+ð+
ð +
ð +
ñ „_ñ  Ôð+
ð +
ð +
r"   r1   c                   ó*   ‡ — e Zd Zdefˆ fd„Zd„ Zˆ xZS )ÚVoxtralMultiModalProjectorr@   c                 ó6  •— t          ¦   «                              ¦   «          t          j        |j        j        |j        j        d¬¦  «        | _        t          |j
                 | _        t          j        |j        j        |j        j        d¬¦  «        | _        d S ©NF)Úbias)ÚsuperÚ__init__r   ÚLinearÚaudio_configÚintermediate_sizeÚtext_configÚhidden_sizeÚlinear_1r   Úprojector_hidden_actÚactÚlinear_2©rQ   r@   Ú	__class__s     €r#   rb   z#VoxtralMultiModalProjector.__init__x   sv   ø€ Ý‰Œ×ÒÑÔÐÝœ	 &Ô"5Ô"GÈÔI[ÔIgÐnsÐtÑtÔtˆŒÝ˜&Ô5Ô6ˆŒÝœ	 &Ô"4Ô"@À&ÔBTÔB`ÐglÐmÑmÔmˆŒˆˆr"   c                 ó„   — |                       |¦  «        }|                      |¦  «        }|                      |¦  «        }|S rY   )rh   rj   rk   )rQ   Úaudio_featuresr3   s      r#   rX   z"VoxtralMultiModalProjector.forward~   s;   € ØŸš nÑ5Ô5ˆØŸš Ñ/Ô/ˆØŸš mÑ4Ô4ˆØÐr"   )r   r   r    r   rb   rX   Ú__classcell__©rm   s   @r#   r]   r]   w   sZ   ø€ € € € € ðn˜}ð nð nð nð nð nð nðð ð ð ð ð ð r"   r]   zL
    Base class for Voxtral outputs, with hidden states and attentions.
    c                   ó2   — e Zd ZU dZdZej        dz  ed<   dS )ÚVoxtralModelOutputWithPastzg
    audio_hidden_states (`torch.FloatTensor`, *optional*):
        Projected audio hidden states.
    NÚaudio_hidden_states)r   r   r    Ú__doc__rt   ÚtorchÚFloatTensorÚ__annotations__r!   r"   r#   rs   rs   …   s7   € € € € € € ðð ð
 59Ð˜Ô*¨TÑ1Ð8Ð8Ñ8Ð8Ð8r"   rs   z™
    The Voxtral model, which consists of Whisper encoder, a multi-modal projector and a Llama language model,
    without a language modeling head.
    c                   ó~  ‡ — e Zd Zˆ fd„Ze ed¬¦  «        dej        dee	         de
ez  fd„¦   «         ¦   «         Zdej        d	ej        d
ej        fd„Zee	 	 	 	 	 	 	 ddej        dz  dej        dz  dej        dz  dej        dz  dedz  d	ej        dz  dedz  dee	         de
ez  fd„¦   «         ¦   «         Zˆ xZS )ÚVoxtralModelc                 ó  •— t          ¦   «                              |¦  «         t          j        |j        ¦  «        | _        t          j        |j        ¦  «        | _        t          |¦  «        | _	        |  
                    ¦   «          d S rY   )ra   rb   r   Úfrom_configrd   Úaudio_towerrf   Úlanguage_modelr]   Úmulti_modal_projectorÚ	post_initrl   s     €r#   rb   zVoxtralModel.__init__›   sm   ø€ Ý‰Œ×Ò˜Ñ Ô Ð Ý$Ô0°Ô1DÑEÔEˆÔÝ'Ô3°FÔ4FÑGÔGˆÔÝ%?ÀÑ%GÔ%GˆÔ"Ø�ŠÑÔÐÐÐr"   zŸThis method is used to get the audio embeddings from input features (a log mel spectrogram), meaning inferring the audio encoder and the multi-modal projector.r.   rR   r4   r5   c                 ó¶   —  | j         |fddi|¤Ž}|j        }|                     d| j        j        j        ¦  «        }|                      |¦  «        }||_        |S )aa  
        input_features (`torch.FloatTensor`):
            Float values of mel features extracted from the raw speech waveform. Raw speech waveform can be
            obtained by loading a `.flac` or `.wav` audio file into an array of type `list[float]` or a
            `numpy.ndarray`, *e.g.* via the soundfile library (`pip install soundfile`). To prepare the array into
            `input_features`, the [`AutoFeatureExtractor`] should be used for extracting the mel features, padding
            and conversion into a tensor of type `torch.FloatTensor`. See [`~WhisperFeatureExtractor.__call__`]
        Úreturn_dictTr7   )r}   r?   Úreshaper@   rd   re   r   Úpooler_output)rQ   rR   r4   Úaudio_outputsrt   Úaudio_embedss         r#   Úget_audio_featureszVoxtralModel.get_audio_features¢   sl   € ð )˜Ô(¨ÐTÐTÀTÐTÈVÐTÐTˆØ+Ô=ÐØ1×9Ò9¸"¸d¼kÔ>VÔ>hÑiÔiÐØ×1Ò1Ð2EÑFÔFˆØ&2ˆÔ#àÐr"   Ú	input_idsrT   ro   c                 ó>  — |€e| |                       ¦   «         t          j        | j        j        t          j        |j        ¬¦  «        ¦  «        k    }|                     d¦  «        }n|| j        j        k    }|                     ¦   «         }|j	        d         }| 
                    d¦  «                             |¦  «                             |j        ¦  «        }t          ||                              ¦   «         |                     ¦   «         k    d|› d|› �¦  «         |S )zï
        Obtains multimodal placeholder mask from `input_ids` or `inputs_embeds`, and checks that the placeholder token count is
        equal to the length of multimodal features. If the lengths are different, an error is raised.
        Nr9   r7   r   z6Audio features and audio tokens do not match, tokens: z, features: )Úget_input_embeddingsrv   Útensorr@   Úaudio_token_idÚlongr;   ÚallÚsumrE   Ú	unsqueezeÚ	expand_asrG   r   Únumel)rQ   rˆ   rT   ro   Úspecial_audio_maskÚn_audio_tokensÚn_audio_featuress          r#   Úget_placeholder_maskz!VoxtralModel.get_placeholder_mask¹   s  € ð ÐØ!.Ð2M°$×2KÒ2KÑ2MÔ2MÝ”˜Tœ[Ô7½u¼zÐR_ÔRfÐgÑgÔgñ3ô 3ò "Ðð "4×!7Ò!7¸Ñ!;Ô!;ÐÐà!*¨d¬kÔ.HÒ!HÐà+×/Ò/Ñ1Ô1ˆØ)Ô/°Ô2ÐØ/×9Ò9¸"Ñ=Ô=×GÒGÈÑVÔV×YÒYÐZgÔZnÑoÔoÐÝØÐ,Ô-×3Ò3Ñ5Ô5¸×9MÒ9MÑ9OÔ9OÒOØsÀ^ÐsÐsÐaqÐsÐsñ	
ô 	
ð 	
ð "Ð!r"   Nr>   Úposition_idsÚpast_key_valuesÚ	use_cachec           	      ó†  — |€ |                       ¦   «         |¦  «        }d }	|�d|�b|                      |d¬¦  «        j        }	|                      |||	¬¦  «        }
|                     |
|	                     |j        ¦  «        ¦  «        } | j        d|||||dœ|¤Ž}t          |j	        |j
        |j        |j        |	¬¦  «        S )NT)r‚   )rT   ro   )r>   r—   r˜   rT   r™   )r?   r˜   r3   r2   rt   r!   )rŠ   r‡   r„   r–   Úmasked_scatterrG   r;   r~   rs   r?   r˜   r3   r2   )rQ   rˆ   rR   r>   r—   r˜   rT   r™   r4   r†   r“   Úoutputss               r#   rX   zVoxtralModel.forwardÑ   s  € ð Ð Ø7˜D×5Ò5Ñ7Ô7¸	ÑBÔBˆMàˆØÐ%¨)Ð*?Ø×2Ò2°>ÈtÐ2ÑTÔTÔbˆLð "&×!:Ò!:Ø¨À|ð ";ñ "ô "Ðð *×8Ò8Ð9KÈ\Ï_Ê_Ð]jÔ]qÑMrÔMrÑsÔsˆMà+>¨4Ô+>ð ,
Ø)Ø%Ø+Ø'Øð,
ð ,
ð ð,
ð ,
ˆõ *Ø%Ô7Ø#Ô3Ø!Ô/ØÔ)Ø ,ð
ñ 
ô 
ð 	
r"   )NNNNNNN)r   r   r    rb   r   r   rv   rw   r   r   r[   r
   r‡   Ú
LongTensorr–   ÚTensorr   Úboolrs   rX   rp   rq   s   @r#   rz   rz   ”   s³  ø€ € € € € ðð ð ð ð ð Ø€^ð wðñ ô ðØ#Ô/ðØ;AÐBTÔ;Uðà	Ð+Ñ	+ðð ð ñô ñ Ôðð&"ØÔ)ð"Ø:?Ô:Kð"Ø]bÔ]nð"ð "ð "ð "ð0 Øð .2Ø37Ø.2Ø04Ø(,Ø26Ø!%ð'
ð '
àÔ# dÑ*ð'
ð Ô)¨DÑ0ð'
ð œ tÑ+ð	'
ð
 Ô&¨Ñ-ð'
ð  ™ð'
ð Ô(¨4Ñ/ð'
ð ˜$‘;ð'
ð Ð+Ô,ð'
ð 
Ð+Ñ	+ð'
ð '
ð '
ñ „^ñ Ôð'
ð '
ð '
ð '
ð '
r"   rz   zs
    The Voxtral model, which consists of Whisper encoder, a multi-modal projector and a Llama language model.
    c                   ó*  ‡ — e Zd ZdgZˆ fd„Zd„ Zee	 	 	 	 	 	 	 	 	 ddej	        dz  dej
        dz  dej        dz  d	ej	        dz  d
edz  dej
        dz  dej	        dz  dedz  deej        z  dee         deez  fd„¦   «         ¦   «         Zˆ fd„Zˆ xZS )ÚVoxtralForConditionalGenerationrL   c                 óú   •— t          ¦   «                              |¦  «         t          |¦  «        | _        t	          j        |j        j        |j        j        d¬¦  «        | _	        |  
                    ¦   «          d S r_   )ra   rb   rz   Úmodelr   rc   rf   rg   Ú
vocab_sizeÚlm_headr€   rl   s     €r#   rb   z(VoxtralForConditionalGeneration.__init__  se   ø€ Ý‰Œ×Ò˜Ñ Ô Ð Ý! &Ñ)Ô)ˆŒ
Ý”y Ô!3Ô!?ÀÔASÔA^ÐejÐkÑkÔkˆŒØ�ŠÑÔÐÐÐr"   c                 ó&   —  | j         j        |i |¤ŽS rY   )r£   r‡   )rQ   Úargsr4   s      r#   r‡   z2VoxtralForConditionalGeneration.get_audio_features  s   € Ø,ˆtŒzÔ,¨dÐ=°fÐ=Ð=Ð=r"   Nr   rˆ   rR   r>   r—   r˜   rT   Úlabelsr™   Úlogits_to_keepr4   r5   c
                 ó\  —  | j         d|||||||dœ|
¤Ž}|j        }t          |	t          ¦  «        rt	          |	 d¦  «        n|	}|                      |dd…|dd…f         ¦  «        }d}|�  | j        d||| j        j        j	        dœ|
¤Ž}t          |||j        |j        |j        ¬¦  «        S )aj  
        Example:

        ```python
        >>> from transformers import VoxtralForConditionalGeneration, AutoProcessor
        >>> import torch

        >>> device = "cuda" if torch.cuda.is_available() else "cpu"
        >>> repo_id = "mistralai/Voxtral-Mini-3B-2507"

        >>> processor = AutoProcessor.from_pretrained(repo_id)
        >>> model = VoxtralForConditionalGeneration.from_pretrained(repo_id, dtype=torch.bfloat16, device_map=device)

        >>> conversation = [
            {
                "role": "user",
                "content": [
                    {
                        "type": "audio",
                        "url": "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/dude_where_is_my_car.wav",
                    },
                    {"type": "text", "text": "What can you tell me about this audio?"},
                ],
            }
        ]

        >>> inputs = processor.apply_chat_template(conversation)
        >>> inputs = inputs.to(device, dtype=torch.bfloat16)

        >>> outputs = model.generate(**inputs, max_new_tokens=30)
        >>> processor.batch_decode(outputs[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)
        ["This audio is a humorous conversation between two friends, likely in English, where one of them is trying to figure out what the other's tattoo says."]
        ```)rˆ   rR   r>   r—   r˜   rT   r™   N)Úlogitsr¨   r¤   )Úlossr«   r˜   r3   r2   r!   )r£   r?   Ú
isinstanceÚintÚslicer¥   Úloss_functionr@   rf   r¤   r   r˜   r3   r2   )rQ   rˆ   rR   r>   r—   r˜   rT   r¨   r™   r©   r4   rœ   r3   Úslice_indicesr«   r¬   s                   r#   rX   z'VoxtralForConditionalGeneration.forward  s  € ð` �$”*ð 	
ØØ)Ø)Ø%Ø+Ø'Øð	
ð 	
ð ð	
ð 	
ˆð  Ô1ˆÝ8BÀ>ÕSVÑ8WÔ8WÐk�˜~˜o¨tÑ4Ô4Ð4Ð]kˆØ—’˜m¨A¨A¨A¨}¸a¸a¸aÐ,?Ô@ÑAÔAˆàˆØÐØ%�4Ô%ð Ø f¸¼Ô9PÔ9[ðð Ø_eðð ˆDõ &ØØØ#Ô3Ø!Ô/ØÔ)ð
ñ 
ô 
ð 	
r"   c                 óÌ   •— |                      dd ¦  «        }|                     dd¦  «        } t          ¦   «         j        |i |¤Ž}|s|                     dd¦  «        s||d<   |S )NrR   Úis_first_iterationFr™   T)ÚpopÚgetra   Úprepare_inputs_for_generation)rQ   r§   r4   rR   r³   Úmodel_inputsrm   s         €r#   r¶   z=VoxtralForConditionalGeneration.prepare_inputs_for_generation[  sw   ø€ ð  ŸšÐ$4°dÑ;Ô;ˆØ#ŸZšZÐ(<¸eÑDÔDÐà<•u‘w”wÔ<¸dÐMÀfÐMÐMˆàð 	< V§Z¢Z°¸TÑ%BÔ%Bð 	<à-;ˆLÐ)Ñ*àÐr"   )	NNNNNNNNr   )r   r   r    Ú_keep_in_fp32_modules_strictrb   r‡   r   r   rv   r�   rw   rž   r   rŸ   r®   r   r   r[   r   rX   r¶   rp   rq   s   @r#   r¡   r¡   ý   s  ø€ € € € € ð %6Ð#6Ð ðð ð ð ð ð>ð >ð >ð Øð .2Ø37Ø.2Ø04Ø(,Ø26Ø*.Ø!%Ø-.ðI
ð I
àÔ# dÑ*ðI
ð Ô)¨DÑ0ðI
ð œ tÑ+ð	I
ð
 Ô&¨Ñ-ðI
ð  ™ðI
ð Ô(¨4Ñ/ðI
ð Ô  4Ñ'ðI
ð ˜$‘;ðI
ð ˜eœlÑ*ðI
ð Ð+Ô,ðI
ð 
Ð'Ñ	'ðI
ð I
ð I
ñ „^ñ ÔðI
ðVð ð ð ð ð ð ð ð r"   r¡   )r(   r1   rz   r¡   ),Údataclassesr   rv   r   Úactivationsr   Úcache_utilsr   Ú
generationr   Úmodeling_outputsr	   r
   r   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.genericr   Úutils.output_capturingr   Úautor   Ú qwen2_audio.modeling_qwen2_audior   r   r   r   Úconfiguration_voxtralr   r   r&   r(   r1   ÚModuler]   rs   rz   r¡   Ú__all__r!   r"   r#   ú<module>rÇ      sz  ðð  "Ð !Ð !Ð !Ð !Ð !à €€€Ø Ð Ð Ð Ð Ð à !Ð !Ð !Ð !Ð !Ð !Ø  Ð  Ð  Ð  Ð  Ð  Ø )Ð )Ð )Ð )Ð )Ð )ðð ð ð ð ð ð ð ð ð ð
 'Ð &Ð &Ð &Ð &Ð &Ø aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aÐ aØ 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð 1Ð 0Ð 0Ð 0Ð 0Ð 0ð	ð 	ð 	ð 	ð 	Ð*ñ 	ô 	ð 	ð	ð 	ð 	ð 	ð 	Ð0ñ 	ô 	ð 	ðð ð ð ð Ð6ñ ô ð ð €ððñ ô ð
3
ð 3
ð 3
ð 3
ð 3
Ð&ñ 3
ô 3
ñô ð
3
ðlð ð ð ð  ¤ñ ô ð ð €ððñ ô ð
 ð9ð 9ð 9ð 9ð 9Ð!8ñ 9ô 9ñ „ñô ð9ð €ððñ ô ð`
ð `
ð `
ð `
ð `
Ð)ñ `
ô `
ñô ð`
ðF €ððñ ô ð
eð eð eð eð eÐ&<¸oñ eô eñô ð
eðP jÐ
iÐ
i€€€r"   