o
    Ox{i                  	   @   s*  d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlZd dlZd dlZd dlZdejd< e	 Zejejdd	 e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FastAPI)OAuth2PasswordBearer)RecognitionConfigStreamingRecognitionConfig)speechzmedical_memo.jsonGOOGLE_APPLICATION_CREDENTIALSz)%(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_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/websocket/japanese/stt_router.py__init__(   s   

zSpeechClientBridge.__init__c              
   C   s   t d d| _|| _|| _z%t }t d |  }dd |D }|| j|}t d | 	| W n+ t
y] } zt d|  t  | jdd	t| d
 W Y d }~nd }~ww t d d S )Nu.   [DEBUG] SpeechClientBridge 스레드 시작됨Fu)   [DEBUG] Google SpeechClient 생성 성공c                 s   s    | ]	}t j|d V  qdS ))audio_contentN)r
   StreamingRecognizeRequest).0contentr#   r#   r$   	<genexpr>:   s
    

z+SpeechClientBridge.start.<locals>.<genexpr>uC   [DEBUG] Google API 스트리밍 연결 성공, 응답 대기 중...u.   
[CRITICAL ERROR] Bridge start 내부 에러: TzError: is_final
transcriptu+   [DEBUG] SpeechClientBridge 스레드 종료)printr   qthreadr
   SpeechClient	generatorstreaming_recognizer    process_responses_loop	Exception	traceback	print_excputstr)r!   r/   r0   clientstreamrequests	responseser#   r#   r$   start.   s*   (zSpeechClientBridge.startc                 C   s
   d| _ d S )NT)r   )r!   r#   r#   r$   	terminateL   s   
zSpeechClientBridge.terminatec                 C   s   | j jt|dd d S )NFblock)r   r8   bytes)r!   bufferr#   r#   r$   add_requestO   s   zSpeechClientBridge.add_requestc              
   C   sn   z|D ]}|  || j| j | jr W d S qW d S  ty6 } ztd|  t  W Y d }~d S d }~ww )Nu>   
[CRITICAL ERROR] Google API 응답 처리 중 에러 발생: )r   r/   r0   r   r5   r.   r6   r7   )r!   r=   responser>   r#   r#   r$   r4   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 )NTFrA       )r   r   getappendr   Emptyjoin)r!   chunkdatar#   r#   r$   r2   ]   s$   
zSpeechClientBridge.generatorN)	__name__
__module____qualname__r%   r?   r@   rE   r4   r2   r#   r#   r#   r$   r   '   s    r   c                 C   st   | j sd S | j d }|jsd S |jd j}|js)td|  |d|d d S td|  |d|d d S )Nr   z
[Partial] Fr+   z[Final] T)resultsalternativesr-   r,   r.   r8   )rF   r/   	websocketresultr-   r#   r#   r$   on_transcription_responsen   s   
rU   rS   async_qc              
      s|   z	 |  I d H }| |d |d dI d H  q tjy$   Y d S  ty= } ztd|  W Y d }~d S d }~ww )NTr,   r-   r+   u*   [ERROR] 클라이언트로 전송 실패: )rH   	send_jsonasyncioCancelledErrorr5   r.   )rS   rV   	send_datar>   r#   r#   r$   send_transcription   s   r[   z/wslang/ja/c              
      s0  |   I d H  td t }ttt}tt	|j
|j| }tt| |j}z2	 |  I d H }d|v rK|d }td|  | |I d H  nd|v r[|d }|rZ|| n	 q, tyr   td |  |  Y d S  ty } ztd|  t  |  |  W Y d }~d S d }~ww )Nu&   >> 클라이언트 웹소켓 연결됨Ttextz[Received Text] rC   u    >> 클라이언트 연결 끊김u*   [ERROR] 웹소켓 엔드포인트 에러: )acceptr.   janusr   r   r    rU   rX   create_task	to_threadr?   sync_qr[   rV   receive	send_textrE   r   r@   cancelr5   r6   r7   )rS   r/   bridgebridge_task	send_taskrM   messager>   r#   r#   r$   websocket_endpoint   s@   

ri   ))rX   	threadingsysr6   fastapir   r   r   r   r   fastapi.securityr   google.cloud.speechr   r	   google.cloudr
   r^   r   osloggingenvironappbasicConfigINFO	getLoggerrN   loggerRATEintCHUNKAudioEncodingLINEAR16r   r    r   rU   _AsyncQueueProxyr[   rS   ri   r#   r#   r#   r$   <module>   sB    

	G