o
    0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ejd< e	dd	Ze Zd
Zeed Zeejjd
ddddddZee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)speechzmedical_memo.jsonGOOGLE_APPLICATION_CREDENTIALStoken)tokenUrli>  
      Tzja-JPcommand_and_search)encodingsample_rate_hertzaudio_channel_countuse_enhancedlanguage_codemodelenable_spoken_punctuation)configinterim_resultsc                   @   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#   	terminate5   s   
zSpeechClientBridge.terminatec                 C   s   | j jt|dd d S )NFblock)r   putbytes)r    bufferr"   r"   r#   add_request8   s   zSpeechClientBridge.add_requestc                 C   s,   |D ]}|  || j| j | jr d S qd S )N)r   r*   r+   r   )r    r6   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 )NTFr9       )r   r   r2   appendr   Emptyjoin)r    chunkdatar"   r"   r#   r-   A   s$   
zSpeechClientBridge.generatorN)	__name__
__module____qualname__r$   r7   r8   r>   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alternativesrM   lenrL   sysstdoutwriteflushr;   r1   )r?   r*   	websocketnum_chars_printedresultrM   overwrite_charsr"   r"   r#   on_transcription_responseR   s   

rY   rU   async_qc                    sJ   z	 |  I d H }| |d |d dI d H  q tjy$   Y d S w )NTrL   rM   rK   )r2   	send_jsonasyncioCancelledError)rU   rZ   	send_datar"   r"   r#   send_transcriptiong   s   r_   z/wsc           	   
      s(  |   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 rK|d }| |I d H  nd|v r[|d }|rZ|| n	 q3 tyr   |  |  td Y d S  ty } z|  |  td|  W Y d }~d S d }~ww )Nopened)targetargsTtextr<   closedzException: )acceptr1   r\   get_event_loopjanusr   r   r   rY   	threadingThreadr7   sync_qcreate_taskr_   rZ   receive	send_textr>   r   r8   cancel	Exception)	rU   loopr*   bridgebridge_thread	send_taskrE   messageer"   r"   r#   websocket_endpoints   s@   

rv   )"r\   rh   rQ   fastapir   r   r   r   fastapi.securityr   google.cloud.speechr   r   rg   r   google.cloudr	   osenvironoauth2_schemerouterRATEintCHUNKAudioEncodingLINEAR16r   r   r   rY   _AsyncQueueProxyr_   rU   rv   r"   r"   r"   r#   <module>   s<    

	3