Ë
    cQêjwÅ  ã                   óì   — d dl Z d dlZd dlZd dlmZ d dlZd dl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 d d
lmZ  ej:                  e«      Zg d¢Z  G d„ d«      Z!y)é    N)ÚPath)Úadd_cache_indirection_to_mhaÚadd_output_qk_to_mhaÚfix_past_sequence_length)Úoptimize_model)ÚAutoTokenizerÚWhisperConfigÚWhisperForConditionalGenerationÚWhisperProcessor)ÚWhisperDecoder)ÚWhisperEncoder)ÚWhisperEncoderDecoderInit)ÚWhisperJumpTimes)ÚInferenceSession)zwhisper-tinyzwhisper-tiny.enzwhisper-basezwhisper-base.enzwhisper-smallzwhisper-small.enzwhisper-mediumzwhisper-medium.enzwhisper-largezwhisper-large-v2zwhisper-large-v3zwhisper-large-v3-turboc                   ó®  — e Zd Ze	 	 d3dededededef
d„«       Zedededed	ed
edededededdfd„«       Ze	 	 	 d4dedededej                  dej                  deded
edeeej                  j                  f   fd„«       Zedeez  ez  dedededededededefd„«       Ze	 	 	 	 	 	 	 d5deded ed!ed"ed#eded$eded%eded	ed
efd&„«       Ze	 	 d6d'ed(ej                  j                  dej                  d)ed*ef
d+„«       Zed)ed*efd,„«       Zed-ej2                  d.ej2                  d/efd0„«       Ze	 	 d6deded1edej                  d)ed*efd2„«       Zy)7ÚWhisperHelperÚ
output_dirÚmodel_name_or_pathÚsuffixÚ
new_folderÚreturnc                 ó6  — |}t         j                  j                  |«      rt        |«      j                  d   }n|j                  d«      d   }||z  }|r t         j                  j                  | |«      n| }t         j                  j                  ||dz   «      S )aÉ  Build onnx path

        Args:
            output_dir (str): output directory
            model_name_or_path (str): pretrained model name, or path to the model checkpoint
            suffix (str, optional): suffix like "_encoder" or "_decoder_fp16" will be appended to file name. Defaults to None.
            new_folder (bool, optional): create a new directory for the model. Defaults to False.
        Returns:
            str: path of onnx model
        éÿÿÿÿú/z.onnx)ÚosÚpathÚisdirr   ÚpartsÚsplitÚjoin)r   r   r   r   Ú
