Ë
    ÛÓ^jÑ7  ã                   ó>  — 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 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mZ ddlmZmZmZmZ ddl m!Z!m"Z" ddl#m$Z$  ejJ                  e&«      Z' G d„ de!«      Z( G d„ de"«      Z) G d„ de«      Z*e G d„ de«      «       Z+ ed¬«      e G d„ de«      «       «       Z, ed¬«       G d „ d!e«      «       Z- G d"„ d#e«      Z. ed$¬«       G d%„ d&e«      «       Z/ ed'¬«       G d(„ d)e«      «       Z0g d*¢Z1y)+é    )Ú	dataclassN)Únné   )ÚACT2FN)ÚCache)Úcreate_bidirectional_mask)ÚBaseModelOutputWithPoolingÚModelOutput)ÚUnpack)ÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚlogging)Úmerge_with_config_defaults)Úcapture_outputsé   )ÚQwen2AudioEncoderÚQwen2AudioPreTrainedModel)ÚVoxtralForConditionalGenerationÚVoxtralModelÚVoxtralModelOutputWithPastÚVoxtralMultiModalProjector)ÚWhisperAttentionÚWhisperEncoderLayeré   )ÚAudioFlamingo3Configc                   ó   — e Zd Zy)ÚAudioFlamingo3AttentionN©Ú__name__Ú
__module__Ú__qualname__© ó    ú„/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/audioflamingo3/modular_audioflamingo3.pyr   r   .   ó   „ Ør$   r   c                   ó   — e Zd Zy)ÚAudioFlamingo3EncoderLayerNr   r#   r$   r%   r(   r(   2   r&   r$   r(   c                   ó   — e Zd ZdZy)ÚAudioFlamingo3PreTrainedModelTN)r    r!   r"   Ú_supports_attention_backendr#   r$   r%   r*   r*   6   s   „ Ø"&Ñr$   r*   c                   ó   — e Zd Zy)Ú!AudioFlamingo3ModelOutputWithPastNr   r#   r$   r%   r-   r-   :   s   „ àr$   r-   zZ
    Base class for AudioFlamingo3 causal language model (or autoregressive) outputs.
    ©Úcustom_introc                   óú   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
dz  ed<   dZeej                     dz  ed<   dZeej                     dz  ed<   dZej                  dz  ed<   y)	Ú$AudioFlamingo3CausalLMOutputWithPastaV  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided):
        Language modeling loss (for next-token prediction).
    logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`):
        Prediction scores of the language modeling head.
    past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`):
        It is a [`~cache_utils.Cache`] instance.
    audio_hidden_states (`torch.FloatTensor`, *optional*):
        Hidden states of the audio encoder after projection.
    NÚlossÚlogitsÚpast_key_valuesÚhidden_statesÚ
attentionsÚaudio_hidden_states)r    r!   r"   Ú__doc__r2   ÚtorchÚFloatTensorÚ__annotations__r3   r4   r   r5   Útupler6   r7   r#   r$   r%   r1   r1   ?   s‹   … ñ	ð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø$(€O�U˜T‘\Ó(Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ó6Ø48Ð˜×*Ñ*¨TÑ1Ô8r$   r1   zT
    The audio model from AudioFlamingo3 without any head or projection on top.
    c            
       óz   — e Zd ZdZeedœZee	 dde	j                  de	j                  dz  deez  fd„«       «       Zy)	ÚAudioFlamingo3EncoderzY
    AudioFlamingo3 encoder: Whisper encoder, average pool (time/2), then LayerNorm.
    )r5   r6   NÚinput_featuresÚinput_features_maskÚreturnc                 óª  — |j                   d   dz
  dz  dz   }|j                  d«      }|dz
  dz  dz   }t        j                  ||j                  ¬«      |dd…df   k  }t
        j                  j                  | j                  |«      «      }t
        j                  j                  | j                  |«      «      }|j                  ddd«      }|| j                  j                  z   }t
        j                  j                  || j                  | j                  ¬«      }t        | j                   ||¬«      }| j"                  D ]>  }	| j                  xr" t        j$                  g «      | j&                  k  }
