ó
    �®žjDu  ã                   ót  • % S SK r S SKrS SKrS SKrS SKJr  S SKJr  S SKJ	r	J
r
  S SKJrJrJrJrJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJr  S SKJr  S SK J!r!  S SK"J#r#J$r$J%r%J&r&  S SK'J(r(  S SK)J*r*  S SK+J,r,J-r-  \ R\                  " \/5      r0Sr1\	\2   \3S'    Sr4\	\5   \3S'   SSSSSSS.r6S\5S\54S jr7S\8S    S!\SS4S" jr9 " S# S$\5      r: " S% S \5      r;S&S'S(S)S*.r<\=\5\>\5\54   4   \3S+'    " S, S-5      r? " S. S/5      r@ " S0 S15      rAS2\8S    S\8S    4S3 jrB " S4 S5\
5      rC " S6 S75      rDg)8é    N)ÚBytesIO)ÚPath)ÚFinalÚProtocol)ÚContentLayerÚDocItemLabelÚDoclingDocumentÚDocumentOriginÚTrackSource)Ú	BaseModelÚField)ÚAbstractDocumentBackend)ÚNoOpBackend)ÚAcceleratorOptions)ÚConversionStatusÚDoclingComponentTypeÚ	ErrorItem)ÚConversionResult)ÚAsrPipelineOptions)ÚInlineAsrMlxWhisperOptionsÚInlineAsrNativeWhisperOptionsÚInlineAsrOptionsÚInlineAsrWhisperS2TOptions)ÚBasePipeline)Údecide_device)ÚProfilingScopeÚTimeRecordergü©ñÒMbP?ÚZERO_DURATION_SEGMENT_EPSzÝFFmpeg is required for audio processing but was not found on PATH. Install it with your system package manager (e.g., 'brew install ffmpeg' on macOS, 'apt-get install ffmpeg' on Linux, 'winget install ffmpeg' on Windows).ÚMISSING_FFMPEG_MESSAGEúaudio/x-wavz	audio/mp3z	audio/m4az	audio/aacz	audio/oggz
audio/flac)ú.wavz.mp3z.m4az.aacz.oggz.flacÚfilenameÚreturnc                 ót   • [        U 5      R                  R                  5       n[        R	                  US5      $ )Nr    )r   ÚsuffixÚlowerÚ_AUDIO_SUFFIX_TO_MIMETYPEÚget)r"   r%   s     Ú]/home/mande/repo/quber/.venv/lib/python3.13/site-packages/docling/pipeline/asr_transcriber.pyÚ_audio_mimetyper*   H   s-   € Ü�(‹^×"Ñ"×(Ñ(Ó*€FÜ$×(Ñ(¨°Ó?Ð?ó    ÚconversationÚ_ConversationItemÚconv_resc                 ó†  • UR                   R                  R                  =(       d    Sn[        U[	        U5      UR                   R
                  S9n[        UR                   R                  R                  =(       d    SUS9Ul        U  GHJ  nUR                  bŽ  UR                  b�  UR                  UR                  ::  ag  UR                  R                  5       (       aH  [        R                  SUR                   SUR                   S35        UR                  [        -   Ul
        UR                  c  M®  UR                  c  M½  UR                  R                  5       (       d  MÞ   [!        UR                  UR                  UR"                  S9nUR                  R%                  [&        R(                  UR                  [*        R,                  US	9nGMM     g! [.         a\  n[        R                  S
UR                   SUR                   SUR"                   SUR                  SS  SU S35         SnAGM±  SnAff = f)z<Process the conversation items and add them to the document.z	audio.wav)r"   ÚmimetypeÚbinary_hash)ÚnameÚoriginNzZero-duration ASR segment at zs: 'z' - adjusting end_time)Ú
start_timeÚend_timeÚvoice)ÚlabelÚtextÚcontent_layerÚsourcez4Failed to add conversation item to document (start: zs, end: zs, speaker: z	, text: 'é2   z...'): z2. Skipping this item and continuing with the rest.)ÚinputÚfiler2   r
   r*   Údocument_hashr	   ÚstemÚdocumentr4   r5   r8   ÚstripÚ_logÚwarningr   r   ÚspeakerÚadd_textr   ÚTEXTr   ÚBODYÚ	Exception)r,   r.   r"   r3   ÚcitemÚtrackÚ_Úes           r)   Ú_process_conversationrM   M   sò  € ð
 �~‰~×"Ñ"×'Ñ'×6¨;€HÜØÜ  Ó*Ø—N‘N×0Ñ0ñ€Fô
 (Ø�^‰^× Ñ ×%Ñ%×4¨¸Vñ€HÔô ˆð ×ÑÑ(Ø—‘Ñ*Ø—‘ %×"2Ñ"2Ó2Ø—
‘
× Ñ ×"Ñ"ä�L‰LØ/°×0@Ñ0@Ð/Að BØ—J‘J�<Ð5ð7ôð #×-Ñ-Ô0IÑIˆEŒNð ×ÑÓ(Ø—‘Ó*Ø—
‘
× Ñ ×"Ó"ðÜ%0Ø$×/Ñ/Ø"Ÿ^™^ØŸ-™-ñ&�ð
 ×%Ñ%×.Ñ.Ü&×+Ñ+ØŸ™Ü".×"3Ñ"3Ø ð	 /ð “ò5 øô@ ó Ü—‘ðØ$×/Ñ/Ð0°¸¿¹Ð8Hð I Ø %§¡˜¨i¸¿
¹
À3ÀB¸Ð7HÈØ�cÐKðMôö ûðús   Å)A+GÇ
I Ç$AH;È;I c                   ó^   • \ rS rSr% \\S'   \" SSS9r\S-  \S'   \" SSSS	9r	\S-  \S
'   Sr
g)Ú_ConversationWordé†   r8   Nú&Start time in seconds from video start©Údescriptionr4   r   ú$End time in seconds from video start©ÚgerS   r5   © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__ÚstrÚ__annotations__r   r4   Úfloatr5   Ú__static_attributes__rW   r+   r)   rO   rO   †   sA   ‡ Ø
ƒIÙ$ØÐBñ €J�˜‘ó ñ #Ø�Ð Fñ€Hˆe�d‰lö r+   rO   c                   óØ   • \ rS rSr% \\S'   \" SSS9r\S-  \S'   \" SSSS	9r	\S-  \S
'   \" SSS9r
\S-  \S'   \" SSS9r\S-  \S'   \" SSS9r\\   S-  \S'   S rS rS\4S jrSrg)r-   é�   r8   NrQ   rR   r4   r   rT   rU   r5   zNumeric speaker identifierÚ
speaker_idz.Speaker name, defaults to speaker-{speaker_id}rD   z!Individual words with time-stampsÚwordsc                 ój   • [        U[        5      (       d  [        $ U R                  UR                  :  $ ©N©Ú
isinstancer-   ÚNotImplementedr4   ©ÚselfÚothers     r)   Ú__lt__Ú_ConversationItem.__lt__    s+   € Ü˜%Ô!2×3Ñ3Ü!Ð!Ø�‰ ×!1Ñ!1Ñ1Ð1r+   c                 ój   • [        U[        5      (       d  [        $ U R                  UR                  :H  $ re   rf   ri   s     r)   Ú__eq__Ú_ConversationItem.__eq__¥   s+   € Ü˜%Ô!2×3Ñ3Ü!Ð!Ø�‰ %×"2Ñ"2Ñ2Ð2r+   r#   c                 óÚ   • SnU R                   b-  U R                  b   USU R                    SU R                   S3-  nU R                  b  USU R                   S3-  nXR                  -  nU$ )z)Format the conversation entry as a stringÚ z[time: Ú-z] z	[speaker:)r4   r5   rD   r8   )rj   Úresults     r)   Ú	to_stringÚ_ConversationItem.to_stringª   sn   € àˆØ�O‰OÑ'¨d¯m©mÑ.GØ˜ §¡Ð0°°$·-±-°ÀÐCÑCˆFà�<‰<Ñ#Ø˜	 $§,¡, ¨rÐ2Ñ2ˆFà—)‘)ÑˆØˆr+   rW   )rX   rY   rZ   r[   r\   r]   r   r4   r^   r5   rb   ÚintrD   rc   ÚlistrO   rl   ro   ru   r_   rW   r+   r)   r-   r-   �   s®   ‡ Ø
ƒIÙ$ØÐBñ €J�˜‘ó ñ #Ø�Ð Fñ€Hˆe�d‰ló ñ # 4Ð5QÑR€J��d‘
ÓRÙØÐJñ€GˆS�4‰Zó ñ -2ØÐ=ñ-€Eˆ4Ð!Ñ" TÑ)ó ò2ò
3ð

˜3÷ 
r+   )zdistil-whisper/distil-small.enúoriginal-model.bin)zdistil-whisper/distil-medium.enry   )z%distil-whisper/distil-large-v3-openaiú	model.bin)z'distil-whisper/distil-large-v3.5-openairz   )zdistil-small.enzdistil-medium.enúdistil-large-v3údistil-large-v3.5Ú"_DISTIL_WHISPER_OPENAI_CHECKPOINTSc                   ó^   • \ rS rSrS\S\S-  S\S\4S jrS\	S	\	4S
 jr
S\S	\\   4S jrSrg)Ú_NativeWhisperModeléÂ   ÚenabledÚartifacts_pathNÚaccelerator_optionsÚasr_optionsc                 óÈ  • Xl         [        R                  SU 35        [        R                  SU 35        U R                   (       Ga(   SSKnX@l        UR                  U l	        [        UR                  UR                  S9U l        [        R                  S	U R                   35        UR                  U l        [        R                  S
U R                   S35        [        R!                  U R                  5      nUbt  SSKJn  SSKJn  Uu  pš[        R                  SU R                   SU	 SU
 35        Ub   U" U	U
[+        U5      SS9nOU" XšS9nUR/                  X°R                  S9U l        O…UbY  [        R                  SU R                   SU 35        UR/                  U R                  U R                  [+        U5      S9U l        O)UR/                  U R                  U R                  S9U l        UR2                  U l        UR4                  U l        UR6                  U l        UR8                  U l        UR:                  U l        UR<                  U l        UR>                  U l        gg! [         a+    [
        R                  S:  a  [	        S5      e[	        S5      ef = f! U a1  n[-        SU SU	 SU
 SU R                   SU	 SU
 SU S35      UeSnAff = f)z!Transcriber using native Whisper.úartifacts-path: úaccelerator_options: r   N)é   é   ziwhisper is not installed. Please install it via `pip install openai-whisper` or do `uv sync --extra asr`.z_whisper is not installed. Unfortunately its dependencies are not yet available for Python 3.14.©Úsupported_deviceszAvailable device for Whisper: zloading _NativeWhisperModel(Ú))Úhf_hub_download)ÚLocalEntryNotFoundErrorzloading z from OpenAI-format checkpoint Ú/T)Úrepo_idr"   Ú	cache_dirÚlocal_files_onlyzartifacts_path (z") does not contain the checkpoint z required by ASR model 'z!'. Prefetch it with: hf download Ú z --cache-dir "Ú")r�   r"   )r2   Údevicez from )r2   r•   Údownload_root) r�   rB   ÚinfoÚwhisperÚImportErrorÚsysÚversion_infor„   Úmax_new_tokensÚ
max_tokensr   r•   r‹   r�   Ú
model_namer}   r(   Úhuggingface_hubr�   Úhuggingface_hub.utilsrŽ   r\   ÚFileNotFoundErrorÚ
load_modelÚmodelÚverboseÚ
timestampsÚword_timestampsÚlanguageÚ	beam_sizeÚcondition_on_previous_textÚtemperature)rj   r�   r‚   rƒ   r„   r˜   Údistil_checkpointr�   rŽ   r�   r"   Úcheckpoint_pathÚerrs                r)   Ú__init__Ú_NativeWhisperModel.__init__Ã   sú  € ð Œä�	‰	Ð$ ^Ð$4Ð5Ô6Ü�	‰	Ð)Ð*=Ð)>Ð?Ô@à�<�<ˆ<ðÛð  +ÔØ)×8Ñ8ˆDŒOä'Ø#×*Ñ*Ø"-×"?Ñ"?ñˆDŒKô �I‰IÐ6°t·{±{°mÐDÔEà)×1Ñ1ˆDŒOÜ�I‰IÐ4°T·_±_Ð4EÀQÐGÔHÜ B× FÑ FÀtÇÁÓ WÐØ Ñ,Ý;ÝIà$5Ñ!�Ü—	‘	Ø˜tŸ™Ð/Ð/NØ�i˜q  
ð,ôð "Ñ-ð#Ù*9Ø$+Ø%-Ü&)¨.Ó&9Ø-1ñ	+™ñ '6Ø 'ñ'�Oð %×/Ñ/Ø(·±ð 0ð �•
ð  Ñ+Ü—	‘	˜H T§_¡_Ð$5°V¸NÐ;KÐLÔMØ$×/Ñ/ØŸ™ØŸ;™;Ü"% nÓ"5ð 0ð �•
ð %×/Ñ/ØŸ™°·±ð 0ð �”
ð '×.Ñ.ˆDŒLØ)×4Ñ4ˆDŒOØ#.×#>Ñ#>ˆDÔ Ø'×0Ñ0ˆDŒMØ(×2Ñ2ˆDŒNØ.9×.TÑ.TˆDÔ+Ø*×6Ñ6ˆDÕð_ øô ó 
Ü×#Ñ# gÓ-Ü%ðTóð ô
 &ðAóð ð
ûðV 3ó #Ü/Ø.¨~Ð.>ð ?.Ø.5¨Y°a¸°zð B&Ø&*§o¡oÐ%6ð 7+Ø+2¨)°1°X°Jð ?,Ø,:Ð+;¸1ð	>óð  #ð#ûð#ús$   Á
I2 Ä<J* É25J'Ê*K!Ê0,KËK!r.   r#   c           	      óÊ  • UR                   R                  R                  nS n[        U[        5      (       a‘  [        UR                   R                  R                  5      R                  =(       d    Sn[        R                  " SUS9 nUR                  UR                  5       5        [        UR                  5      nS S S 5        UnO/[        U[
        5      (       a  UnO[        S[        U5       35      e [        R                   " S5      c‘  ["        R%                  [&        5        UR(                  R+                  [-        [.        R0                  S[&        S95        [2        R4                  Ul        UUb(  UR9                  5       (       a   UR;                  5         $ $ $ U RA                  U5      n[C        X�5        UUb(  UR9                  5       (       a   UR;                  5         $ $ $ ! , (       d  f       GN3= f! [<         a%  n["        R?                  SU S	U 35         S nA$ S nAff = f! [<         a%  n["        R?                  SU S	U 35         S nA$ S nAff = f! [<         a–  n	["        R%                  S
U	 35        [2        R4                  Ul        Us S n	A	UbZ  UR9                  5       (       aD   UR;                  5         $ ! [<         a%  n["        R?                  SU S	U 35         S nA$ S nAff = f$ $ S n	A	ff = f! UbZ  UR9                  5       (       aD   UR;                  5         f ! [<         a%  n["        R?                  SU S	U 35         S nAf S nAff = ff f = f)Nr!   F©Údeleter%   ú=ASR pipeline requires a file path or BytesIO stream, but got ÚffmpegÚAsrPipeline©Úcomponent_typeÚmodule_nameÚerror_messageú Failed to delete temporary file ú: z"Audio transcription has an error: )"r<   Ú_backendÚpath_or_streamrg   r   r   r=   r2   r%   ÚtempfileÚNamedTemporaryFileÚwriteÚgetvalueÚRuntimeErrorÚtypeÚshutilÚwhichrB   Úerrorr   ÚerrorsÚappendr   r   ÚPIPELINEr   ÚFAILUREÚstatusÚexistsÚunlinkrH   rC   Ú
transcriberM   )
rj   r.   r½   Útemp_file_pathr%   Útmp_fileÚ
audio_pathrL   r,   Úexcs
             r)   ÚrunÚ_NativeWhisperModel.run!  s  € à!Ÿ™×0Ñ0×?Ñ?ˆð '+ˆä�n¤g×.Ñ.ä˜(Ÿ.™.×-Ñ-×2Ñ2Ó3×:Ñ:×D¸fˆFÜ×,Ò,°EÀ&ÒIÈXØ—‘˜~×6Ñ6Ó8Ô9Ü!% h§m¡mÓ!4�÷ Jð (‰JÜ˜¬×-Ñ-Ø'‰JäðÜ Ó/Ð0ð2óð ð
	Ü�|Š|˜HÓ%Ñ-Ü—
‘
Ô1Ô2Ø—‘×&Ñ&ÜÜ';×'DÑ'DØ$1Ü&<ñôô #3×":Ñ":�”Øð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+ð /FÐ)ð  Ÿ?™?¨:Ó6ˆLÜ! ,Ô9Øð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+ð /FÐ)÷I JÖIûôN !ó Ü—L‘LØ:¸>Ð:JÈ"ÈQÈCÐP÷ñ ûðû”yó Ü—L‘LØ:¸>Ð:JÈ"ÈQÈCÐP÷ñ ûðûô ó 	Ü�J‰JÐ;¸C¸5ÐAÔBÜ.×6Ñ6ˆHŒOØŒOð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+øÜ ó Ü—L‘LØ:¸>Ð:JÈ"ÈQÈCÐP÷ñ ûðúð /FÐ)ûð	ûð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+øÜ ó Ü—L‘LØ:¸>Ð:JÈ"ÈQÈCÐP÷ñ ûðúð /FÐ)úsµ   Â	5G*Ã9A<I  ÆG<Æ!I  ÇH.Ç*
G9Ç<
H+ÈH&È&H+È.
IÈ8IÉIÉ 
L É*.K;ÊL ÊL Ê6KË
K6ËK1Ë1K6Ë;L Ì L ÌM"ÌL.Ì-M"Ì.
MÌ8MÍM"ÍMÍM"Úfpathc           
      óä  • U R                   R                  [        U5      U R                  U R                  U R
                  U R                  U R                  U R                  S9n/ nUS    H€  n[        US   US   US   / S9nSU;   aQ  U R
                  (       a@  / Ul
        US    H0  nUR                  R                  [        US   US   US   S	95        M2     UR                  U5        M‚     U$ )
N)r¤   r§   r¦   r¨   r©   rª   ÚsegmentsÚstartÚendr8   ©r4   r5   r8   rc   rc   Úword©r4   r5   r8   )r£   rÎ   r\   r¤   r§   r¦   r¨   r©   rª   r-   rc   rÈ   rO   )rj   rÕ   rt   ÚconvorK   ÚitemÚ__s          r)   rÎ   Ú_NativeWhisperModel.transcribeW  sò   € Ø—‘×&Ñ&Ü�‹JØ—L‘LØ—]‘]Ø ×0Ñ0Ø—n‘nØ'+×'FÑ'FØ×(Ñ(ð 'ð 
ˆð *,ˆØ˜
Ô#ˆAÜ$Ø˜W™:°°%±¸qÀ¹yÐPRñˆDð ˜!‹| × 4× 4Ø�”
Ø˜Gœ*�BØ—J‘J×%Ñ%Ü)Ø')¨'¡{Ø%'¨¡YØ!# F¡ñöñ %ð �L‰L˜Öñ $ð  ˆr+   )r„   r¨   r©   r•   r�   r§   r�   r£   rž   rª   r¥   r¤   r¦   )rX   rY   rZ   r[   Úboolr   r   r   r®   r   rÓ   rx   r-   rÎ   r_   rW   r+   r)   r   r   Â   sf   † ð\7àð\7ð ˜t™ð\7ð 0ð	\7ð
 3ô\7ð|4Ð,ð 4Ð1Aô 4ðl ð ¨Ð.?Ñ)@÷ r+   r   c                   ó^   • \ rS rSrS\S\S-  S\S\4S jrS\	S	\	4S
 jr
S\S	\\   4S jrSrg)Ú_MlxWhisperModeliv  r�   r‚   Nrƒ   r„   c                 óÊ  • Xl         [        R                  SU 35        [        R                  SU 35        U R                   (       Ga   SSKnX@l        XPl        [        UR                  UR                  S9U l        [        R                  SU R                   35        UR                  U l
        [        R                  SU R                   S	35        U R                  U l        UR                  U l        UR                  U l        UR                  U l        UR                  U l        UR                   U l        UR"                  U l        gg! [         a    [	        S5      ef = f)
z=Transcriber using MLX Whisper for Apple Silicon optimization.r†   r‡   r   Nzjmlx-whisper is not installed. Please install it via `pip install mlx-whisper` or do `uv sync --extra asr`.rŠ   z"Available device for MLX Whisper: zloading _MlxWhisperModel(rŒ   )r�   rB   r—   Úmlx_whisperr™   r„   r   r•   r‹   r�   rž   Ú
model_pathr§   Útaskr¦   Úno_speech_thresholdÚlogprob_thresholdÚcompression_ratio_threshold)rj   r�   r‚   rƒ   r„   rå   s         r)   r®   Ú_MlxWhisperModel.__init__w  s=  € ð Œä�	‰	Ð$ ^Ð$4Ð5Ô6Ü�	‰	Ð)Ð*=Ð)>Ð?Ô@à�<�<ˆ<ðÛ"ð  +ÔØ*Ôä'Ø#×*Ñ*Ø"-×"?Ñ"?ñˆDŒKô �I‰IÐ:¸4¿;¹;¸-ÐHÔIà)×1Ñ1ˆDŒOÜ�I‰IÐ1°$·/±/Ð1BÀ!ÐDÔEð #Ÿo™oˆDŒOð (×0Ñ0ˆDŒMØ#×(Ñ(ˆDŒIØ#.×#>Ñ#>ˆDÔ Ø'2×'FÑ'FˆDÔ$Ø%0×%BÑ%BˆDÔ"Ø/:×/VÑ/VˆDÕ,ð; øô ó Ü!ðMóð ðús   Á
E ÅE"r.   r#   c           	      óþ  • UR                   R                  R                  nS n[        U[        [
        45      (       d  [        S[        U5       35      e [        U[        5      (       a‘  [        UR                   R                  R                  5      R                  =(       d    Sn[        R                  " SUS9 n[        UR                  5      nUR                  UR                  5       5        S S S 5        UnOUn[        R                   " S5      c‘  ["        R%                  [&        5        UR(                  R+                  [-        [.        R0                  S[&        S95        [2        R4                  Ul        UUb(  UR9                  5       (       a   UR;                  5         $ $ $ U RA                  U5      n[C        X�5        [2        RD                  Ul        UUb(  UR9                  5       (       a   UR;                  5         $ $ $ ! , (       d  f       GN= f! [<         a%  n["        R?                  SU S	U 35         S nA$ S nAff = f! [<         a%  n["        R?                  SU S	U 35         S nA$ S nAff = f! [<         a–  n["        R%                  S
U 35        [2        R4                  Ul        Us S nAUbZ  UR9                  5       (       aD   UR;                  5         $ ! [<         a%  n["        R?                  SU S	U 35         S nA$ S nAff = f$ $ S nAff = f! UbZ  UR9                  5       (       aD   UR;                  5         f ! [<         a%  n["        R?                  SU S	U 35         S nAf S nAff = ff f = f)Nr³   r!   Fr±   r´   rµ   r¶   rº   r»   z&MLX Audio transcription has an error: )#r<   r¼   r½   rg   r   r   rÂ   rÃ   r=   r2   r%   r¾   r¿   rÀ   rÁ   rÄ   rÅ   rB   rÆ   r   rÇ   rÈ   r   r   rÉ   r   rÊ   rË   rÌ   rÍ   rH   rC   rÎ   rM   ÚSUCCESS)	rj   r.   r½   rÏ   r%   rÐ   rÑ   rÒ   r,   s	            r)   rÓ   Ú_MlxWhisperModel.run£  s  € Ø!Ÿ™×0Ñ0×?Ñ?ˆØ&*ˆä˜.¬7´D¨/×:Ñ:ÜðÜ Ó/Ð0ð2óð ð
)	Ü˜.¬'×2Ñ2Ü˜hŸn™n×1Ñ1×6Ñ6Ó7×>Ñ>×HÀ&�Ü×0Ò0Ø ¨òàÜ%)¨(¯-©-Ó%8�NØ—N‘N >×#:Ñ#:Ó#<Ô=÷	ð
 ,‘
à+�
ä�|Š|˜HÓ%Ñ-Ü—
‘
Ô1Ô2Ø—‘×&Ñ&ÜÜ';×'DÑ'DØ$1Ü&<ñôô #3×":Ñ":�”Øð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+ð /FÐ)ð  Ÿ?™?¨:Ó6ˆLÜ! ,Ô9Ü.×6Ñ6ˆHŒOØð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+ð /FÐ)÷Aö ûôF !ó Ü—L‘LØ:¸>Ð:JÈ"ÈSÈEÐR÷ñ ûðû”yó Ü—L‘LØ:¸>Ð:JÈ"ÈSÈEÐR÷ñ ûðûô ó 	Ü�J‰JÐ?À¸uÐEÔFÜ.×6Ñ6ˆHŒOØŒOð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+øÜ ó Ü—L‘LØ:¸>Ð:JÈ"ÈSÈEÐR÷ñ ûðúð /FÐ)ûð	ûð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+øÜ ó Ü—L‘LØ:¸>Ð:JÈ"ÈSÈEÐR÷ñ ûðúð /FÐ)úsÂ   ÁA&I: Â<5HÃ1B	I: ÆHÆ&2I: Ç1IÈ
HÈI: È
IÈ I É IÉ
I7ÉI2É2I7É:
LÊ.LÊ2LÊ3L ËK!Ë!
LË+LÌLÌLÌL ÌM<Ì7MÍM<Í
M7ÍM2Í-M<Í2M7Í7M<rÕ   c                 óÄ  • U R                   R                  [        U5      U R                  U R                  U R
                  U R                  U R                  U R                  U R                  S9n/ nUR                  S/ 5       HØ  n[        UR                  S5      UR                  S5      UR                  SS5      R                  5       / S9nU R                  (       ak  SU;   ae  / Ul        US    HU  nUR                  R                  [        UR                  S5      UR                  S5      UR                  S	S5      S
95        MW     UR                  U5        MÚ     U$ )z‚Transcribe audio using MLX Whisper.

Args:
    fpath: Path to audio file

Returns:
    List of conversation items with timestamps
)Úpath_or_hf_repor§   rç   r¦   rè   ré   rê   r×   rØ   rÙ   r8   rr   rÚ   rc   rÛ   rÜ   )rå   rÎ   r\   ræ   r§   rç   r¦   rè   ré   rê   r(   r-   rA   rc   rÈ   rO   )rj   rÕ   rt   rÝ   ÚsegmentrÞ   Ú	word_datas          r)   rÎ   Ú_MlxWhisperModel.transcribeØ  s6  € ð ×!Ñ!×,Ñ,Ü�‹JØ ŸO™OØ—]‘]Ø—‘Ø ×0Ñ0Ø $× 8Ñ 8Ø"×4Ñ4Ø(,×(HÑ(Hð -ð 	
ˆð *,ˆð —z‘z *¨bÖ1ˆGÜ$Ø"Ÿ;™; wÓ/Ø Ÿ™ UÓ+Ø—[‘[ ¨Ó,×2Ñ2Ó4Øñ	ˆDð ×#×#¨°7Ó(:Ø�”
Ø!(¨Ô!1�IØ—J‘J×%Ñ%Ü)Ø'0§}¡}°WÓ'=Ø%.§]¡]°5Ó%9Ø!*§¡¨v°rÓ!:ñöñ "2ð �L‰L˜Öñ' 2ð* ˆr+   )r„   rê   r•   r�   r§   ré   rå   rž   ræ   rè   rç   r¦   )rX   rY   rZ   r[   rá   r   r   r   r®   r   rÓ   rx   r-   rÎ   r_   rW   r+   r)   rã   rã   v  sf   † ð*Wàð*Wð ˜t™ð*Wð 0ð	*Wð
 0ô*WðX3Ð,ð 3Ð1Aô 3ðj, ð ,¨Ð.?Ñ)@÷ ,r+   rã   c                   ót   • \ rS rSrSrS\S\S-  S\S\4S jr	S	\
S
\4S jrS\S
\4S jrS\S
\\   4S jrSrg)Ú_WhisperS2TModeli  zOTranscriber using WhisperS2T with CTranslate2 backend for high-speed inference.r�   r‚   Nrƒ   r„   c                 ó<  • Xl         [        R                  SU 35        [        R                  SU 35        U R                   (       Ga»   SS KnXPl        X@l        [        UR                  UR                  S9nU R                  U5      u  U l        U l
        [        R                  SU R                   SU R                   S35        UR                  U l        [        R                  S	U R                   S35        UR                  nU R                  S
:X  a!  US;   a  [        R                  SU S35        SnUR                  UR                   S.nU R                  U R                  UUR"                  US.n	U R                  S;   a  SU	S'   UR$                  " SSU R                  0U	D6U l        UR(                  U l        UR*                  U l        UR,                  U l        UR.                  U l        UR                   U l        g g ! [         a    [	        S5      ef = f)Nr†   r‡   r   zdwhisper_s2t is not installed. Please install it via `pip install 'whisper-s2t-reborn[pyav]>=1.7.1'`.rŠ   z!Available device for WhisperS2T: z	 (index: rŒ   zloading _WhisperS2TModel(Úcpu)Úfloat16Úbfloat16zcompute_type='zD' is not supported by CTranslate2 on CPU; falling back to 'float32'.Úfloat32)r¨   r¦   )r•   Údevice_indexÚcompute_typeÚcpu_threadsr„   )zlarge-v3r{   r|   zlarge-v3-turboé€   Ún_melsÚmodel_identifierrW   )r�   rB   r—   Úwhisper_s2tr™   r„   r   r•   r‹   Ú_parse_devicerû   r�   r   Útorch_dtyperC   r¨   r¦   Únum_threadsr¢   r£   r§   rç   Ú
batch_sizeÚinitial_prompt)
rj   r�   r‚   rƒ   r„   r  Ú
raw_devicerü   Úasr_optsÚmodel_kwargss
             r)   r®   Ú_WhisperS2TModel.__init__
  s$  € ð Œä�	‰	Ð$ ^Ð$4Ð5Ô6Ü�	‰	Ð)Ð*=Ð)>Ð?Ô@à�<�<ˆ<ðÛ"ð  +ÔØ*Ôä&Ø#×*Ñ*Ø"-×"?Ñ"?ñˆJð
 .2×-?Ñ-?À
Ó-KÑ*ˆDŒK˜Ô*Ü�I‰IØ3°D·K±K°=À	È$×J[ÑJ[ÐI\Ð\]Ð^ôð %0×$7Ñ$7ˆDÔ!Ü�I‰IÐ1°$×2GÑ2GÐ1HÈÐJÔKð '×2Ñ2ˆLØ�{‰{˜eÓ#¨Ð8OÓ(OÜ—‘Ø$ \ Nð 3Eð Fôð  )�ð )×2Ñ2Ø#.×#>Ñ#>ñˆHð Ÿ+™+Ø $× 1Ñ 1Ø ,Ø*×6Ñ6Ø'ñˆLð ×$Ñ$ð )ó ð *-�˜XÑ&à$×/Ò/ñ Ø!%×!6Ñ!6ðàñˆDŒJð (×0Ñ0ˆDŒMØ#×(Ñ(ˆDŒIØ)×4Ñ4ˆDŒOØ"-×"<Ñ"<ˆDÔØ#.×#>Ñ#>ˆDÕ ðO øô ó Ü!ðGóð ðús   Á
H ÈHÚ
device_strr#   c                 óš   • SU;   a(  UR                  S5      nUS   n [        US   5      nX44$ US4$ ! [        [        4 a    Sn X44$ f = f)z3Parse device string like 'cuda:0' into ('cuda', 0).Ú:r   é   )Úsplitrw   Ú
ValueErrorÚ
IndexError)rj   r  Úpartsr•   rû   s        r)   r  Ú_WhisperS2TModel._parse_device_  sn   € à�*ÓØ×$Ñ$ SÓ)ˆEØ˜1‘XˆFð!Ü" 5¨¡8›}�ð Ð'Ð'Ø˜1ˆ}Ðøô ¤
Ð+ó !Ø ‘ØÐ'Ð'ð!ús   ž3 ³A
Á	A
r.   c           	      ó>  • UR                   R                  R                  nS n[        U[        5      (       a‘  [        UR                   R                  R                  5      R                  =(       d    Sn[        R                  " SUS9 nUR                  UR                  5       5        [        UR                  5      nS S S 5        UnO/[        U[
        5      (       a  UnO[        S[        U5       35      e U R                  U5      n[!        Xq5        ["        R$                  Ul        UUb(  UR)                  5       (       a   UR+                  5         $ $ $ ! , (       d  f       NŸ= f! [,         a%  n[.        R1                  SU SU 35         S nA$ S nAff = f! [,         a–  n	[.        R3                  SU	 35        ["        R4                  Ul        Us S n	A	UbZ  UR)                  5       (       aD   UR+                  5         $ ! [,         a%  n[.        R1                  SU SU 35         S nA$ S nAff = f$ $ S n	A	ff = f! UbZ  UR)                  5       (       aD   UR+                  5         f ! [,         a%  n[.        R1                  SU SU 35         S nAf S nAff = ff f = f)Nr!   Fr±   r³   rº   r»   z WhisperS2T transcription error: )r<   r¼   r½   rg   r   r   r=   r2   r%   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÎ   rM   r   rí   rË   rÌ   rÍ   rH   rB   rC   rÆ   rÊ   )
rj   r.   r½   rÏ   r%   rÐ   rÑ   r,   rL   rÒ   s
             r)   rÓ   Ú_WhisperS2TModel.runk  sX  € Ø!Ÿ™×0Ñ0×?Ñ?ˆà&*ˆä�n¤g×.Ñ.Ü˜(Ÿ.™.×-Ñ-×2Ñ2Ó3×:Ñ:×D¸fˆFÜ×,Ò,°EÀ&ÒIÈXØ—‘˜~×6Ñ6Ó8Ô9Ü!% h§m¡mÓ!4�÷ Jð (‰JÜ˜¬×-Ñ-Ø'‰JäðÜ Ó/Ð0ð2óð ð
	ØŸ?™?¨:Ó6ˆLÜ! ,Ô9Ü.×6Ñ6ˆHŒOØð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+ð /FÐ)÷1 JÕIûô6 !ó Ü—L‘LØ:¸>Ð:JÈ"ÈQÈCÐP÷ñ ûðûô ó 	Ü�J‰JÐ9¸#¸Ð?Ô@Ü.×6Ñ6ˆHŒOØŒOð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+øÜ ó Ü—L‘LØ:¸>Ð:JÈ"ÈQÈCÐP÷ñ ûðúð /FÐ)ûð	ûð Ñ)¨n×.CÑ.C×.EÑ.EðØ"×)Ñ)Õ+øÜ ó Ü—L‘LØ:¸>Ð:JÈ"ÈQÈCÐP÷ñ ûðúð /FÐ)ús–   Â	5EÃ92F ÅE(Å
E%Å(
FÅ2FÆFÆ
H:Æ$.H5ÇH:ÇH= Ç0HÈ
H0ÈH+È+H0È5H:È:H= È=JÉI(É'JÉ(
JÉ2JÊJÊJÊJrÕ   c                 ó�  • U R                   R                  [        U5      /U R                  /U R                  /U R
                  /U R                  S9n/ nU(       aê  [        U5      S:”  aÛ  US    HÒ  n/ nU R                  (       aZ  SU;   aT  US    HK  nUR                  [        UR                  S5      UR                  S5      UR                  SS5      S95        MM     [        UR                  S	5      UR                  S
5      UR                  SS5      R                  5       U(       a  UOSS9nUR                  U5        MÔ     U$ )z‚
Transcribe audio using WhisperS2T.

Args:
    fpath: Path to audio file

Returns:
    List of conversation items with timestamps
)Ú
lang_codesÚtasksÚinitial_promptsr  r   r¦   rØ   rÙ   rÛ   rr   rÜ   r4   r5   r8   NrÚ   )r£   Útranscribe_with_vadr\   r§   rç   r  r  Úlenr¦   rÈ   rO   r(   r-   rA   )rj   rÕ   ÚoutrÝ   rñ   rc   ÚwrÞ   s           r)   rÎ   Ú_WhisperS2TModel.transcribe’  s"  € ð �j‰j×,Ñ,Ü�‹ZˆLØŸ™�Ø—9‘9�+Ø!×0Ñ0Ð1Ø—‘ð -ð 
ˆð *,ˆæ”3�s“8˜a“<Ø˜qœ6�Ø�Ø×'×'Ð,=ÀÓ,HØ$Ð%6Ô7˜ØŸ™Ü-Ø+,¯5©5°«>Ø)*¯©¨u«Ø%&§U¡U¨6°2Ó%6ñöñ 8ô )Ø&Ÿ{™{¨<Ó8Ø$Ÿ[™[¨Ó4Ø Ÿ™ V¨RÓ0×6Ñ6Ó8Þ#(™%¨dñ	�ð —‘˜TÖ"ñ% "ð( ˆr+   )r„   r  r•   rû   r�   r  r§   r£   r   rç   r  r¦   )rX   rY   rZ   r[   Ú__doc__rá   r   r   r   r®   r\   Útupler  r   rÓ   rx   r-   rÎ   r_   rW   r+   r)   rõ   rõ     s|   † ÙYðS?àðS?ð ˜t™ðS?ð 0ð	S?ð
 0ôS?ðj
¨ð 
°ô 
ð%Ð,ð %Ð1Aô %ðN) ð )¨Ð.?Ñ)@÷ )r+   rõ   Úitemsc                 óÊ  • U (       d  / $ / nSnU  GH:  nUc`  [        UR                  UR                  UR                  R	                  5       UR
                  [        UR                  =(       d    / 5      S9nO�UR                  Ul        UR                  R                  5       S-   UR                  R	                  5       -   Ul        UR                  (       a0  UR                  =(       d    / [        UR                  5      -   Ul        UR                  R                  5       R                  S5      (       d  GM'  UR                  U5        SnGM=     Ub  UR                  U5        U$ )a·  Merge Whisper segments into complete sentences.

Consecutive segments are merged until a sentence-ending punctuation
mark (. ? !) is found. The merged item spans the full time range
of all contributing segments and concatenates their text.

This produces one block per sentence, which maps cleanly to one
speaker per block for diarization.

Args:
    items: ASR segments in chronological order.

Returns:
    One merged item per sentence.
N)r4   r5   r8   rD   rc   r“   )Ú.Ú?Ú!)r-   r4   r5   r8   rA   rD   rx   rc   ÚrstripÚendswithrÈ   )r!  ÚmergedÚcurrentrÞ   s       r)   Ú_merge_into_sentencesr*  É  s	  € ö$ Øˆ	à&(€FØ(,€GäˆØ‰?Ü'ØŸ?™?ØŸ™Ø—Y‘Y—_‘_Ó&ØŸ™Ü˜4Ÿ:™:×+¨Ó,ñ‰Gð  $Ÿ}™}ˆGÔØ"Ÿ<™<×.Ñ.Ó0°3Ñ6¸¿¹¿¹Ó9JÑJˆGŒLØ�z�zØ!(§¡×!4°"¼¸T¿Z¹ZÓ8HÑ H�”ð �<‰<×ÑÓ ×)Ñ)¨/×:Ô:Ø�M‰M˜'Ô"Ø‹Gñ% ð* ÑØ�‰�gÔà€Mr+   c                   óB   • \ rS rSrSrS\S\\   4S jrS\	S\	4S jr
Srg	)
Ú_AsrTranscriberiü  z¤Structural type for ASR backends.

Any object exposing `run(conv_res) -> ConversionResult` and
`transcribe(fpath: Path) -> list[_ConversationItem]` satisfies this.
rÕ   r#   c                 ó   • g re   rW   )rj   rÕ   s     r)   rÎ   Ú_AsrTranscriber.transcribe  s   € À#r+   r.   c                 ó   • g re   rW   )rj   r.   s     r)   rÓ   Ú_AsrTranscriber.run  s   € À3r+   rW   N)rX   rY   rZ   r[   r  r   rx   r-   rÎ   r   rÓ   r_   rW   r+   r)   r,  r,  ü  s,   † ñð F ÐE¨Ð.?Ñ)@ÔEàFÐ,ÐFÐ1A×Fr+   r,  c            	       óB   • \ rS rSrSr\S\S\S-  S\S\	4S j5       r
S	rg)
Ú_AsrModelFactoryi  zºBuilds a concrete ASR transcriber from ASR options.

Shared by AsrPipeline and (later) VideoPipeline so both construct
backends the same way instead of duplicating the isinstance chain.
r„   r‚   Nrƒ   r#   c                 óä   • [        U [        5      (       a  [        SUUU S9$ [        U [        5      (       a  [	        SUUU S9$ [        U [
        5      (       a  [        SUUU S9$ [        SU  35      e)NT)r�   r‚   rƒ   r„   zNo ASR model support for )rg   r   r   r   rã   r   rõ   r  )r„   r‚   rƒ   s      r)   ÚcreateÚ_AsrModelFactory.create  s’   € ô �kÔ#@×AÑAÜ&ØØ-Ø$7Ø'ñ	ð ô ˜Ô%?×@Ñ@Ü#ØØ-Ø$7Ø'ñ	ð ô ˜Ô%?×@Ñ@Ü#ØØ-Ø$7Ø'ñ	ð ô Ð4°[°MÐBÓCÐCr+   rW   )rX   rY   rZ   r[   r  Ústaticmethodr   r   r   r,  r4  r_   rW   r+   r)   r2  r2    sI   † ñð ðDØ%ðDà˜t™ðDð 0ðDð 
ó	Dó óDr+   r2  )EÚloggingrÄ   rš   r¾   Úior   Úpathlibr   Útypingr   r   Údocling_core.types.docr   r   r	   r
   r   Úpydanticr   r   Ú docling.backend.abstract_backendr   Údocling.backend.noop_backendr   Ú%docling.datamodel.accelerator_optionsr   Údocling.datamodel.base_modelsr   r   r   Údocling.datamodel.documentr   Ú"docling.datamodel.pipeline_optionsr   Ú,docling.datamodel.pipeline_options_asr_modelr   r   r   r   Údocling.pipeline.base_pipeliner   Údocling.utils.accelerator_utilsr   Údocling.utils.profilingr   r   Ú	getLoggerrX   rB   r   r^   r]   r   r\   r'   r*   rx   rM   rO   r-   r}   Údictr   r   rã   rõ   r*  r,  r2  rW   r+   r)   Ú<module>rI     s›  ðô Û Û 
Û Ý Ý ß "÷õ ÷ &å DÝ 4õ÷ñ õ
 8õ÷ó õ 8Ý 9ß @à×Ò˜Ó"€à*/Ð ˜5 ™<Ó /ððð ˜˜c™
ó ð ØØØØØñÐ ð@˜cð @ cô @ð
6ØÐ*Ñ+ð6Ø7Gð6à	ô6ôr˜	ô ô$˜	ô $ðV PØQØMØQñ	BÐ " D¨¨e°C¸°H©oÐ)=Ñ$>ó ÷qñ q÷hNñ N÷btñ tðD0ØÐ#Ñ$ð0à	Ð
Ñô0ôf	G�hô 	G÷"Dò "Dr+   