model_nameÚ	directorys         ú{/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/models/whisper/whisper_helper.pyÚget_onnx_pathzWhisperHelper.get_onnx_path*   s�   € ð" (ˆ
Ü�7‰7�=‰=Ð+Ô,ÜÐ0Ó1×7Ñ7¸Ñ;‰Jà#×)Ñ)¨#Ó.¨rÑ2ˆJà�fÑˆ
á<F”B—G‘G—L‘L ¨ZÔ8ÈJˆ	Ü�w‰w�|‰|˜I z°GÑ';Ó<Ð<ó    ÚproviderÚ!separate_encoder_and_decoder_initÚuse_decoder_masked_mhaÚ	output_qkÚencoder_pathÚdecoder_pathÚ	cache_dirNc	                 óî  — t        j                  | |¬«      }	|	j                  |«       t        j                  | |¬«      }
|
j                  |«       t	        j                  | |¬«      }|j                  |«       |ry ddddddœiddd	d
d
dg d¢dœdœidddddd
|	j
                  dœdœigii}t        j                  |d¬«      }t        t        j                  j                  |d«      d«      5 }|j                  |«       d d d «       d|v rg n|› i ig}t        |	dd «      xs |	j                  }|	j                  |d|dœt        j                  j!                  |«      |	j"                  |	j$                  z  |	j"                  dddddd œd!d"d#d$œ|	j$                  |	j&                  |	j$                  d%œ	d|dœt        j                  j!                  |«      |	j"                  |	j(                  z  |	j"                  d&d&id'd(d)d*œ|	j(                  |	j*                  |	j(                  d%œ	|	j,                  |	j.                  d+|	j0                  d,œd-d.d/d0|d1d1d2d2|d0d0d2d0d3œd4œ}|r|d5   d6   d7   j3                  d8d9d:œ«       |r|d5   d6   d;   j3                  d<d=i«       t        t        j                  j                  |d>«      d«      5 }t        j4                  ||d¬«       d d d «       y # 1 sw Y   �ŒáxY w# 1 sw Y   y xY w)?N©r,   Úfeature_extractionÚsequenceÚ	operationÚaudio_decoderÚAudioDecoder)ÚnameÚtypeÚSTFTÚSTFTNormi�  é    (�  ç        ç     ,?ç    €+0?ç    @0B?ç    @*P?g    à@Y?ç     -b?ç    `¼h?ç    (&p?ç    xnt?ç    Ø6y?ç     ~?g    L#‚?ç    œF…?g    H©ˆ?g    KŒ?g    Þ�?g    ˆ%’?g    bT”?g    L¢–?g    ™?g    ´š›?g    àDž?g    ¾† ?g    +ú¡?g    ¢|£?g    ¥?g    G®¦?g    A]¨?g    Þª?g    ÿæ«?g    ‰Á­?g    ^ª¯?g    ¯Ð°?g   €4Ó±?g    °Ü²?g   €í³?g    Dµ?g   €9"¶?g    ßF·?g   €!r¸?g    ï£¹?g   €3Üº?g   €Û¼?g   €Ò_½?g   €«¾?g   €\ü¿?g   €â©À?g   @”XÁ?g    8
Â?g   @Ã¾Â?g   @*vÃ?g   €a0Ä?g    ]íÄ?g   @­Å?g   ÀqoÆ?g   @r4Ç?g   €üÇ?g   À!ÆÈ?g    ·’É?g    ºaÊ?g   @3Ë?g   €ÓÌ?g   €ÏÜÌ?g   ÀµÍ?g   €b�Î?g   ÀÝkÏ?g    4%Ð?g   €y•Ð?g   @¸Ñ?g    éxÑ?g   àìÑ?g   @`Ò?g    àÔÒ?g   À�JÓ?g   ÀÁÓ?g   àR8Ô?g   €U°Ô?g    )Õ?g    x¢Õ?g   €ˆÖ?g   À8—Ö?g   @�×?g   @ZŽ×?g    »
Ø?g   À�‡Ø?g    øÙ?g   `Ä‚Ù?g    ù Ú?g   ÀŽÚ?g   `}þÚ?g   à¼}Û?g   `EýÛ?g   À}Ü?g   àýÜ?g    C}Ý?g    ŸýÝ?g    ~Þ?g   à®þÞ?g   €Sß?ç      à?g   `V@à?g    ¨€à?g   ÀòÀà?g   À0á?g   `^Aá?g   Àw�á?g   àxÁá?g   €]â?g   À!Aâ?g   €Á€â?g   à8Àâ?g    ƒÿâ?g    ž>ã?g   àƒ}ã?g   `1¼ã?g   `¢úã?g    Ó8ä?g   `¿vä?g   Àc´ä?g   à»ñä?g    Ä.å?g   €xkå?g   @Õ§å?g    Öãå?g   Àxæ?g   à·Zæ?g   @�•æ?g    þÏæ?g   Àý	ç?g    ‹Cç?g    ¤|ç?g   €Cµç?g   @fíç?g   À%è?g   €'\è?g   @¿’è?g   @ÌÈè?g   @Kþè?g   à83é?g   À‘gé?g   `R›é?g   ÀwÎé?g    þ ê?g   Àã2ê?g   À#dê?g    ¼”ê?g    ©Äê?g   Àçóê?g    u"ë?g   @OPë?g    r}ë?g    Û©ë?g   €‡Õë?g   €t ì?g   €Ÿ*ì?g   ÀTì?g    ¤|ì?g    y¤ì?g   @‚Ëì?ç   À»ñì?g   @$í?g   à¸;í?ç   €w_í?ç    ^‚í?ç    j¤í?g   €™Åí?g   @êåí?g   @Zî?g   €ç#î?g    �Aî?g   @R^î?g    ,zî?g   À•î?g   €¯î?g    6Èî?g   `]àî?g   @”÷î?ç    Ùï?g   €*#ï?g    ‡7ï?g   ÀíJï?g    ]]ï?ç   ÀÓnï?g    Qï?ç   ÀÓŽï?g    [�ï?ç   €åªï?g   àr·ï?ç    Ãï?ç   @’Íï?ç    #×ï?g   À³ßï?g    Cçï?ç   `Òíï?ç   €_óï?ç   àê÷ï?ç    tûï?ç   €úýï?ç    ~ÿï?é   rV   rU   rT   rS   rR   rQ   g   €Cçï?g    ³ßï?rP   rO   rN   g   Àr·ï?rM   g   àZ�ï?rL   g    Qï?rK   g   à\]ï?g   €íJï?g    ‡7ï?g   @*#ï?rJ   g    ”÷î?g   @]àî?g   À5Èî?g   `¯î?g   €•î?g   À+zî?g    R^î?g    �Aî?g   @ç#î?g    Zî?g    êåí?g   @™Åí?rI   rH   rG   g   À¸;í?g    $í?rF   g    ‚Ëì?g   €y¤ì?g   €¤|ì?g    Tì?g   `Ÿ*ì?g   `t ì?g   @‡Õë?g   àÚ©ë?g   àq}ë?g    OPë?g   @u"ë?g   €çóê?g    ¨Äê?g    »”ê?g   €#dê?g   @ã2ê?g   @þ ê?g   €wÎé?g    R›é?g   @‘gé?g   €83é?g    Kþè?g    ÌÈè?g   à¾’è?g   @'\è?g   `%è?g   Àeíç?g    Cµç?g   À£|ç?g   @‹Cç?g   `ý	ç?g    ýÏæ?g   À�•æ?g   €·Zæ?g   `xæ?g   @Öãå?g   àÔ§å?g    xkå?g   ÀÃ.å?g   €»ñä?g   @c´ä?g    ¿vä?g   €Ò8ä?g   à¡úã?g   À0¼ã?g   `ƒ}ã?g   €�>ã?g    ƒÿâ?g   @8Àâ?g    Á€â?g   @!Aâ?g    ]â?g   @xÁá?g   @w�á?g   à]Aá?g    0á?g   @òÀà?g    ¨€à?g   @V@à?rE   g   `Sß?g   À®þÞ?g   €~Þ?g    žýÝ?g   @C}Ý?g   €ýÜ?g   `}Ü?g    EýÛ?g   €¼}Û?g    }þÚ?g   `ŽÚ?g   Àø Ú?g    Ä‚Ù?g   @øÙ?g   `�‡Ø?g   @»
Ø?g   àYŽ×?g    �×?g   €8—Ö?g    ˆÖ?g    w¢Õ?g   À)Õ?g   @U°Ô?g   €R8Ô?g   @ÁÓ?g   @�JÓ?g   €ßÔÒ?g   À`Ò?g   @ìÑ?g   €èxÑ?g   À·Ñ?g    y•Ð?g   €3%Ð?g   ÀÜkÏ?g   @a�Î?g   ÀµÍ?g   €ÎÜÌ?g   €ÒÌ?g   @3Ë?g    ¹aÊ?g    ¶’É?g   € ÆÈ?g   @üÇ?g    q4Ç?g   €poÆ?g    ­Å?g    \íÄ?g   @`0Ä?g   @)vÃ?g   @Â¾Â?g    7
Â?g    “XÁ?g   @á©À?g   €Zü¿?g   €«¾?g   €Ð_½?g   €Ù¼?g   €1Üº?g    í£¹?g   €r¸?g    ÝF·?g   €7"¶?g    Bµ?g    í³?g    ®Ü²?g   €2Ó±?g    ­Ð°?g    Zª¯?g    †Á­?g    üæ«?g    Úª?g    >]¨?g    C®¦?g    ¥?g    ž|£?g    (ú¡?g    º† ?g    ÚDž?g    ®š›?g    ™?g    F¢–?g    ^T”?g    ‚%’?g    Ú�?g    KŒ?g    D©ˆ?rD   g    H#‚?rC   rB   rA   r@   r?   r>   g    À@Y?r=   r<   r;   r:   )Ún_fftÚframe_lengthÚ
hop_lengthÚ_comment)r4   r5   ÚattrsÚlog_mel_spectrogramÚLogMelSpectrumé   )Ú
chunk_sizerZ   rX   Ún_melé   )Úindentzaudio_processor_config.jsonÚwÚcpuÚmax_target_positionszonnxruntime-genai)Úlog_idÚprovider_optionsÚ	input_idszpast_key_self_%dzpast_value_self_%dzpast_key_cross_%dzpast_value_cross_%d)ri   Úpast_key_namesÚpast_value_namesÚcross_past_key_namesÚcross_past_value_namesÚlogitszpresent_key_self_%dzpresent_value_self_%d)rn   Úpresent_key_namesÚpresent_value_names)	Úsession_optionsÚfilenameÚ	head_sizeÚhidden_sizeÚinputsÚoutputsÚnum_attention_headsÚnum_hidden_layersÚnum_key_value_headsÚaudio_featuresÚencoder_hidden_stateszpresent_key_cross_%dzpresent_value_cross_%d)r{   Úcross_present_key_namesÚcross_present_value_namesÚwhisper)Úbos_token_idÚcontext_lengthÚdecoderÚencoderÚeos_token_idÚpad_token_idr5   Ú
vocab_sizer9   FTç      ð?r   rW   )Údiversity_penaltyÚ	do_sampleÚearly_stoppingÚlength_penaltyÚ
max_lengthÚ
min_lengthÚno_repeat_ngram_sizeÚ	num_beamsÚnum_return_sequencesÚpast_present_share_bufferÚrepetition_penaltyÚtemperatureÚtop_kÚtop_p)ÚmodelÚsearchr•   r�   ru   Úpast_sequence_lengthÚcache_indirection)r—   r˜   rv   Úoutput_cross_qk_nameszoutput_cross_qk_%dzgenai_config.json)r	   Úfrom_pretrainedÚsave_pretrainedr   r   Únum_mel_binsÚjsonÚdumpsÚopenr   r   r    ÚwriteÚgetattrr‹   r   ÚbasenameÚd_modelÚdecoder_attention_headsÚdecoder_layersÚencoder_attention_headsÚencoder_layersrƒ   r„   r…   ÚupdateÚdump)r   r&   r'   r(   r)   r*   r+   r   r,   ÚconfigÚ	tokenizerÚ	processorÚaudio_processor_cfgÚaudio_processor_jsonÚfrh   r€   Úgenai_configs                     r#   Úsave_processingzWhisperHelper.save_processingF   s‚  € ô ×.Ñ.Ð/AÈYÔWˆØ×Ñ˜zÔ*ä!×1Ñ1Ð2DÐPYÔZˆ	Ø×!Ñ! *Ô-ä$×4Ñ4Ð5GÐS\Ô]ˆ	Ø×!Ñ! *Ô-ñ -Øð !ØØ ¨?ÀNÑ"SÐTà#Ø$*Ø$.à),Ø03Ø.1òQ-"ñ	V&ñZ&ð\ð| $Ø$9Ø$4Ø46ÀcÐTWÐbh×buÑbuÑ%vñ&ððfðh#ðj
ÐôV  $Ÿz™zÐ*=ÀaÔHÐä”"—'‘'—,‘,˜zÐ+HÓIÈ3ÓOð 	*ÐSTØ�G‰GÐ(Ô)÷	*ð "'¨(Ñ!2™2¸X¸JÈÐ9LÐ8MÐô ! Ð)?ÀÓFÒ[È&×J[ÑJ[ˆð !'× 3Ñ 3Ø"0ð #6Ø,<ñ(ô !#§¡× 0Ñ 0°Ó >Ø!'§¡°6×3QÑ3QÑ!QØ#)§>¡>à%0Ø*<Ø,@Ø0CØ2Gñð #+Ø-BØ/Fñ ð
 ,2×+IÑ+IØ)/×)>Ñ)>Ø+1×+IÑ+Iñ-ð4 #6Ø,<ñ(ô !#§¡× 0Ñ 0°Ó >Ø!'§¡°6×3QÑ3QÑ!QØ#)§>¡>Ø/Ð1AÐBà1HØ3IØ5Mñ ð
 ,2×+IÑ+IØ)/×)>Ñ)>Ø+1×+IÑ+Iñ!ð$ !'× 3Ñ 3Ø &× 3Ñ 3Ø!Ø$×/Ñ/ña1ðf &)Ø"Ø"&Ø"%Ø,ØØ()ØØ()Ø-CØ&)Ø"ØØññgC