|
rŒ6 |	||«      }Œ@ |j                  ddd«      }| j)                  |«      j                  ddd«      }| j+                  |«      }t-        |¬	«      S )
ap  
        Args:
            input_features (`torch.FloatTensor` of shape `(batch_size, feature_size, sequence_length)`):
                Log-Mel features extracted from raw audio. Use the processor/feature extractor to compute and pad
                these features from waveform input.
            input_features_mask (`torch.FloatTensor` of shape `(batch_size, sequence_length)`, *optional*):
                Mask to avoid performing attention on padding feature indices. Mask values selected in `[0, 1]`:

                - 1 for tokens that are **not masked**,
                - 0 for tokens that are **masked**.
        éÿÿÿÿr   r   ©ÚdeviceNr   )ÚpÚtraining)ÚconfigÚinputs_embedsÚattention_mask)Úlast_hidden_state)ÚshapeÚsumr9   ÚarangerE   r   Ú
functionalÚgeluÚconv1Úconv2ÚpermuteÚembed_positionsÚweightÚdropoutrG   r   rH   ÚlayersÚrandÚ	layerdropÚ
avg_poolerÚ
layer_normr	   )Úselfr?   r@   ÚkwargsÚseq_lenÚinput_features_lengthsrI   r5   rJ   ÚlayerÚdrops              r%   ÚforwardzAudioFlamingo3Encoder.forwardh   s­  € ð( "×'Ñ'¨Ñ+¨aÑ/°AÑ5¸Ñ9ˆØ!4×!8Ñ!8¸Ó!<ÐØ"8¸1Ñ"<ÀÑ!BÀQÑ!FÐÜ#Ÿl™l¨7¸>×;PÑ;PÔQÐTjÒklÐnrÐkrÑTsÑsÐô Ÿ™×*Ñ*¨4¯:©:°nÓ+EÓFˆÜŸ™×*Ñ*¨4¯:©:°mÓ+DÓEˆØ%×-Ñ-¨a°°AÓ6ˆð &¨×(<Ñ(<×(CÑ(CÑCˆÜŸ™×-Ñ-¨m¸t¿|¹|ÐVZ×VcÑVcÐ-Ódˆä2Ø—;‘;Ø'Ø.ô
ˆð —[‘[ò 	EˆEØ—=‘=ÒD¤U§Z¡Z°£^°d·n±nÑ%DˆDÚÙ % m°^Ó D‘ð	Eð &×-Ñ-¨a°°AÓ6ˆØŸ™¨Ó6×>Ñ>¸qÀ!ÀQÓGˆØŸ™¨Ó6ˆä)Ø+ô
ð 	
r$   ©N)r    r!   r"   r8   r(   r   Ú_can_record_outputsr   r   r9   ÚTensorr<   r	   rb   r#   r$   r%   r>   r>   Y   sg   „ ñð
 4Ø-ñÐð
  Øð 48ñ3
àŸ™ð3
ð #Ÿ\™\¨DÑ0ð3
ð
 
Ð+Ñ	+ò3
ó ó  ñ3
r$   r>   c                   ó(   ‡ — e Zd ZdZdefˆ fd„Zˆ xZS )Ú!AudioFlamingo3MultiModalProjectorz•
    Audio adaptor (small MLP) that projects AudioFlamingo3Encoder features
    to the LLM embedding space so they can replace `<sound>` tokens.
    rH   c                 óŽ  •— t         ‰| �  «        t        j                  |j                  j
                  |j                  j
                  |j                  ¬«      | _        t        |j                     | _        t        j                  |j                  j
                  |j                  j
                  |j                  ¬«      | _        y )N)Úbias)ÚsuperÚ__init__r   ÚLinearÚaudio_configÚhidden_sizeÚtext_configÚprojector_biasÚlinear_1r   Úprojector_hidden_actÚactÚlinear_2©r\   rH   Ú	__class__s     €r%   rk   z*AudioFlamingo3MultiModalProjector.__init__¦   sŽ   ø€ Ü‰ÑÔÜŸ	™	Ø×Ñ×+Ñ+¨V×-?Ñ-?×-KÑ-KÐRX×RgÑRgô
