o
    i                  	   @   sZ  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 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/websocket/chinese/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>9   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   start3   s   

zSpeechClientBridge.startc                 C   s
   d| _ d S )NT)r&   )r(   r   r   r   	terminateB   s   
zSpeechClientBridge.terminatec                 C   s   | j jt|dd d S )NFblock)r%   putbytes)r(   bufferr   r   r   add_requestE   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   H   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   N   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              
      s   z2	 |  I d H }td|  | |d |d dI d H  td|d   tdI d H  q tjyC   td Y d S  ty_ } ztj	d	| dd
 W Y d }~d S d }~ww )NTzSending to client: rR   rS   rQ   zSuccessfully sent: g?zSend task was cancelled.zError in send_transcription: exc_info)
r8   rW   rX   	send_jsonasynciosleepCancelledErrorwarning	Exceptionerror)r]   rb   	send_dataer   r   r   send_transcriptionv   s&   
"rn   z/wslang/zh/c                    s$  |   I d H  td t }ttt}t	t
|j|j|  t	t| |j}zzm	 |  I d H }d|v r|d }td|  zt|}|ddkrYtd W n?W n< tjyl   td|  Y n+ ty } ztd|  W Y d }~nd }~ww d	|v r|d	 }|r|| n	 q.W n) ty   td
 Y n ty } ztjd| dd W Y d }~nd }~ww W td |  |  z|jd  W n
 tjy   Y nw td d S td |  |  z|jd  W n tjy   Y nw td w )NzWebSocket connection opened.TtextzReceived text message: finalz3Client confirmed 'final: True'. Closing connection.zReceived non-JSON text: z&Error processing client text message: rB   zClient disconnected.z!Exception in websocket_endpoint: rc   zCleaning up resources...zWebSocket connection closed.)acceptrW   rX   janusr$   r!   r'   ra   rf   create_task	to_threadr=   sync_qrn   rb   receivejsonloadsr8   JSONDecodeErrorri   rj   rk   rD   r   r>   cancelrA   r#   Full)r]   r0   bridge	send_taskrK   message	json_datarm   r   r   r   websocket_endpoint   sv   




 

r   ).rf   	threadingrY   fastapir   r   r   r   fastapi.securityr   google.cloud.speechr   r   rr   r#   google.cloudr	   osr
   rW   rw   environoauth2_schemeappbasicConfigINFO	getLoggerrL   loggersetLevelDEBUGRATEintCHUNKAudioEncodingLINEAR16r   r'   r8   r    r!   ra   _AsyncQueueProxyrn   r]   r   r   r   r   r   <module>   sP    




3