o
    i&                     @   s*  d dl Z d dlZd dlZd dlZd dl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 d dlmZ d	Zed
 Ze dede d e d gZdd Ze Zdd Zdd ZG dd dZG dd dZG dd dZdd Zdd Zdd  Z G d!d" d"Z!G d#d$ d$Z"dS )%    N)urlretrieve)ZipFile)match)Path   )ffi)tqdmz$https://alphacephei.com/vosk/models/zmodel-list.jsonVOSK_MODEL_PATHz/usr/share/voskzAppData/Local/voskz.cache/voskc                  C   s   t jt jt} tjdkr0| t j t jd  t jd< t	t dr&t 
|  tt j| dS tjdkr?tt j| dS tjdkrNtt j| dS td	)
Nwin32PATHadd_dll_directoryzlibvosk.dlllinuxz
libvosk.sodarwinzlibvosk.dyldzUnsupported platform)ospathabspathdirname__file__sysplatformpathsepenvironhasattrr   _ffidlopenjoin	TypeError)dlldir r   @/home/kuhnn/.local/lib/python3.10/site-packages/vosk/__init__.pyopen_dll   s   




r    c                  C   s,   t jtdd} |  D ]}t|d  qd S )N
   timeoutnamerequestsgetMODEL_LIST_URLjsonprint)responsemodelr   r   r   list_models&   s   r-   c                  C   s6   t jtdd} dd |  D }|D ]}t| qd S )Nr!   r"   c                 S   s   h | ]}|d  qS langr   ).0mr   r   r   	<setcomp>-       z!list_languages.<locals>.<setcomp>r%   )r+   	languagesr/   r   r   r   list_languages+   s
   
r5   c                   @   sN   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )ModelNc                 C   sR   |d urt |d| _n| ||}t |d| _| jtjkr'tdd S Nutf-8zFailed to create a model)_cvosk_model_newencode_handleget_model_pathr   NULL	Exception)self
model_path
model_namer/   r   r   r   __init__2   s   zModel.__init__c                 C      t | j d S N)r9   vosk_model_freer<   r@   r   r   r   __del__;      zModel.__del__c                 C   s   t | j|dS Nr8   )r9   vosk_model_find_wordr<   r;   )r@   wordr   r   r   rK   >      zModel.vosk_model_find_wordc                 C   s,   |d u r|  |}t|S | |}t|S rE   )get_model_by_langget_model_by_namestr)r@   rB   r/   rA   r   r   r   r=   A   s
   

zModel.get_model_pathc                       t D ](}|d u st| sqt|} fdd|D }|g kr*t||d   S qtjtdd} fdd| D }|g krNt	d   t
d d S | t||d  t||d S )	Nc                    s   g | ]}| kr|qS r   r   r0   r,   rB   r   r   
<listcomp>M   s    z+Model.get_model_by_name.<locals>.<listcomp>r   r!   r"   c                    s    g | ]}|d   kr|d  qS )r$   r   rR   rS   r   r   rT   Q   s     zmodel name %s does not existr   
MODEL_DIRSr   existsr   listdirr&   r'   r(   r)   r*   r   exitdownload_model)r@   rB   	directorymodel_file_list
model_filer+   result_modelr   rS   r   rO   H   s   
zModel.get_model_by_namec                    rQ   )	Nc                    s    g | ]}t d  |r|qS )zvosk-model(-small)?-{})r   formatrR   r.   r   r   rT   ^   s    
z+Model.get_model_by_lang.<locals>.<listcomp>r   r!   r"   c                    s8   g | ]}|d   kr|d dkr|d dkr|d qS )r/   typesmallobsoletefalser$   r   rR   r.   r   r   rT   c   s    $zlang %s does not existr   rU   )r@   r/   r[   r\   r]   r+   r^   r   r.   r   rN   Y   s   
zModel.get_model_by_langc              	   C   s   |j  s|j jdd tddddtt|j d jdddd	 d
N}| |}t	tt|j d t|d |d d |j
|_tt|d d}||j  W d    n1 sZw   Y  tt|d   W d    d S 1 stw   Y  d S )NT)parentsBi   r   z.zip/)maxsplit)unit
unit_scaleunit_divisorminitersdesc)
reporthookdatar)parentrW   mkdirr   MODEL_PRE_URLrP   r$   rsplitdownload_progress_hookr   ntotalr   
extractallr   unlink)r@   rB   trn   	model_refr   r   r   rZ   l   s(   


"zModel.download_modelc                    s   dg d fdd	}|S )Nr   r   c                    s0   |dvr|_ |  d  | }|  d< |S )N)Nrh   r   )rw   update)bbsizetsize	displayedlast_brz   r   r   	update_to|   s
   z/Model.download_progress_hook.<locals>.update_to)r   r   Nr   )r@   rz   r   r   r   r   ru   z   s   zModel.download_progress_hook)NNN)__name__