ˆŒô ˜&×5Ñ5Ñ6ˆŒÜŸ	™	Ø×Ñ×*Ñ*¨F×,>Ñ,>×,JÑ,JÐQW×QfÑQfô
ˆ�r$   )r    r!   r"   r8   r   rk   Ú__classcell__©rv   s   @r%   rg   rg       s   ø„ ñð

Ð3÷ 
ñ 
r$   rg   z“
    The AudioFlamingo3 model (fine-tuned Whisper encoder, multi-modal projector, Qwen2 language model),
    without a language modeling head.
    c                   ó˜  ‡ — e Zd ZdZdZdZˆ fd„Ze ed¬«      de	j                  de	j                  dee   deez  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	j"                  dz  dedz  de	j                  dz  dedz  dee   fd„«       «       Zˆ xZS )ÚAudioFlamingo3ModelNc                 ó$   •— t         ‰| �  |«       y rc   )rj   rk   ru   s     €r%   rk   zAudioFlamingo3Model.__init__¼   s   ø€ Ü‰Ñ˜Õ 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.   r?   r@   r]   rA   c                 óÄ  —  | j                   |f|ddœ|¤Ž}| j                  |j                  «      }|j                  d«      j	                  t
        j                  «      }| j                   j                  |«      \  }}t        j                  |j                  d   |j                  ¬«      ddd…f   |dd…df   k  }	||	j	                  |j                  «         |_        |S )a1  
        input_features (`torch.FloatTensor`):
            Float values of mel features extracted from the raw speech waveform.
        input_features_mask (`torch.Tensor` of shape `(batch_size, feature_sequence_length)`):
            Mask to avoid performing attention on padded feature indices.
        T)r@   Úreturn_dictrC   r   rD   N)Úaudio_towerÚmulti_modal_projectorrK   rM   Útor9   ÚlongÚ _get_feat_extract_output_lengthsrN   rL   rE   Úpooler_output)
r\   r?   r@   r]   Úaudio_outputÚaudio_embedsÚinput_lengthsÚ_Úpost_lengthsÚ
valid_masks
             r%   Úget_audio_featuresz&AudioFlamingo3Model.get_audio_features¿   sà   € ð" (�t×'Ñ'Øð
Ø0CÐQUñ
ØY_ñ
ˆð ×1Ñ1°,×2PÑ2PÓQˆð ,×/Ñ/°Ó3×6Ñ6´u·z±zÓBˆØ×*Ñ*×KÑKÈMÓZ‰ˆˆ<Ü—\‘\ ,×"4Ñ"4°QÑ"7À×@SÑ@SÔTÐUYÒ[\ÐU\Ñ]Ð`lÒmnÐptÐmtÑ`uÑuˆ
Ø%1°*·-±-À×@SÑ@SÓ2TÑ%UˆÔ"àÐr$   Ú	input_idsrJ   Úposition_idsr4   rI   Ú	use_cachec	           	      ó˜  — |€ | j                  «       |«      }d}
|�_|�]| j                  ||d¬«      j                  }
| j                  |||
¬«      }|j	                  ||
j                  |j                  «      «      } | j                  d|||||dœ|	¤Ž}t        |j                  |j                  |j                  |j                  |
¬«      S )z³
        input_features_mask (`torch.Tensor` of shape `(batch_size, feature_sequence_length)`):
            Mask to avoid performing attention on padding feature indices.
        NT)r}   )rI   Úaudio_features)rI   rJ   rŒ   r4   r�   )rK   r4   r5   r6   r7   r#   )Úget_input_embeddingsrŠ   rƒ   Úget_placeholder_maskÚmasked_scatterr€   rE   Úlanguage_modelr-   rK   r4   r5   r6   )r\   r‹   r?   r@   rJ   rŒ   r4   rI   r�   r]   r…   Úspecial_audio_maskÚoutputss                r%   rb   zAudioFlamingo3Model.forwardÝ   sø   € ð$ Ð Ø7˜D×5Ñ5Ó7¸	ÓBˆMàˆØÐ%¨)Ð*?Ø×2Ñ2°>ÐCVÐdhÐ2Ói×wÑwˆLð "&×!:Ñ!:Ø¨À|ð ";ó "Ðð *×8Ñ8Ð9KÈ\Ï_É_Ð]j×]qÑ]qÓMrÓsˆMà%�$×%Ñ%ð 
