Ë
    þÍ:jÿ0  ã                   óx  — d dl Z d dlZd dlZd dlmZ d dlmZmZmZm	Z	 d dl
Zd dlmZ e G d„ d«      «       Z	 	 ddej                  d	ee   d
edee   fd„Zd ed«      fdej                  dee   d
edede	eej                     eeeef      f   f
d„Z G d„ d«      Zej.                  d„ «       Z G d„ d«      Zy)é    N)Ú	dataclass)ÚDictÚListÚOptionalÚTuple)Úget_assets_pathc                   ór   — e Zd ZU dZdZeed<   dZeed<   dZe	ed<    ed«      Z
eed	<   d
Ze	ed<   dZe	ed<   y)Ú
VadOptionsar  VAD options.

    Attributes:
      threshold: Speech threshold. Silero VAD outputs speech probabilities for each audio chunk,
        probabilities ABOVE this value are considered as SPEECH. It is better to tune this
        parameter for each dataset separately, but "lazy" 0.5 is pretty good for most datasets.
      neg_threshold: Silence threshold for determining the end of speech. If a probability is lower
        than neg_threshold, it is always considered silence. Values higher than neg_threshold
        are only considered speech if the previous sample was classified as speech; otherwise,
        they are treated as silence. This parameter helps refine the detection of speech
         transitions, ensuring smoother segment boundaries.
      min_speech_duration_ms: Final speech chunks shorter min_speech_duration_ms are thrown out.
      max_speech_duration_s: Maximum duration of speech chunks in seconds. Chunks longer
        than max_speech_duration_s will be split at the timestamp of the last silence that
        lasts more than 100ms (if any), to prevent aggressive cutting. Otherwise, they will be
        split aggressively just before max_speech_duration_s.
      min_silence_duration_ms: In the end of each speech chunk wait for min_silence_duration_ms
        before separating it
      speech_pad_ms: Final speech chunks are padded by speech_pad_ms each side
    g      à?Ú	thresholdNÚneg_thresholdr   Úmin_speech_duration_msÚinfÚmax_speech_duration_siÐ  Úmin_silence_duration_msi�  Úspeech_pad_ms)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚfloatÚ__annotations__r   r   Úintr   r   r   © ó    úg/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/faster_whisper/vad.pyr
   r
      sL   … ñð* €IˆuÓØ€M�5ÓØ"#Ð˜CÓ#Ù#(¨£<Ð˜5Ó/Ø#'Ð˜SÓ'Ø€M�3Ôr   r
   é€>  ÚaudioÚvad_optionsÚsampling_rateÚreturnc           	      ó"  — |€t        di |¤Ž}|j                  }|j                  }|j                  }|j                  }|j
                  }d}	|j                  }
||z  dz  }||
z  dz  }||z  |	z
  d|z  z
  }||z  dz  }|dz  dz  }t        | «      }t        «       }t        j                  | d|	| j                  d   |	z  z
  f«      } ||«      }d}g }i }|€t        |dz
  d«      }d}dx}}t        |«      D ]ã  \  }}||k\  r|rd}||k  r|	|z  }||k\  r|sd	}|	|z  |d