ˆñV "Ø˜Ñ! )Ñ,¨XÑ6×=Ñ=à,BØ)<ñôñ Ø˜Ñ! )Ñ,¨YÑ7×>Ñ>à+Ð-Aðôô ”"—'‘'—,‘,˜zÐ+>Ó?ÀÓEð 	1ÈÜ�I‰I�l A¨aÕ0÷	1ð 	1÷C	*ñ 	*ú÷B	1ð 	1ús   Ã-KÊ<K+ËK(Ë+K4Ú
model_implÚdeviceÚdtypeÚmerge_encoder_and_decoder_initÚno_beam_search_opc                 óä  — |dk(  rt        j                  | |d¬«      }nRddl}	t        j                  j                  | «      s| j                  d«      d   dd }
n| }
|	j                  |
||d	¬
«      }|j                  «       j                  |¬«       |dk(  r|j                  |¬«       t        j                  | |¬«      }t        ||||«      j                  «       }d|i}|r0t        ||||«      j                  «       }|j                  d|i«       n/t        |||«      j                  «       }|j                  ||dœ«       |r.t        |||«      j                  «       }|j                  d|i«       |S )a|  Load model given a pretrained name or path, then build models for ONNX conversion.

        Args:
            model_name_or_path (str): pretrained model name or path
            model_impl (str): library to load model from
            cache_dir (str): cache directory
            device (torch.device): device to run the model
            dtype (torch.dtype): dtype to run the model
            merge_encoder_and_decoder_init (bool, optional): Whether merge encoder and decoder initialization into one ONNX model. Defaults to True.
            no_beam_search_op (bool, optional): Whether to use beam search op or not. Defaults to False.
            output_qk (bool, optional): Whether to output QKs to calculate batched jump times for word-level timestamps. Defaults to False.
        Returns:
            Dict[str, torch.nn.Module]: mapping from name to modules for ONNX conversion.
        ÚhfÚeager©r,   Úattn_implementationr   Nr   r   é   T)Údownload_rootÚ	in_memory©r³   ©r´   r.   r�   r‚   )r‚   Údecoder_initÚ
