o
    q1h                     @   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Zd dlZd dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ dZdZG dd	 d	ZdS )
    N)KaldiRecognizerModel)Queue)default_timer)Pooli  g     @@c                   @   sf   e Zd Zdd Zdd Zd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 )Transcriberc                 C   s(   t |j|j|jd| _|| _t | _d S )N)
model_path
model_namelang)r   modelr	   r
   argsr   queue)selfr    r   p/var/www/html/alexa/alex_system/speach-to-text/venv/lib/python3.10/site-packages/vosk/transcriber/transcriber.py__init__   s   zTranscriber.__init__c                 C   s   d}g }	 |j t}t|dkrn0|t|7 }||r/t| }t	| |
| nt| }|d dkrAt	| qt| }|
| ||fS )Nr   Tpartial )stdoutread
CHUNK_SIZElenAcceptWaveformjsonloadsResultlogginginfoappendPartialResultFinalResult)r   recstreamtot_samplesresultdatajresr   r   r   recognize_stream   s$   



zTranscriber.recognize_streamc              	      s  t | jj4 I d H q}d}g }|dt I d H  	 |jtI d H }|t	|7 }t	|dkr2n!||I d H  t
| I d H }t| d|vrR|| q|dI d H  t
| I d H }t| || ||fW  d   I d H  S 1 I d H sw   Y  d S )Nr   z%{ "config" : { "sample_rate" : %f } }Tr   z{"eof" : 1})
websocketsconnectr   serversendSAMPLE_RATEr   r   r   r   r   r   recvr   r   r   )r   proc	websocketr#   r$   r%   r&   r   r   r   recognize_stream_server2   s,   




0z#Transcriber.recognize_stream_server   c              	   C   s  d}| j jdkr^g }t|D ]H\}}d|vrq|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 | j jdkry|D ]}|d dkrv||d d 7 }qf|S | j jdkrdg g d}|D ]}|d dkr|d  |d 7  < qt|D ]9\}}d|vrqdd dddg d}|d d d |d< |d d
 d |d< dd |d D |d< |d 
| qt|}|S )Nr   srtr$   r    c                 S   s   g | ]}|d  qS )wordr   ).0lr   r   r   
<listcomp>W   s    z-Transcriber.format_result.<locals>.<listcomp>start)secondsend)indexcontentr8   r;   txttext
r   z2.0)schemaVersion
monologuesr?   unknown)idname)speakerr8   r;   termsc                 S   s,   g | ]}|d  |d |d |d ddqS )confr8   r;   r4   WORD)
confidencer8   r;   r?   typer   )r5   tr   r   r   r7   m   s   , rG   rB   )r   output_type	enumerateranger   r2   Subtitlejoindatetime	timedeltar   composer   dumps)r   r$   words_per_lineprocessed_resultsubs_reswordsjlinespartrB   	monologuer   r   r   format_resultJ   sP   


zTranscriber.format_resultc                 C   s*   t dt|t}tj|tjd}|S Nz?ffmpeg -nostdin -loglevel quiet -i '{}' -ar {} -ac 1 -f s16le -)r   )shlexsplitformatstrr,   
subprocessPopenPIPE)r   infilecmdr"   r   r   r   resample_ffmpegr   s
   zTranscriber.resample_ffmpegc                    s(   d t|t}tj|tjdI d H S rb   )re   rf   r,   asynciocreate_subprocess_shellrg   ri   )r   rj   rk   r   r   r   resample_ffmpeg_asyncx   s
   z!Transcriber.resample_ffmpeg_asyncc           
         s  	 z	| j  \}}W n
 ty   Y d S w td| t }| |I d H }| |I d H \}}| 	|}|dkratd| t
|ddd}|| W d    n1 s[w   Y  nt| | I d H  t | }	td|	t|	d	t  |  | j   q)
NTRecognizing {}r   File {} processing completewutf-8encoding&Execution time: {:.3f} sec; xRT {:.3f}   )r   
get_nowait	Exceptionr   r   re   timerro   r0   ra   openwriteprintwaitfloatr,   	task_done)
r   
input_fileoutput_file
start_timer.   r$   r#   rW   fhelapsedr   r   r   server_worker}   s4   


zTranscriber.server_workerc              
   C   sR  t d|d  t }z	| |d }W n/ ty. } zt|d W Y d }~d S d }~w tyE } zt | W Y d }~d S d }~ww t| j	t
}|d | ||\}}| |}|d dkrt d|d  t|d dd	d
}	|	| W d    n1 sw   Y  nt| t | }
t d|
t|
dt
  |  d S )Nrp   r   z,Missing FFMPEG, please install and try againT   r   rq   rr   rs   rt   rv   rw   )r   r   re   rz   rl   FileNotFoundErrorr}   ry   r   r   r,   SetWordsr'   ra   r{   r|   r   )r   	inputdatar   r"   er!   r$   r#   rW   r   r   r   r   r   pool_worker   s8   




zTranscriber.pool_workerc                    sF   |D ]} j | q fddt jjD }tj| I d H  d S )Nc                    s   g | ]	}t   qS r   )rm   create_taskr   )r5   ir   r   r   r7      s    z8Transcriber.process_task_list_server.<locals>.<listcomp>)r   putrO   r   tasksrm   gather)r   	task_listxworkersr   r   r   process_task_list_server   s
   z$Transcriber.process_task_list_serverc                 C   s:   t  }|| j| W d    d S 1 sw   Y  d S N)r   mapr   )r   r   poolr   r   r   process_task_list_pool   s   "z"Transcriber.process_task_list_poolc                 C   s.   | j jd u r| | d S t| | d S r   )r   r*   r   rm   runr   )r   r   r   r   r   process_task_list   s   zTranscriber.process_task_listN)r1   )__name__
__module____qualname__r   r'   r0   ra   rl   ro   r   r   r   r   r   r   r   r   r   r      s    
(r   )r   r   rm   r(   r2   rR   rc   rg   voskr   r   r   r   timeitr   rz   multiprocessing.dummyr   r   r,   r   r   r   r   r   <module>   s    