o
    ]h5                  	   @   sR  d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	 d dl
mZmZ d dlZd dlZd dlmZ d dlZd dlmZ d dlZdejd< e	d	d
Ze Zejejdd eeZeej dZeed Z eej!j"dddddddZ#ee#ddZ$e%ddd Z&G dd dZ'dd Z(dedej)fddZ*e+d defd!d"Z,dS )#    N)	APIRouter	WebSocketDependsWebSocketDisconnect)OAuth2PasswordBearer)RecognitionConfigStreamingRecognitionConfig)speech)FastAPIzmedical_memo.jsonGOOGLE_APPLICATION_CREDENTIALStoken)tokenUrlz)%(asctime)s - %(levelname)s - %(message)s)levelformati>  
      Tzko-KRcommand_and_search)encodingsample_rate_hertzaudio_channel_countuse_enhancedlanguage_codemodelenable_spoken_punctuation)configinterim_resultsz/healthc                      s
   ddiS )Nstatusok r   r   r   (/home/air/websocket/korean/stt_router.pyhealth_check&   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 )SpeechClientBridgec                 C   s    || _ t | _d| _|| _d S )NF)_on_responsequeueQueue_queue_endedstreaming_config)selfr'   on_responser   r   r   __init__+   s   

zSpeechClientBridge.__init__c                 C   sr   d| _ || _|| _t }|  }dd |D }|| j|}| | | j	 s7t
| j  | j	 r)d S d S )NFc                 s   s    | ]	}t j|d V  qdS ))audio_contentN)r	   StreamingRecognizeRequest).0contentr   r   r   	<genexpr>7   s
    

z+SpeechClientBridge.start.<locals>.<genexpr>)r&   qthreadr	   SpeechClient	generatorstreaming_recognizer'   process_responses_loopemptyprintget)r(   r0   r1   clientstreamrequests	responsesr   r   r   start1   s   

zSpeechClientBridge.startc                 C   s
   d| _ d S )NT)r&   )r(   r   r   r   	terminate@   s   
zSpeechClientBridge.terminatec                 C   s   | j jt|dd d S )NFblock)r%   putbytes)r(   bufferr   r   r   add_requestC   s   zSpeechClientBridge.add_requestc                 C   s,   |D ]}|  || j| j | jr d S qd S )N)r"   r0   r1   r&   )r(   r<   responser   r   r   r5   F   s   z)SpeechClientBridge.process_responses_loopc                 c   s    | j s?| j }|d u rd S |g}	 z| jjdd}|d u r"W d S || W n
 tjy2   Y nw qd|V  | j rd S d S )NTFr?       )r&   r%   r8   appendr#   Emptyjoin)r(   chunkdatar   r   r   r3   L   s$   
zSpeechClientBridge.generatorN)	__name__
__module____qualname__r*   r=   r>   rD   r5   r3   r   r   r   r   r!   *   s    r!   c                 C   s   d}| j sd S | j d }|jsd S |jd j}d|t|  }|jsGtd|  tj	|| d  tj
  t|}|d|d d S td| |  td|  |d	|d d S )
Nr    zPartial transcription: Fis_final
transcriptz==>zFinal transcription: T)resultsalternativesrS   lenrR   logginginfosysstdoutwriteflushrA   r7   )rE   r0   	websocketnum_chars_printedresultrS   overwrite_charsr   r   r   on_transcription_response]   s"   

ra   r]   async_qc                    sZ   z 	 |  I d H }| |d |d dI d H  tdI d H  q tjy,   Y d S w )NTrR   rS   rQ   g?)r8   	send_jsonasynciosleepCancelledError)r]   rb   	send_datar   r   r   send_transcriptiont   s   rh   z/wslang/ko/c              
      s@  |   I d H  td t }ttt}tt	|j
|j|  tt| |j}z>	 |  I d H }d|v rL|d }td|  | |I d H  nd|v rg|d }tdt| d |rf|| n	 q, ty~   |  |  td Y d S  ty } z|  |  td	|  W Y d }~d S d }~ww )
NopenedTtextzReceived text: rB   zReceived audio bytes: z bytesclosedzException: )acceptr7   janusr$   r!   r'   ra   rd   create_task	to_threadr=   sync_qrh   rb   receiverW   rX   	send_textrV   rD   r   r>   cancel	Exception)r]   r0   bridge	send_taskrK   messageer   r   r   websocket_endpoint   s@   

ry   )-rd   	threadingrY   fastapir   r   r   r   fastapi.securityr   google.cloud.speechr   r   rm   r#   google.cloudr	   osr
   rW   environoauth2_schemeappbasicConfigINFO	getLoggerrL   loggersetLevelDEBUGRATEintCHUNKAudioEncodingLINEAR16r   r'   r8   r    r!   ra   _AsyncQueueProxyrh   r]   ry   r   r   r   r   <module>   sN    


	
3