<   Œ+|r`|	|z  |d
   z
  |kD  rR|r,||d<   |j                  |«       i }||k  rd}n||d
<   dx}x}}n$|	|z  |d<   |j                  |«       i }dx}x}}d}Œ�||k  sŒ“|sŒ–|s|	|z  }|	|z  |z
  |kD  r|}|	|z  |z
  |k  rŒ¶||d<   |d   |d
   z
  |kD  r|j                  |«       i }dx}x}}d}Œå |r!||d
   z
  |kD  r||d<   |j                  |«       t        |«      D �]  \  }}|dk(  rt        t        d|d
   |z
  «      «      |d
<   |t        |«      dz
  k7  r©||dz      d
   |d   z
  }|d|z  k  rG|dxx   t        |dz  «      z  cc<   t        t        d||dz      d
   |dz  z
  «      «      ||dz      d
<   Œ›t        t!        ||d   |z   «      «      |d<   t        t        d||dz      d
   |z
  «      «      ||dz      d
<   Œät        t!        ||d   |z   «      «      |d<   �Œ |S )a—  This method is used for splitting long audios into speech chunks using silero VAD.

    Args:
      audio: One dimensional float array.
      vad_options: Options for VAD processing.
      sampling rate: Sampling rate of the audio.
      kwargs: VAD options passed as keyword arguments for backward compatibility.

    Returns:
      List of dicts containing begin and end samples of each speech chunk.
    é   iè  é   éb   r   Fg333333Ã?g{®Gáz„?TÚstartÚendé   r   )r
   r   r   r   r   r   r   ÚlenÚget_vad_modelÚnpÚpadÚshapeÚmaxÚ	enumerateÚappendr   Úmin)r   r   r   Úkwargsr   r   r   r   r   Úwindow_size_samplesr   Úmin_speech_samplesÚspeech_pad_samplesÚmax_speech_samplesÚmin_silence_samplesÚ!min_silence_samples_at_max_speechÚaudio_length_samplesÚmodelÚpadded_audioÚspeech_probsÚ	triggeredÚspeechesÚcurrent_speechÚtemp_endÚprev_endÚ
next_startÚiÚspeech_probÚspeechÚsilence_durations                                 r   Úget_speech_timestampsrF   -   sQ  € ð" ÐÜ Ñ* 6Ñ*ˆà×%Ñ%€IØ×-Ñ-€MØ(×?Ñ?ÐØ'×=Ñ=ÐØ)×AÑAÐØÐØ×-Ñ-€MØ&Ð)?Ñ?À$ÑFÐØ&¨Ñ6¸Ñ=ÐàÐ-Ñ-Ø
ñ	à
Ð Ñ
 ñ	!ð ð
 (Ð*AÑAÀDÑHÐØ(5¸Ñ(:¸TÑ(AÐ%ä˜u›:Ðä‹O€Eä—6‘6Ø�Ð&¨¯©°Q©Ð:MÑ)MÑMÐNó€Lñ ˜Ó&€Là€IØ€HØ€NØÐÜ˜I¨Ñ,¨dÓ3ˆð €HàÐ€Hˆzä# LÓ1ò 2‰ˆˆ;Ø˜9Ò$©(ØˆHØ˜HÒ$Ø0°1Ñ4�
à˜9Ò$©iØˆIØ&9¸AÑ&=ˆN˜7Ñ#Øñ Ø$ qÑ(¨N¸7Ñ,CÑCÐFXÒXáØ(0�˜uÑ%Ø—‘ Ô/Ø!#�à Ò(Ø %‘Ià.8�N 7Ñ+Ø34Ð4�Ð4˜:©à(;¸aÑ(?�˜uÑ%Ø—‘ Ô/Ø!#�Ø34Ð4�Ð4˜:¨Ø!�	Øà˜-Ó'ªYÙØ.°Ñ2�à# aÑ'¨8Ñ3Ð6WÒWØ#�Ø# aÑ'¨8Ñ3Ð6IÒIØà(0�˜uÑ%à" 5Ñ)¨N¸7Ñ,CÑCØ&ò'ð —O‘O NÔ3Ø!#�Ø34Ð4�Ð4˜:¨Ø!�	Øðe2ñj 	Ø! N°7Ñ$;Ñ;Ð?QÒQà 4ˆ�uÑØ�‰˜Ô'ä˜xÓ(ó ‰	ˆˆ6Ø�Š6Ü!¤# a¨°©Ð;MÑ)MÓ"NÓOˆF�7‰OØ”�H“ Ñ!Ò!Ø'¨¨A©™¨wÑ7¸&À¹-ÑGÐØ !Ð&8Ñ"8Ò8Ø�u“¤Ð%5¸Ñ%:Ó!;Ñ;“Ü+.Ü˜˜8 A¨¡E™?¨7Ñ3Ð6FÈ!Ñ6KÑKÓLó,�˜˜Q™‘ Ò(ô !$ÜÐ,¨f°U©mÐ>PÑ.PÓQó!��u‘ô ,/Ü˜˜8 A¨¡E™?¨7Ñ3Ð6HÑHÓIó,�˜˜Q™‘ Ò(ô  ÜÐ(¨&°©-Ð:LÑ*LÓMóˆF�5‹Mð%ð, €Or   r   ÚchunksÚmax_durationc                 ór  — |s/ddg dœ}t        j                  g t         j                  ¬«      g|gfS g }g }g }d}d}	t        j                  g t         j                  ¬«      }
|D ]¡  }||d   z   |d   z
  ||z  kD  rL|j                  |
«       |	|z  ||z  |dœ}|	|z  }	|j                  |«       g }| |d   |d    }
|d   |d   z
  }Œc|j                  |«       t        j                  |
| |d   |d    f«      }
||d   |d   z
  z  }Œ£ |j                  |
«       |	|z  ||z  |dœ}|j                  |«       ||fS )zPThis function merges the chunks of audio into chunks of max_duration (s) length.r   )ÚoffsetÚdurationÚsegments©Údtyper&   r%   )r*   ÚarrayÚfloat32r/   Úconcatenate)r   rG   r   rH   Úchunk_metadataÚaudio_chunksÚchunks_metadataÚcurrent_segmentsÚcurrent_durationÚtotal_durationÚcurrent_audioÚchunks               r   Úcollect_chunksrZ   º   sŸ  € ñ àØØñ
ˆô
 —‘˜¤2§:¡:Ô.Ð/°.Ð1AÐAÐAà€LØ€OàÐØÐØ€NÜ—H‘H˜R¤r§z¡zÔ2€Màò >ˆà˜u U™|Ñ+¨e°G©nÑ<Ø˜]Ñ*ò+ð ×Ñ Ô.à(¨=Ñ8Ø,¨}Ñ<Ø,ñˆNð
 Ð.Ñ.ˆNØ×"Ñ" >Ô2à!Ðà! %¨¡.°5¸±<Ð@ˆMØ$ U™|¨e°G©nÑ<Ñà×#Ñ# EÔ*ÜŸN™NØ  e¨G¡n°u¸U±|Ð DÐEóˆMð   e¡¨u°W©~Ñ =Ñ=Ñð1>ð4 ×Ñ˜Ô&ð ! =Ñ0Ø$ }Ñ4Ø$ñ€Nð
 ×Ñ˜>Ô*Ø˜Ð(Ð(r   c            	       óf   — e Zd ZdZddee   dedefd„Z	 	 ddede	e   d	e
d
efd„Zdded	e
d
efd„Zy)ÚSpeechTimestampsMapz3Helper class to restore original speech timestamps.rG   r   Útime_precisionc                 óð   — || _         || _        g | _        g | _        d}d}|D ]Q  }||d   |z
  z  }|d   }| j                  j	                  |d   |z
  «       | j                  j	                  ||z  «       ŒS y )Nr   r%   r&   )r   r]   Úchunk_end_sampleÚtotal_silence_beforer/   )ÚselfrG   r   r]   Úprevious_endÚsilent_samplesrY   s          r   Ú__init__zSpeechTimestampsMap.__init__ù   s�   € Ø*ˆÔØ,ˆÔØ "ˆÔØ$&ˆÔ!àˆØˆàò 	MˆEØ˜e G™n¨|Ñ;Ñ;ˆNØ  ™<ˆLà×!Ñ!×(Ñ(¨¨u©¸Ñ)FÔGØ×%Ñ%×,Ñ,¨^¸mÑ-KÕLñ	Mr   NÚtimeÚchunk_indexÚis_endr    c                 óz   — |€| j                  ||«      }| j                  |   }t        ||z   | j                  «      S )N)Úget_chunk_indexr`   Úroundr]   )ra   re   rf   rg   r`   s        r   Úget_original_timez%SpeechTimestampsMap.get_original_time	  sF   € ð ÐØ×.Ñ.¨t°VÓ<ˆKà#×8Ñ8¸ÑEÐÜÐ)¨DÑ0°$×2EÑ2EÓFÐFr   c                 ó  — t        || j                  z  «      }|| j                  v r|r| j                  j                  |«      S t	        t        j
                  | j                  |«      t        | j                  «      dz
  «      S )Nr'   )r   r   r_   Úindexr0   Úbisectr(   )ra   re   rg   Úsamples       r   ri   z#SpeechTimestampsMap.get_chunk_index  sr   € Ü�T˜D×.Ñ.Ñ.Ó/ˆØ�T×*Ñ*Ñ*©vØ×(Ñ(×.Ñ.¨vÓ6Ð6äÜ�M‰M˜$×/Ñ/°Ó8Ü�×%Ñ%Ó&¨Ñ*ó
ð 	
r   )r#   )NF)F)r   r   r   r   r   Údictr   rd   r   r   Úboolrk   ri   r   r   r   r\   r\   ö   s}   „ Ù=ñM˜t D™zð M¸#ð MÈsó Mð& &*Øñ	
Gàð
Gð ˜c‘]ð
Gð ð	
Gð
 
ó
Gñ
 Eð 
°4ð 
ÀCô 
r   r\   c                  óh   — t         j                  j                  t        «       d«      } t	        | «      S )zReturns the VAD model instance.zsilero_vad_v6.onnx)ÚosÚpathÚjoinr   ÚSileroVADModel)rt   s    r   r)   r)      s'   € ô �7‰7�<‰<œÓ)Ð+?Ó@€DÜ˜$ÓÐr   c                   ó>   — e Zd Zd„ Z	 ddej
                  dedefd„Zy)rv   c                 óÔ   — 	 dd l }|j                  «       }d|_        d|_        d|_        d|_        |j                  |dg|¬«      | _	        y # t        $ r}t        d«      |‚d }~ww xY w)Nr   z8Applying the VAD filter requires the onnxruntime packager'   Fé   ÚCPUExecutionProvider)Ú	providersÚsess_options)
ÚonnxruntimeÚImportErrorÚRuntimeErrorÚSessionOptionsÚinter_op_num_threadsÚintra_op_num_threadsÚenable_cpu_mem_arenaÚlog_severity_levelÚInferenceSessionÚsession)ra   rt   r}   ÚeÚoptss        r   rd   zSileroVADModel.__init__(  s‚   € ð	Ûð ×)Ñ)Ó+ˆØ$%ˆÔ!Ø$%ˆÔ!Ø$)ˆÔ!Ø"#ˆÔà"×3Ñ3ØØ-Ð.Øð 4ó 
ˆ�øô ò 	ÜØJóàðûð	ús   ‚A Á	A'ÁA"Á"A'r   Únum_samplesÚcontext_size_samplesc                 ó°  — |j                   dk(  sJ d«       ‚|j                  d   |z  dk(  sJ d«       ‚t        j                  dd¬«      }t        j                  dd¬«      }t        j                  d|fd¬«      }|j	                  d|«      }|d	| d …f   }d|d<   t        j
                  |dd«      }t        j                  ||gd«      }|j	                  d||z   «      }d
}|j                  d   }	g }
t        d|	|«      D ]=  }| j                  j                  d ||||z    ||dœ«      \  }}}|
j                  |«       Œ? t        j                  |
d¬«      }|S )Nr'   zInput should be a 1D arrayr   z.Input size should be a multiple of num_samples)r'   r'   é€   rP   rM   éÿÿÿÿ.i'  )ÚinputÚhÚc)Úaxis)Úndimr,   r*   ÚzerosÚreshapeÚrollrQ   Úranger†   Úrunr/   )ra   r   r‰   rŠ   r�   r�   ÚcontextÚbatched_audioÚencoder_batch_sizeÚnum_segmentsÚoutputsrB   ÚoutputÚouts                 r   Ú__call__zSileroVADModel.__call__<  sy  € ð �z‰z˜QŠÐ<Ð <Ó<ˆà�K‰K˜‰N˜[Ñ(¨AÒ-ð	<à;ó	<Ø-ô �H‰H�[¨	Ô2ˆÜ�H‰H�[¨	Ô2ˆÜ—(‘(ØÐ$Ð%Øô
ˆð
 Ÿ™ b¨+Ó6ˆØ Ð&:Ð%:Ñ%;Ð ;Ñ<ˆØˆ�‰Ü—'‘'˜' 1 aÓ(ˆÜŸ™¨°Ð'?ÀÓCˆà%×-Ñ-¨b°+Ð@TÑ2TÓUˆà"ÐØ$×*Ñ*¨1Ñ-ˆØˆÜ�q˜,Ð(:Ó;ò 	#ˆAØŸ<™<×+Ñ+ØØ'¨¨AÐ0BÑ,BÐCÈ!ÐRSÑTó‰LˆF�A�qð �N‰N˜6Õ"ð	#ô �n‰n˜W¨1Ô-ˆàˆ
r   N)r"   é@   )r   r   r   rd   r*   Úndarrayr   rŸ   r   r   r   rv   rv   '  s/   „ ò
ð* VXñ#Ø—Z‘Zð#Ø.1ð#ØORô#r   rv   )Nr   )rn   Ú	functoolsrs   Údataclassesr   Útypingr   r   r   r   Únumpyr*   Úfaster_whisper.utilsr   r
   r¡   r   rp   rF   r   ÚstrrZ   r\   Ú	lru_cacher)   rv   r   r   r   ú<module>r©      s  ðÛ Û Û 	å !ß .Ó .ã å 0ð ÷ð ó ðð@ )-ØñJØ�:‰:ðJà˜*Ñ%ðJð ðJð
 
ˆ$�ZóJð` Ù ›,ñ	9)Ø�:‰:ð9)à�‰Jð9)ð ð9)ð ð	9)ð
 ˆ4�—
‘
Ñ˜T $ s¨E zÑ"2Ñ3Ð3Ñ4ó9)÷x'
ñ '
ðT ×Ññ ó ð ÷8ò 8r   