
    Ui%              	       x   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            Z eej        j        ddd	d
dd	          Z eed	          Z G d d          Zd Zdedej        fdZe                    d          def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                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )SpeechClientBridgec                 `    || _         t          j                    | _        d| _        || _        d S )NF)_on_responsequeueQueue_queue_endedstreaming_config)selfr   on_responses      /app/app/routers/stt_router.py__init__zSpeechClientBridge.__init__    s,    'kmm 0    c                    d| _         || _        || _        t          j                    }|                                 }d |D             }|                    | j        |          }|                     |           | j        	                                sAt          | j                                                   | j        	                                ?d S d S )NFc              3   @   K   | ]}t          j        |           V  dS ))audio_contentN)r
   StreamingRecognizeRequest).0contents     r"   	<genexpr>z+SpeechClientBridge.start.<locals>.<genexpr>,   sD       
 
 ,7CCC
 
 
 
 
 
r$   )r   qthreadr
   SpeechClient	generatorstreaming_recognizer   process_responses_loopemptyprintget)r    r,   r-   clientstreamrequests	responsess          r"   startzSpeechClientBridge.start&   s    $&&!!
 
!
 
 
 ..t/DhOO	##I...&,,.. 	 $&**,, &,,.. 	  	  	  	  	 r$   c                     d| _         d S )NT)r   )r    s    r"   	terminatezSpeechClientBridge.terminate5   s    r$   c                 X    | j                             t          |          d           d S )NFblock)r   putbytes)r    buffers     r"   add_requestzSpeechClientBridge.add_request8   s&    fU33333r$   c                 f    |D ]-}|                      || j        | j                   | j        r d S .d S )N)r   r,   r-   r   )r    r8   responses      r"   r1   z)SpeechClientBridge.process_responses_loop;   sM    ! 	 	Hh<<<{ 	 	r$   c              #   2  K   | j         s| j                                        }|d S |g}	 	 | j                            d          }|d S |                    |           n# t          j        $ r Y nw xY wLd                    |          V  | j         d S d S )NTFr=   r$   )r   r   r4   appendr   Emptyjoin)r    chunkdatas      r"   r/   zSpeechClientBridge.generatorA   s      + 	!KOO%%E}7D KOO%O88E}KK&&&&{   E ((4..    + 	! 	! 	! 	! 	!s   A! A! !A32A3N)	__name__
__module____qualname__r#   r9   r;   rB   r1   r/    r$   r"   r   r      sn        1 1 1       4 4 4  ! ! ! ! !r$   r   c                    d}| j         sd S | j         d         }|j        sd S |j        d         j        }d|t          |          z
  z  }|j        slt
          j                            ||z   dz              t
          j                                         t          |          }|	                    d|d           d S t          d|z   |z              |	                    d|d           d S )Nr    Fis_final
transcriptz==>T)resultsalternativesrT   lenrS   sysstdoutwriteflushr?   r3   )rD   r,   	websocketnum_chars_printedresultrT   overwrite_charss          r"   on_transcription_responser`   R   s     a F $Q'2J.Z@AO? <
o5<===

OO	5
;;<<<<<ej ?2333	4z::;;;;;r$   r\   async_qc                    K   	 	 |                                  d {V }|                     |d         |d         d           d {V  E# t          j        $ r Y d S w xY w)NTrS   rT   rR   )r4   	send_jsonasyncioCancelledError)r\   ra   	send_datas      r"   send_transcriptionrg   g   s      	%kkmm++++++I%%%j1'5' '         	 !   s   AA
 
AAz/wsc                   K   |                                   d {V  t          d           t          j                    }t	          j                    }t          t          t                    }t          j
        |j        |j        | f          }|                                 t          j        t          | |j                            }	 	 |                                  d {V }d|v r$|d         }|                     |           d {V  n%d|v r |d         }|r|                    |           n	 h# t&          $ r; |                                 |                                 t          d           Y d S t,          $ rE}|                                 |                                 t          d|            Y d }~d S d }~ww xY w)Nopened)targetargsTtextr@   closedzException: )acceptr3   rd   get_event_loopjanusr   r   r   r`   	threadingThreadr9   sync_qcreate_taskrg   ra   receive	send_textrB   r   r;   cancel	Exception)	r\   loopr,   bridgebridge_thread	send_taskrJ   messagees	            r"   websocket_endpointr   s   s      




	(OOO!##DA 02KLLF$FL)?TUUUM#$6y!)$L$LMMI!
	"**,,,,,,,,D~~v,))'2222222222Dw- 0&&w///
	    h ! ! !A         !s    
A)D3 3AG7	G :G  G) rd   rq   rX   fastapir   r   r   r   fastapi.securityr   google.cloud.speechr   r	   rp   r   google.cloudr
   osrouterRATEintCHUNKAudioEncodingLINEAR16r   r   r   r`   _AsyncQueueProxyrg   r\   r   rN   r$   r"   <module>r      s        



 F F F F F F F F F F F F 1 1 1 1 1 1 M M M M M M M M         				
 
D2I		,5
"
 
 
 .-VTRRR 0! 0! 0! 0! 0! 0! 0! 0!f< < <*		 	E<R 	 	 	 	 %!	 ! ! ! ! ! !r$   