Ø'Ø)Ø%Ø+Øñ
ð ñ
ˆô 1Ø%×7Ñ7Ø#×3Ñ3Ø!×/Ñ/Ø×)Ñ)Ø ,ô
ð 	
r$   )NNNNNNNN)r    r!   r"   Ú_tp_planÚ_pp_planÚ_keep_in_fp32_modules_strictrk   r   r   r9   r:   re   r   r   r<   r	   rŠ   Ú
LongTensorr   Úboolrb   rw   rx   s   @r%   rz   rz   ±   sW  ø„ ð €HØ€HØ#'Ð ô!ð Ùð wôðà×)Ñ)ðð #Ÿ\™\ðð Ð+Ñ,ð	ð
 
Ð+Ñ	+òóó ðð4 Øð .2Ø37Ø37Ø.2Ø04Ø(,Ø26Ø!%ñ,
à×#Ñ# dÑ*ð,
ð ×)Ñ)¨DÑ0ð,
ð #Ÿ\™\¨DÑ0ð	,
ð
 Ÿ™ tÑ+ð,
ð ×&Ñ&¨Ñ-ð,
ð  ™ð,
ð ×(Ñ(¨4Ñ/ð,
ð ˜$‘;ð,
ð Ð+Ñ,ò,
ó ó ô,
r$   rz   z†
    The AudioFlamingo3 model which consists of a fine-tuned Whisper encoder, a multi-modal projector and a Qwen2 language model.
    c                   óˆ  ‡ — e Zd Zd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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ddœdefˆ fd„Zˆ xZS )Ú&AudioFlamingo3ForConditionalGenerationNc                 ód   •— t         ‰| �  |«       t        |«      | _        | j	                  «        y rc   )rj   rk   rz   ÚmodelÚ	post_initru   s     €r%   rk   z/AudioFlamingo3ForConditionalGeneration.__init__  s&   ø€ Ü‰Ñ˜Ô Ü(¨Ó0ˆŒ
Ø�‰Õr$   c                 ó>   —  | j                   j                  ||fi |¤ŽS rc   )rž   rŠ   )r\   r?   r@   r]   s       r%   rŠ   z9AudioFlamingo3ForConditionalGeneration.get_audio_features  s"   € Ø,ˆt�z‰z×,Ñ,¨^Ð=PÑ[ÐTZÑ[Ð[r$   r‹   r?   r@   rJ   rŒ   r4   rI   Úlabelsr�   Úlogits_to_keepr]   rA   c                 ó¦  —  | j                   d||||||||	dœ|¤Ž}|j                  }t        |
t        «      rt	        |
 d«      n|
}| j                  |dd…|dd…f   «      }d}|�4 | j                  d||| j                  j                  j                  dœ|¤Ž}t        |||j                  |j                  |j                  |j                  ¬«      S )a±  
        input_features_mask (`torch.Tensor` of shape `(batch_size, feature_sequence_length)`):
            Mask to avoid performing attention on padding feature indices.
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss.

        Example:

        ```python
        >>> from transformers import AudioFlamingo3ForConditionalGeneration, AutoProcessor

        >>> model_id = "nvidia/audio-flamingo-3-hf"
        >>> processor = AutoProcessor.from_pretrained(model_id)
        >>> model = AudioFlamingo3ForConditionalGeneration.from_pretrained(model_id, device_map="auto")
        ```)r‹   r?   r@   rJ   rŒ   r4   rI   r�   N)r3   r¡   Ú
vocab_size)r2   r3   r4   r5   r6   r7   r#   )rž   rK   Ú
isinstanceÚintÚsliceÚlm_headÚloss_functionrH   ro   r¤   r1   r4   r5   r6   r7   )r\   r‹   r?   r@   rJ   rŒ   r4   rI   r¡   r�   r¢   r]   r•   r5   Úslice_indicesr3   r2   s                    r%   rb   z.AudioFlamingo3ForConditionalGeneration.forward  s÷   € ð> �$—*‘*ð 

