o
    <hi%                  	   @   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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)speechi>  
      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   4/home/air/goalskill_t/back/app/routers/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   r3   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 )NTFr6       )r   r   r/   appendr   Emptyjoin)r   chunkdatar   r   r    r*   A   s$   
zSpeechClientBridge.generatorN)	__name__
__module____qualname__r!   r4   r5   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alternativesrJ   lenrI   sysstdoutwriteflushr8   r.   )r<   r'   	websocketnum_chars_printedresultrJ   overwrite_charsr   r   r    on_transcription_responseR   s   

rV   rR   async_qc                    sJ   z	 |  I d H }| |d |d dI d H  q tjy$   Y d S w )NTrI   rJ   rH   )r/   	send_jsonasyncioCancelledError)rR   rW   	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textr9   closedzException: )acceptr.   rY   get_event_loopjanusr   r   r   rV   	threadingThreadr4   sync_qcreate_taskr\   rW   receive	send_textr;   r   r5   cancel	Exception)	rR   loopr'   bridgebridge_thread	send_taskrB   messageer   r   r    websocket_endpoints   s@   

rs   ) rY   re   rN   fastapir   r   r   r   fastapi.securityr   google.cloud.speechr   r   rd   r   google.cloudr	   osrouterRATEintCHUNKAudioEncodingLINEAR16r   r   r   rV   _AsyncQueueProxyr\   rR   rs   r   r   r   r    <module>   s8    	3