jump_times)r
   rš   r~   r   r   Úexistsr   Ú
load_modelÚevalÚtor	   r   r   r¨   r   r   )r   r²   r,   r³   r´   rµ   r¶   r)   r•   r~   Úname_or_pathrª   r�   Ú
componentsÚencoder_decoder_initr‚   Úbatched_jump_timess                    r#   rÄ   zWhisperHelper.load_modelp  sj  € ð4 ˜Òä3×CÑCØ"¨iÈWô‰Eó
 ä—7‘7—>‘>Ð"4Ô5Ø1×7Ñ7¸Ó<¸RÑ@ÀÀÐD‘à1�Ø×&Ñ& |°VÈ9Ð`dÐ&ÓeˆEð 	�
‰
‹�‰˜vˆÔ&Ø˜ÒØ�H‰H˜5ˆHÔ!Ü×.Ñ.Ð/AÈYÔWˆô ! ¨°
Ð<MÓN×SÑSÓUˆØ Ð)ˆ
Ù)Ü#<¸VÀUÈJÐXiÓ#j×#oÑ#oÓ#qÐ Ø×Ñ˜yÐ*>Ð?Õ@ä$ V¨U°JÓ?×DÑDÓFˆGØ×Ñ¨'À7ÑKÔLáÜ!1°&¸&À)Ó!L×!QÑ!QÓ!SÐØ×Ñ˜|Ð-?Ð@ÔAØÐr%   r•   Úonnx_model_pathÚverboseÚuse_external_data_formatÚuse_fp16_inputsÚuse_int32_inputsÚuse_encoder_hidden_statesÚuse_kv_cache_inputsc	           
      ój  — t        | t        «      r| j                  |||||«       yt        | t        «      r| j                  ||||||«       yt        | t        «      r| j                  ||||||||«       yt        | t
        «      r| j                  ||||||«       yt        dt        | «      › �«      ‚)a/  Export model component to ONNX

        Args:
            model (class): PyTorch class to export
            onnx_model_path (str): path to save ONNX model
            provider (str): provider to use for verifying parity on ONNX model
            verbose (bool): print verbose information.
            use_external_data_format (bool): use external data format or not.
            use_fp16_inputs (bool): use float16 inputs for the audio_features, encoder_hidden_states, logits, and KV caches.
            use_int32_inputs (bool): use int32 inputs for the decoder_input_ids.
            use_encoder_hidden_states (bool): use encoder_hidden_states as model input for decoder-init/decoder-without-past models.
            use_kv_cache_inputs (bool): use KV caches as model inputs for decoder-with-past models.
        z%Unknown instance for model detected: N)Ú
