o
    tgY                  	   @   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ja-JP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/api/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                    sJ   z	 |  I d H }| |d |d dI d H  q tjy$   Y d S w )NTrR   rS   rQ   )r8   	send_jsonasyncioCancelledError)r]   rb   	send_datar   r   r   send_transcriptiont   s   rg   z/ws/websocketc           	   
      sN  |   I d H  td t }t }ttt}t	j
|j|j| fd}|  tt| |j}z>	 |  I d H }d|v rS|d }td|  | |I d H  nd|v rn|d }tdt| d |rm|| n	 q3 ty   |  |  td	 Y d S  ty } z|  |  td
|  W Y d }~d S d }~ww )Nopened)targetargsTtextzReceived text: rB   zReceived audio bytes: z bytesclosedzException: )acceptr7   rd   get_event_loopjanusr$   r!   r'   ra   	threadingThreadr=   sync_qcreate_taskrg   rb   receiverW   rX   	send_textrV   rD   r   r>   cancel	Exception)	r]   loopr0   bridgebridge_thread	send_taskrK   messageer   r   r   websocket_endpoint   sD   

r~   )-rd   rp   rY   fastapir   r   r   r   fastapi.securityr   google.cloud.speechr   r   ro   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   _AsyncQueueProxyrg   r]   r~   r   r   r   r   <module>   sN    


	
3