ØØ)Ø 3Ø)Ø%Ø+Ø'Øñ

ð ñ

ˆð  ×1Ñ1ˆÜ8BÀ>ÔSVÔ8Wœ˜~˜o¨tÔ4Ð]kˆØ—‘˜mªA¨}ºaÐ,?Ñ@ÓAˆàˆØÐØ%�4×%Ñ%ð Ø f¸¿¹×9PÑ9P×9[Ñ9[ñØ_eñˆDô 4ØØØ#×3Ñ3Ø!×/Ñ/Ø×)Ñ)Ø '× ;Ñ ;ô
ð 	
r$   F)Úis_first_iterationr«   c                ó²   •— |j                  dd «      }|j                  dd «      }t        ‰| �  |i |¤Ž}|s|j                  dd«      s|�||d<   |�||d<   |S )Nr?   r@   r�   F)Úpoprj   Úprepare_inputs_for_generationÚget)r\   r«   Úargsr]   r?   r@   Úmodel_inputsrv   s          €r%   r®   zDAudioFlamingo3ForConditionalGeneration.prepare_inputs_for_generation\  st   ø€ ØŸ™Ð$4°dÓ;ˆØ$Ÿj™jÐ)>ÀÓEÐä‘wÑ<¸dÐMÀfÑMˆá \×%5Ñ%5°kÀ5Ô%IØÐ)Ø1?�Ð-Ñ.Ø"Ð.Ø6I�Ð2Ñ3àÐr$   )
NNNNNNNNNr   )r    r!   r"   Ú_tied_weights_keysrk   rŠ   r   r   r9   r™   r:   re   r   rš   r¦   r   r   r<   r1   rb   r®   rw   rx   s   @r%   rœ   rœ     sG  ø„ ð Ðôò
\ð Øð .2Ø37Ø37Ø.2Ø04Ø(,Ø26Ø*.Ø!%Ø-.ñ:
à×#Ñ# dÑ*ð:
ð ×)Ñ)¨DÑ0ð:
ð #Ÿ\™\¨DÑ0ð	:
ð
 Ÿ™ tÑ+ð:
ð ×&Ñ&¨Ñ-ð:
ð  ™ð:
ð ×(Ñ(¨4Ñ/ð:
ð × Ñ  4Ñ'ð:
ð ˜$‘;ð:
ð ˜eŸl™lÑ*ð:
ð Ð+Ñ,ð:
ð 
Ð5Ñ	5ò:
ó ó ð:
ðx OTò Àt÷ ñ r$   rœ   )rœ   r*   r>   rz   )2Údataclassesr   r9   r   Úactivationsr   Úcache_utilsr   Úmasking_utilsr   Úmodeling_outputsr	   r
   Úprocessing_utilsr   Úutilsr   r   r   r   Úutils.genericr   Úutils.output_capturingr   Ú qwen2_audio.modeling_qwen2_audior   r   Úvoxtral.modeling_voxtralr   r   r   r   Úwhisper.modeling_whisperr   r   Úconfiguration_audioflamingo3r   Ú
get_loggerr    Úloggerr   r(   r*   r-   r1   r>   rg   rz   rœ   Ú__all__r#   r$   r%   ú<module>rÃ      sW  ðõ  "ã Ý å !Ý  Ý 6ß GÝ &ß RÓ RÝ 7Ý 5÷÷ó ÷ MÝ >ð 
ˆ×	Ñ	˜HÓ	%€ô	Ð.ô 	ô	Ð!4ô 	ô'Ð$=ô 'ð ô	Ð(Bó 	ó ð	ñ ðôð
 ô9¨;ó 9ó óð9ñ( ðôô
?
Ð-ó ?
óð
?
ôD
Ð(Bô 
ñ" ðôôT
˜,ó T
óðT
ñn ðôô
UÐ-Ló Uóð
Uòp�r$   