isinstancer   Úexport_onnxr   r   r   Ú
ValueErrorr5   )	r•   rË   r&   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   s	            r#   rÔ   zWhisperHelper.export_onnx®  sÐ   € ô2 �eœ^Ô,Ø×ÑØØØØ(Øõô ˜Ô8Ô9Ø×ÑØØØØ(ØØ õô ˜œ~Ô.Ø×ÑØØØØ(ØØ Ø)Ø#õ	ô ˜Ô/Ô0Ø×ÑØØØØ(ØØ õô ÐDÄTÈ%Ã[ÀMÐRÓSÐSr%   Úoptimized_model_pathÚ
is_float16rw   rt   Únum_decoder_layersÚuse_gpuÚ
is_decoderc           
      ó  — ddl m}  |d«      }d|_        d|_        t	        | d||d||d¬«      }|	rD|
rB|rt        |«      \  }}t        ||«      }|r$t        |t        t        dd|z  d«      «      ¬«      }|j                  ||d¬	«       y
)zHOptimize ONNX model with an option to convert it to use mixed precision.r   )ÚFusionOptionsÚbartTF)Ú
model_typeÚ	num_headsrt   Ú	opt_levelÚoptimization_optionsrÙ   Úonly_onnxruntimeé   )Úskip_node_idxs)Úall_tensors_to_one_fileN)Úfusion_optionsrÜ   Úuse_multi_head_attentionÚ!disable_multi_head_attention_biasr   r   r   r   ÚlistÚrangeÚsave_model_to_file)rË   rÖ   r×   rw   rt   rØ   rÍ   rÙ   r&   rÚ   r¶   r(   r)   rÜ   rá   ÚmÚpast_seq_len_names                    r#   Úoptimize_onnxzWhisperHelper.optimize_onnxï  s­   € õ$ 	1á,¨VÓ4ÐØ8<ÐÔ5ØAFÐÔ>äØØØ)Ø#ØØ!5ØØ"ô	
ˆñ Ñ+Ù%ô (@ÀÓ'BÑ$�Ð$Ü0°Ð4EÓF�áÜ(¨¼4ÄÀaÈÐM_ÑI_ÐabÓ@cÓ;dÔe�à	×ÑÐ1Ð3KÐeiÐÕjr%   r¬   Úpt_modelÚ
batch_sizeÚprompt_modec           
      ó,  — 	 ddl m} ddl m}  |d	d