__module____qualname__rC   rH   rK   r=   rO   rN   rZ   ru   r   r   r   r   r6   1   s    
	r6   c                   @   s   e Zd Zdd Zdd ZdS )SpkModelc                 C   *   t |d| _| jtjkrtdd S )Nr8   z Failed to create a speaker model)r9   vosk_spk_model_newr;   r<   r   r>   r?   )r@   rA   r   r   r   rC         zSpkModel.__init__c                 C   rD   rE   )r9   vosk_spk_model_freer<   rG   r   r   r   rH      rI   zSpkModel.__del__N)r   r   r   rC   rH   r   r   r   r   r      s    r   c                   @   s~   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdddZdS ) KaldiRecognizerc                 G   s   t |dkrt|d j|d | _nBt |dkr1t|d tr1t|d j|d |d j| _n$t |dkrQt|d trQt|d j|d |d 	d| _nt
d| jtjkr_tdd S )N   r   r      r8   zUnknown argumentsFailed to create a recognizer)lenr9   vosk_recognizer_newr<   
isinstancer   vosk_recognizer_new_spkrP   vosk_recognizer_new_grmr;   r   r   r>   r?   r@   argsr   r   r   rC      s   zKaldiRecognizer.__init__c                 C   rD   rE   )r9   vosk_recognizer_freer<   rG   r   r   r   rH      rI   zKaldiRecognizer.__del__c                 C   s   t | j| d S rE   )r9   $vosk_recognizer_set_max_alternativesr<   )r@   max_alternativesr   r   r   SetMaxAlternatives   s   z"KaldiRecognizer.SetMaxAlternativesc                 C       t | j|rd d S d d S Nr   r   )r9   vosk_recognizer_set_wordsr<   )r@   enable_wordsr   r   r   SetWords       zKaldiRecognizer.SetWordsc                 C   r   r   )r9   !vosk_recognizer_set_partial_wordsr<   )r@   enable_partial_wordsr   r   r   SetPartialWords   r   zKaldiRecognizer.SetPartialWordsc                 C   r   r   )r9   vosk_recognizer_set_nlsmlr<   )r@   enable_nlsmlr   r   r   SetNLSML   r   zKaldiRecognizer.SetNLSMLc                 C   s   t | j|j d S rE   )r9   vosk_recognizer_set_spk_modelr<   )r@   	spk_modelr   r   r   SetSpkModel   rM   zKaldiRecognizer.SetSpkModelc                 C   s   t | j|d d S rJ   )r9   vosk_recognizer_set_grmr<   r;   )r@   grammarr   r   r   
SetGrammar      zKaldiRecognizer.SetGrammarc                 C   s(   t | j|t|}|dk rtd|S )Nr   zFailed to process waveform)r9   vosk_recognizer_accept_waveformr<   r   r?   r@   ro   resr   r   r   AcceptWaveform   s   zKaldiRecognizer.AcceptWaveformc                 C      t t| jdS rJ   )r   stringr9   vosk_recognizer_resultr<   decoderG   r   r   r   Result   r   zKaldiRecognizer.Resultc                 C   r   rJ   )r   r   r9   vosk_recognizer_partial_resultr<   r   rG   r   r   r   PartialResult   r   zKaldiRecognizer.PartialResultc                 C   r   rJ   )r   r   r9   vosk_recognizer_final_resultr<   r   rG   r   r   r   FinalResult   r   zKaldiRecognizer.FinalResultc                 C      t | jS rE   )r9   vosk_recognizer_resetr<   rG   r   r   r   Reset      zKaldiRecognizer.Reset   c              	   C   s   g }	 | d}t|dkrn| |r||   q||   g }|D ]K}t|}d|vr3q'|d }tdt||D ]2}	||	|	|  }
t	j
t|ddd |
D tj|
d d d	tj|
d
 d d	d}|| q?q't	|S )NTi  r   result c                 S   s   g | ]}|d  qS )rL   r   )r0   lr   r   r   rT      r3   z-KaldiRecognizer.SrtResult.<locals>.<listcomp>start)secondsrh   end)indexcontentr   r   )readr   r   appendr   r   r)   loadsrangesrtSubtitler   datetime	timedeltacompose)r@   streamwords_per_lineresultsro   subsr   jreswordsjlinesr   r   r   	SrtResult   s2   




