o
    h                     @   s   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ejd< e	d	d
Ze ZdZeed ZG dd dZdd ZdedejfddZedddedefddZ dS )    N)	APIRouter	WebSocketDependsWebSocketDisconnect)OAuth2PasswordBearer)RecognitionConfigStreamingRecognitionConfig)speech)loggerzmedical_memo.jsonGOOGLE_APPLICATION_CREDENTIALStoken)tokenUrli>  
   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_response r   %/home/air/yokohama/back/stt_router.py__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>-   s
    

z+SpeechClientBridge.start.<locals>.<genexpr>)r   qthreadr	   SpeechClient	generatorstreaming_recognizer   process_responses_loopemptyprintget)r   r    r!   clientstreamrequests	responsesr   r   r   start'   s   

zSpeechClientBridge.startc                 C   s
   d| _ d S )NT)r   )r   r   r   r   	terminate6   s   
zSpeechClientBridge.terminatec                 C   s   | j jt|dd d S )NFblock)r   putbytes)r   bufferr   r   r   add_request9   s   zSpeechClientBridge.add_requestc                 C   s,   |D ]}|  || j| j | jr d S qd S )N)r   r    r!   r   )r   r,   responser   r   r   r%   <   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   r(   appendr   Emptyjoin)r   chunkdatar   r   r   r#   B   s$   
zSpeechClientBridge.generatorN)	__name__
__module____qualname__r   r-   r.   r4   r%   r#   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s?tj|| d  tj  t|}|	d|d d S t
d| |  |	d|d d S )Nr    Fis_final
transcriptz==>T)resultsalternativesrC   lenrB   sysstdoutwriteflushr1   r'   )r5   r    	websocketnum_chars_printedresultrC   overwrite_charsr   r   r   on_transcription_responseS   s   

rO   rK   async_qc                    sJ   z	 |  I d H }| |d |d dI d H  q tjy$   Y d S w )NTrB   rC   rA   )r(   	send_jsonasyncioCancelledError)rK   rP   	send_datar   r   r   send_transcriptionh   s   rU   z/yokohama/api/wsja-JPlangc           
   
      s  |   I dH  ztjtjjjt|ddd}tj|dd}W n  ty> } z| jdd| dI dH  W Y d}~dS d}~ww t	
 }t|t}tj|j|j| fd	}|  tt| |j}zPz	 |  I dH }	|	rq||	 qc ty   td
 Y n ty } ztd|  W Y d}~nd}~ww W |  |  | r|  td dS |  |  | r|  td w )u   
    // WebSocket接続を処理し、指定された言語でリアルタイム音声認識を実行します。
    // ex: /ws?lang=ko-KR
    Nlatest_longT)encodingsample_rate_hertzlanguage_codemodelenable_automatic_punctuation)configinterim_resultsi  zUnsupported language: )codereason)targetargsz&WebSocket connection closed by client.zWebSocket error: zWebSocket resources cleaned up.)acceptr	   r   AudioEncodingLINEAR16RATEr   	Exceptionclosejanusr   r   rO   	threadingThreadr-   sync_qrR   create_taskrU   rP   receive_bytesr4   r   r
   infoerrorr.   cancelis_aliver9   )
rK   rW   dynamic_configdynamic_streaming_configer    bridgebridge_thread	send_taskr;   r   r   r   websocket_endpointt   s^   


rz   )rV   )!rR   rk   rG   fastapir   r   r   r   fastapi.securityr   google.cloud.speechr   r   rj   r   google.cloudr	   osr^   r
   environoauth2_schemerouterrg   intCHUNKr   rO   _AsyncQueueProxyrU   rK   strrz   r   r   r   r   <module>   s*    

3