d¬«      }g }	|dk(  r | |d   d   d   gd¬«      j                  }
ni | |d   d   d   gd¬«      j                   | |d   d   d   gd¬«      j                  g}	t        |	«      |k(  sJ ‚t        j                  |	d   |	d   f«      }
d\  }}}}d\  }}|
j                  |«      ||||||dddœ	}|róddg}|D �cg c]  }| j                  |«      ‘Œ }}g }g }t        |«      D ]¶  }t        j                  ||   «      j                  |¬«      |d<   |	|   j                  |«      |d<    |j                   di |¤Žj#                  «       j%                  «       j'                  «       }|j)                  |«       |j)                  | j+                  |d¬«      d   «       Œ¸ |
|d<   |d= n`g } |j                   di |¤Žj#                  «       j%                  «       j'                  «       }| j+                  |d¬«      d   g}t-        |«      }|d= |d= ||||fS # t        $ rU}t        j	                  d|› �d¬«       d}t        j                  d|› d�«       t        j                  |«       Y d }~�Œ�d }~ww xY wc c}w )Nr   )Úload_datasetz.An error occurred while importing `datasets`: T)Úexc_infozpip install datasetszCCould not import `datasets`. Attempting to install `datasets` via `z`.z)hf-internal-testing/librispeech_asr_dummyÚcleanÚ
validation)r   rW   ÚaudioÚarrayÚpt)Úreturn_tensorsé   )r_   r   rW   rW   )r†   r†   )	Úinput_featuresr‹   rŒ   rŽ   r�   rŠ   r‘   r‰   Ú	use_cachezJohn has doubtszMaria has grave doubtsr¿   Ú
prompt_idsrü   ©Úskip_special_tokensr‰   rý   © )Údatasetsró   Ú	ExceptionÚloggerÚerrorÚwarningr   Úsystemrü   ÚlenÚtorchÚcatrÆ   Úget_prompt_idsrê   Ú
from_numpyÚgenerateÚdetachre   ÚnumpyÚappendÚbatch_decoderé   )r¬   rï   r³   rð   rñ   ró   ÚeÚinstall_cmdÚdsÚinput_features_rü   r‹   rŒ   rŽ   r�   rŠ   r‘   ru   ÚpromptsÚprþ   Úpt_transcriptionÚ
pt_outputsÚiÚ	pt_outputs                            r#   Ú pt_transcription_for_verify_onnxz.WhisperHelper.pt_transcription_for_verify_onnx   sû  € ð	#Ý-õ 	*áÐEÀwÐVbÔcˆØˆØ˜Š?Ù&¨¨1©¨g©°wÑ(?Ð'@ÐQUÔV×eÑe‰Nñ ˜2˜a™5 ™>¨'Ñ2Ð3ÀDÔI×XÑXÙ˜2˜a™5 ™>¨'Ñ2Ð3ÀDÔI×XÑXðˆOô �Ó'¨:Ò5Ð5Ð5Ü"ŸY™Y¨¸Ñ(:¸OÈAÑ<NÐ'OÓPˆNàBMÑ?ˆ
�J 	Ð+?Ø-5Ñ*ˆÐ*à,×/Ñ/°Ó7Ø$Ø$Ø"Ø$8Ø,Ø"4Ø"Øñ

ˆñ Ø(Ð*BÐCˆGØ?FÖG¸!˜)×2Ñ2°1Õ5ÐGˆJÐGØ!ÐØˆJô ˜:Ó&ò h�Ü',×'7Ñ'7¸
À1¹Ó'F×'IÑ'IÐQWÐ'IÓ'X��|Ñ$Ø+:¸1Ñ+=×+@Ñ+@ÀÓ+H�Ð'Ñ(Ø-˜H×-Ñ-Ñ7°Ñ7×>Ñ>Ó@×DÑDÓF×LÑLÓN�	Ø×!Ñ! )Ô,Ø ×'Ñ'¨	×(>Ñ(>¸yÐ^bÐ(>Ó(cÐdeÑ(fÕgðhð (6ˆFÐ#Ñ$Ø�|Ñ$àˆJØ*˜×*Ñ*Ñ4¨VÑ4×;Ñ;Ó=×AÑAÓC×IÑIÓKˆJØ )× 6Ñ 6°zÐW[Ð 6Ó \Ð]^Ñ _Ð`ÐÜ˜jÓ)ˆJØÐ#Ð$Ø�;ÐØÐ'¨°ZÐ?Ð?øôs ò 	#Ü�L‰LÐIÈ!ÈÐMÐX\ˆLÔ]Ø0ˆKÜ�N‰NÐ`ÐalÐ`mÐmoÐpÔqÜ�I‰I�k×"Ò"ûð		#üòH Hs   ‚H0 ÃJÈ0	JÈ9A
J	Ê	Jc                 óJ   — | dkD  r|rd}d}d}d}||||h}|S d}d}d}	|||	h}|S )	NrW   z{ John has doubts whether Sir Frederick Layton's work is really Greek after all and can discover in it but little of Rocky Izy John has doubts whether Sir Frederick Latins work is really Greek after all and can discover in it but little of Rocky Iz€ Maria has grave doubts whether Sir Frederick Layton's work is really Greek after all and can discover in it but little of Rockyz€ Maria has grave doubts whether Sir Frederick Latins work is really Greek after all and can discover in it but little of Rocky IzX Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.zY Mr. Quilter is the apostle of the middle classes, and we are glad to welcome his gospel.zZ "Mr. Quilter is the apostle of the middle classes, and we are glad to welcome his gospel.r  )
rð   rñ   Ú'expected_transcription_no_comma_prompt1Ú)expected_transcription_misspelled_prompt1Ú'expected_transcription_no_comma_prompt2Ú)expected_transcription_misspelled_prompt2Úexpected_transcription_optionsÚexpected_transcription_no_commaÚ!expected_transcription_with_commaÚ+expected_transcription_with_quote_and_commas
             r#   Úselect_transcription_optionsz*WhisperHelper.select_transcription_optionsf  s‰   € ð
 ˜Š>™kð 7tÐ3ð 9tÐ5ð 7yÐ3ð 9{Ð5à7Ø7Ø9Ø9ð	.Ð*ð* .Ð-ð kð ,ð lð .ð mð 8ð 0Ø1Ø;ð.Ð*ð
 .Ð-r%   r  Úort_outputsr  c                 óX  — | |   ||   }}|j                   |j                   }}||k7  ret        |«      dkD  r|d   }|j                   }t        |«      dkD  r|d   }|j                   }|d   |d   k7  rt        |d   |d   «      }|d| }|d| }|j                   |j                   k(  sJ ‚||fS )z8Get PyTorch and ONNX Runtime output token ids at index irW   r   N)Úshaper  Úmin)r  r'  r  r  Ú