zKaldiRecognizer.SrtResultN)r   )r   r   r   rC   rH   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s    r   c                 C   s
   t | S rE   )r9   vosk_set_log_level)levelr   r   r   SetLogLevel   s   
r   c                   C      t   d S rE   )r9   vosk_gpu_initr   r   r   r   GpuInit   r   r   c                   C   r   rE   )r9   vosk_gpu_thread_initr   r   r   r   GpuThreadInit   r   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )
BatchModelc                 G   r   r7   )r9   vosk_batch_model_newr;   r<   r   r>   r?   )r@   rA   r   r   r   r   rC      r   zBatchModel.__init__c                 C   rD   rE   )r9   vosk_batch_model_freer<   rG   r   r   r   rH      rI   zBatchModel.__del__c                 C   rD   rE   )r9   vosk_batch_model_waitr<   rG   r   r   r   Wait   rI   zBatchModel.WaitN)r   r   r   rC   rH   r   r   r   r   r   r      s    r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )BatchRecognizerc                 G   s0   t |d j|d | _| jtjkrtdd S )Nr   r   r   )r9   vosk_batch_recognizer_newr<   r   r>   r?   r   r   r   r   rC      s   zBatchRecognizer.__init__c                 C   rD   rE   )r9   vosk_batch_recognizer_freer<   rG   r   r   r   rH     rI   zBatchRecognizer.__del__c                 C   s   t | j|t|}d S rE   )r9   %vosk_batch_recognizer_accept_waveformr<   r   r   r   r   r   r     r   zBatchRecognizer.AcceptWaveformc                 C   s,   t | j}t|d}t | j |S rJ   )r9   "vosk_batch_recognizer_front_resultr<   r   r   r   vosk_batch_recognizer_pop)r@   ptrr   r   r   r   r   	  s   zBatchRecognizer.Resultc                 C   rD   rE   )r9   #vosk_batch_recognizer_finish_streamr<   rG   r   r   r   FinishStream  rI   zBatchRecognizer.FinishStreamc                 C   r   rE   )r9   (vosk_batch_recognizer_get_pending_chunksr<   rG   r   r   r   GetPendingChunks  r   z BatchRecognizer.GetPendingChunksN)	r   r   r   rC   rH   r   r   r   r   r   r   r   r   r      s    r   )#r   r   r   r   r)   r&   urllib.requestr   zipfiler   rer   pathlibr   	vosk_cffir   r   r   rs   r(   getenvhomerV   r    r9   r-   r5   r6   r   r   r   r   r   r   r   r   r   r   r   <module>   s:    SS