ort_outputÚpt_shapeÚ	ort_shapeÚmin_lens           r#   Úget_outputszWhisperHelper.get_outputs‡  sÏ   € ð !+¨1¡¨{¸1©~�:ˆ	Ø'Ÿo™o¨z×/?Ñ/?�)ˆð �yÒ Ü�8‹}˜qÒ Ø% a™L�	Ø$Ÿ?™?�Ü�9‹~ Ò!Ø'¨™]�
Ø&×,Ñ,�	Ø˜‰{˜i¨™lÒ*Ü˜h q™k¨9°Q©<Ó8�Ø% h wÐ/�	Ø'¨¨Ð1�
à�‰ *×"2Ñ"2Ò2Ð2Ð2Ø˜*Ð$Ð$r%   Úort_sessionc                 óè	  — t        j                  | |d¬«      j                  |«      }t        j                  | |¬«      }t	        j                  | |¬«      }t
        j                  |||||¬«      \  }	}
}}|j                  g}|j                  dd¬«      }|D �cg c]  }|d   ‘Œ	 }}||z   }|j                  «       D �cg c]  }|j                  ‘Œ }}|j                  «       D �cg c]  }|j                  ‘Œ }}t        j                  t        j                  t        j                  t        j                   t        j"                  t        j$                  d	œ}d
|v }t'        ||d¬«      D �]5  \  }}|dk(  r3|	|   j)                  «       j+                  «       j-                  «       |	|<   Œ?|dk(  r(t        j.                  |j0                  ||   ¬«      |	|<   Œl|dk(  r*t        j.                  ||j0                  f||   ¬«      |	|<   Œ›|dk(  rÊ|s&|r|gn|g}t        j2                  |||   ¬«      |	|<   ŒÈg }t5        |«      D ]$  }|j7                  ||   j9                  «       «       Œ& t;        d„ |D «       «      }g }|D ]6  }g |¢|j<                  g|t?        |«      z
  z  ¢}|j7                  ||z   «       Œ8 t        j2                  |||   ¬«      |	|<   �Œj|dk(  r t        j2                  dg||   ¬«      |	|<   �Œ�|dk(  r"t        j2                  ddgg||   ¬«      |	|<   �Œ¶|d
k(  r5t        j@                  t        j2                  |g||   ¬«      |d«      |	|<   �Œð|dk(  r t        j2                  dg||   ¬«      |	|<   �Œt        j2                  |	|   g||   ¬«      |	|<   �Œ8 |jC                  d|	«      d   dd…ddd…f   }|jE                  |d¬«      } t
        jG                  ||«      }!d}"t5        |«      D ]H  }t
        jI                  |||«      \  }#}$|"t        jJ                  |#|$«      z  }"|"|
|   |!v xr | |   |!v z  }"ŒJ d}%|"sit5        |«      D ][  }t
        jI                  |||«      \  }#}$|#|$z
  }&t;        |&jM                  «       |&j;                  «       tN        ¬«      }'t;        |%|'«      }%Œ] |%dk7  r0tP        jS                  d|
› �«       tP        jS                  d| › �«       yc c}w c c}w c c}w )zRCompare the result from PyTorch and ONNX Runtime to verify the ONNX model is good.r¹   rº   r.   )rð   rñ   ÚenglishÚ
transcribe)ÚlanguageÚtaskrW   )ztensor(float)ztensor(float16)ztensor(int64)ztensor(int32)ztensor(int8)ztensor(uint8)Úextra_decoding_idsF)Ústrictrü   Ú
vocab_maskrÀ   Úprefix_vocab_maskÚdecoder_input_idsc              3   ó2   K  — | ]  }t        |«      –— Œ y ­w)N)r  )Ú.0r  s     r#   ú	<genexpr>z,WhisperHelper.verify_onnx.<locals>.<genexpr>ß  s   è ø€ Ò!>¨Q¤# a§&Ñ!>ùs   ‚Úlogits_processorÚcross_qk_layer_headr   r’   r†   NTrÿ   )ÚkeyzPyTorch outputs: zONNX Runtime outputs: )*r
   rš   rÆ   r   r	   r   r  Údecoder_start_token_idÚget_decoder_prompt_idsÚ
get_inputsr4   r5   ÚnpÚfloat32Úfloat16Úint64Úint32Úint8Úuint8Úzipr  re   r  Úonesr…   rø   rê   r  ÚtolistÚmaxr„   r  ÚrepeatÚrunr  r&  r/  Úallcloser*  Úabsr  r  )(r   r,   r0  r³   rð   rñ   rï   r¬   rª   ru   r  r  Údecoder_prompt_idsÚstart_idrþ   ÚtokenÚforced_decoder_idsÚentryÚ	ort_namesÚ
ort_dtypesÚ	ort_to_npÚuse_extra_decoding_idsr4   r´   Úraw_input_idsÚort_promptsr  Úmax_lenÚpadded_promptsr  Úpadded_promptr'  Úort_transcriptionr"  Úparityr  r+  Úmax_diffÚdiffÚ
max_diff_is(                                           r#   Úverify_onnxzWhisperHelper.verify_onnx¢  s  € ô 3×BÑBØ¨)Èô
ç
‰"ˆV‹*ð 	ô %×4Ñ4Ð5GÐS\Ô]ˆ	Ü×.Ñ.Ð/AÈYÔWˆäCP×CqÑCqØØØØ!Ø#ð Dró D
Ñ@ˆÐ  *Ð.@ð ×1Ñ1Ð2ˆØ×5Ñ5¸yÈ|Ð5Ó\ˆ
Ø,6Ö7 5�e˜A“hÐ7ˆ
Ð7Ø%¨
Ñ2Ðà-8×-CÑ-CÓ-EÖF E�U—Z“ZÐFˆ	ÐFØ.9×.DÑ.DÓ.FÖG U�e—j“jÐGˆ
ÐGäŸZ™ZÜ!Ÿz™zÜŸX™XÜŸX™XÜŸG™GÜŸX™Xñ
ˆ	ð "6¸Ð!BÐÜ˜y¨*¸UÔCó #	P‰KˆD�%ØÐ'Ò'Ø% d™|×2Ñ2Ó4×8Ñ8Ó:×@Ñ@ÓB��t’Ø˜Ò%Ü!Ÿw™w v×'8Ñ'8À	È%Ñ@PÔQ��t’ØÐ,Ò,Ü!Ÿw™w¨
°F×4EÑ4EÐ'FÈiÐX]ÑN^Ô_��t’ØÐ,Ò,Ù"Ù2H X¡JÐOaÐNb�MÜ#%§8¡8¨MÀÈ5ÑAQÔ#R�F˜4’Lð #%�KÜ" :Ó.ò K˜Ø#×*Ñ*Ð+=¸aÑ+@×+GÑ+GÓ+IÕJðKä!Ñ!>°+Ô!>Ó>�GØ%'�NØ(ò R˜Ø([¨!Ð([°×0CÑ0CÐ/DÈÔRUÐVWÓRXÑHXÑ/YÐ([˜Ø&×-Ñ-¨mÐ>PÑ.PÕQðRô $&§8¡8¨NÀ)ÈEÑBRÔ#S�F˜4“LØÐ+Ò+Ü!Ÿx™x¨¨°9¸UÑ3CÔD��t“ØÐ.Ò.Ü!Ÿx™x¨!¨Q¨¨¸	À%Ñ8HÔI��t“ØÐ-Ò-Ü!Ÿy™y¬¯©°:°,ÀiÐPUÑFVÔ)WÐYcÐefÓg��t“Ø˜Ò&Ü!Ÿx™x¨¨°Y¸uÑ5EÔF��t“ä!Ÿx™x¨°©¨¸iÈÑ>NÔO��t“ðG#	PðJ "—o‘o d¨FÓ3°AÑ6²q¸!ºQ°wÑ?ˆØ%×2Ñ2°;ÐTXÐ2ÓYÐÜ)6×)SÑ)SÐT^Ð`kÓ)lÐ&àˆÜ�zÓ"ò 
	ˆAÜ$1×$=Ñ$=¸jÈ+ÐWXÓ$YÑ!ˆI�zð ”b—k‘k )¨ZÓ8Ñ8ˆFð Ø  Ñ#Ð'EÐEò KØ% aÑ(Ð,JÐJñ‰Fð
	ð ˆáÜ˜:Ó&ò 5�Ü(5×(AÑ(AÀ*ÈkÐ[\Ó(]Ñ%�	˜:Ø  :Ñ-�ä  §¡£¨T¯X©X«Z¼SÔA�
Ü˜x¨Ó4‘ð5ð �qŠ=Ü�N‰NÐ.Ð/?Ð.@ÐAÔBÜ�N‰NÐ3Ð4EÐ3FÐGÔHàùòe 8ùò GùÚGs   ÂS%Â>S*Ã%S/)Ú F)TFF)FFre   FFFF)rW   F)Ú__name__Ú
__module__Ú__qualname__ÚstaticmethodÚstrÚboolr$   r±   r	  r³   r´   ÚdictÚnnÚModulerÄ   r   r   r   rÔ   Úintrî   r   r  r&  rD  Úndarrayr/  r   rf  r  r%   r#   r   r   )   sµ  „ Øð Ø ñ	=Øð=àð=ð ð=ð ð	=ð
 
ò=ó ð=ð6 ðg1Øðg1àðg1ð ,0ðg1ð !%ð	g1ð
 ðg1ð ðg1ð ðg1ð ðg1ð ðg1ð 
òg1ó ðg1ðR ð 04Ø"'Øñ;Øð;àð;ð ð;ð —‘ð	;ð
 �{‰{ð;ð )-ð;ð  ð;ð ð;ð 
ˆc�5—8‘8—?‘?Ð"Ñ	#ò;ó ð;ðz ð>TØÐ 9Ñ9¸NÑJð>Tàð>Tð ð>Tð ð	>Tð
 #'ð>Tð ð>Tð ð>Tð $(ð>Tð "ò>Tó ð>Tð@ ð */ØØØ Ø"'Ø',Øñ.kØð.kà!ð.kð ð.kð !ð	.kð
 ð.kð  ð.kð #'ð.kð ð.kð ð.kð ð.kð  ð.kð !%ð.kð ò.kó ð.kð` ð
 Ø!ñC@Ø#ðC@à—(‘(—/‘/ðC@ð —‘ðC@ð ð	C@ð
 òC@ó ðC@ðJ ð.Øð.àò.ó ð.ð@ ð%Ø—J‘Jð%à—Z‘Zð%ð ò%ó ð%ð4 ð Ø!ñkØðkàðkð &ðkð —‘ð	kð
 ðkð òkó ñkr%   r   )"r�   Úloggingr   Úpathlibr   r  rD  r	  Úconvert_generationr   r   r   Ú	optimizerr   Útransformersr   r	   r
   r   Úwhisper_decoderr   Úwhisper_encoderr   Úwhisper_encoder_decoder_initr   Úwhisper_jump_timesr   Úonnxruntimer   Ú	getLoggerrh  r  ÚPRETRAINED_WHISPER_MODELSr   r  r%   r#   ú<module>r     s]   ðó Û Û 	Ý ã Û ß kÑ kÝ $ß hÓ hÝ *Ý *Ý BÝ /å (à	ˆ×	Ñ	˜8Ó	$€òÐ ÷ eò er%   