o
    i=?                     @  s>  d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZmZmZ ddlmZ ddlmZ ddlmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ ed ej%dZ&eG dd dZ'eG dd dZ(G dd de ed  Z)G dd de!Z*dS )    )annotationsN)AsyncIterable)	dataclass)AnyLiteral)rtc   )utils)APIConnectionErrorAPIError)logger)DEFAULT_API_CONNECT_OPTIONS	NOT_GIVENAPIConnectOptions
NotGivenOr)aio)AudioBuffer)VAD   )STTRecognizeStreamSpeechEventSpeechEventTypeSTTCapabilities	max_retrytimeoutc                   @  s   e Zd ZU ded< ded< dS )AvailabilityChangedEventr   sttbool	availableN__name__
__module____qualname____annotations__ r&   r&   e/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/stt/fallback_adapter.pyr      s   
 r   c                   @  s&   e Zd ZU ded< ded< ded< dS )
_STTStatusr   r    zasyncio.Task[None] | Nonerecovering_recognize_taskrecovering_stream_taskNr!   r&   r&   r&   r'   r(   "   s   
 r(   c                      s   e Zd Zdddddd9 fddZed:ddZed:ddZeddd;d$d%Zd<d&d'Z	ed(d=d)d*Z
eed+d> fd-d.Zeed+d?d0d1Zd@d2d3ZdAd7d8Z  ZS )BFallbackAdapterNg      $@r      )vadattempt_timeoutmax_retry_per_sttretry_intervalr   	list[STT]r-   
VAD | Noner.   floatr/   intr0   returnNonec          	        s   t |dk r
tddd |D }|r9d u r)ddd |D }td| d	d
dlm   fdd|D }t jtdtdd |D tdd |D dd || _	|| _
|| _|| _dd | j	D | _| j	D ]	}|d| j qkd| _d S )Nr   z+At least one STT instance must be provided.c                 S  s   g | ]}|j js|qS r&   capabilities	streaming.0tr&   r&   r'   
<listcomp>8   s    z,FallbackAdapter.__init__.<locals>.<listcomp>z, c                 s  s    | ]}|j V  qd S Nlabelr:   r&   r&   r'   	<genexpr>;   s    z+FallbackAdapter.__init__.<locals>.<genexpr>zSTTs do not support streaming: zx. Provide a VAD to enable stt.StreamAdapter automatically or wrap them with stt.StreamAdapter before using this adapter.r   )StreamAdapterc                   s$   g | ]}|j js |d n|qS ))r   r-   r7   r:   rB   r-   r&   r'   r=   C   s    Tc                 s      | ]}|j jV  qd S r>   )r8   interim_resultsr:   r&   r&   r'   rA   J       c                 s  rD   r>   )r8   diarizationr:   r&   r&   r'   rA   K   rF   )r9   rE   rG   )r8   c                 S  s   g | ]	}t d dddqS )TN)r    r)   r*   )r(   )r;   _r&   r&   r'   r=   T   s    metrics_collectedF)len
ValueErrorjoinr   rB   super__init__r   all_stt_instances_attempt_timeout_max_retry_per_stt_retry_interval_statuson_on_metrics_collected_recognize_metrics_needed)	selfr   r-   r.   r/   r0   non_streaming_sttlabelsstt_instance	__class__rC   r'   rN   ,   s<   	

	
zFallbackAdapter.__init__strc                 C     dS )Nr+   r&   rX   r&   r&   r'   modela      zFallbackAdapter.modelc                 C  r_   )Nlivekitr&   r`   r&   r&   r'   providere   rb   zFallbackAdapter.providerF)language
recoveringr   bufferutils.AudioBufferre   NotGivenOr[str]conn_optionsr   rf   r   r   c             
     s  z|j ||tj|| j| j| jddI d H W S  tjy=   |r/tj	|j
 dddid  tj	|j
 dddid   tyh } z |rUtj	|j
 d|ddid	  tj	|j
 d
|ddid	  d }~w ty   |r~tj|j
 dddid  tj|j
 dddid  w )Nr   r   r0   re   rj    recovery timed outstreamedFextra! timed out, switching to next STT recovery failedexc_inforp    failed, switching to next STT recovery unexpected error( unexpected error, switching to next STT)	recognizedataclassesreplacerR   rQ   rS   asyncioTimeoutErrorr   warningr@   r   	Exception	exception)rX   r   rg   re   rj   rf   er&   r&   r'   _try_recognizei   s`   	




zFallbackAdapter._try_recognizec                  sT   j j| jd u sj r(d fdd}t||_d S d S )Nr   r   r5   r6   c                   sz   z&j |  ddI d H  d_t| j d dt| dd W d S  ty<   tj| j ddd Y d S w )NTr   rg   re   rj   rf   
 recoveredstt_availability_changedr   r    z recovery attempt failed)rt   )	r   r    r   infor@   emitr   r~   debug)r   rg   rj   re   rX   
stt_statusr&   r'   _recover_stt_task   s&   

z8FallbackAdapter._try_recovery.<locals>._recover_stt_taskr   r   r5   r6   )rT   rP   indexr)   doner{   create_task)rX   r   rg   re   rj   r   r&   r   r'   _try_recovery   s   
zFallbackAdapter._try_recoveryre   c          	        s   t   }tdd | jD }|rtd t| jD ]A\}}| j| }|js)|rSz| j||||ddI d H W   S  t	yR   |jrPd|_| 
dt|dd Y nw | j||||d qtd	d
d | jD  dt   |  d)Nc                 s      | ]}|j  V  qd S r>   r    r;   r   r&   r&   r'   rA      rF   z2FallbackAdapter._recognize_impl.<locals>.<genexpr>$all STTs are unavailable, retrying..Fr   r   r   )r   rg   re   rj   all STTs failed (c                 S     g | ]}|j qS r&   r?   r;   r   r&   r&   r'   r=          z3FallbackAdapter._recognize_impl.<locals>.<listcomp>) after  seconds)timerO   rT   r   error	enumeraterP   r    r   r~   r   r   r   r
   )	rX   rg   re   rj   
start_time
all_failedir   r   r&   r&   r'   _recognize_impl   s:   



$zFallbackAdapter._recognize_implrl   r   c                  s   t  j|||dI d H S )Nrl   )rM   rx   )rX   rg   re   rj   r\   r&   r'   rx      s   zFallbackAdapter.recognizer   c                C  s   t | ||dS )N)r   re   rj   )FallbackRecognizeStream)rX   re   rj   r&   r&   r'   stream   s   zFallbackAdapter.streamc                   sd   | j D ]}|jd urt|jI d H  |jd ur"t|jI d H  q| jD ]	}|d| j q&d S NrI   )rT   r)   r   cancel_and_waitr*   rP   offrV   )rX   r   r   r&   r&   r'   aclose   s   



zFallbackAdapter.acloseargsr   kwargsc                 O  s   | j dg|R i | d S r   )r   )rX   r   r   r&   r&   r'   rV   
  s   z%FallbackAdapter._on_metrics_collected)r   r1   r-   r2   r.   r3   r/   r4   r0   r3   r5   r6   )r5   r^   )r   r   rg   rh   re   ri   rj   r   rf   r   r5   r   )
r   r   rg   rh   re   ri   rj   r   r5   r6   )rg   rh   re   ri   rj   r   r5   r   )rg   r   re   ri   rj   r   r5   r   )re   ri   rj   r   r5   r   r5   r6   )r   r   r   r   r5   r6   )r"   r#   r$   rN   propertyra   rd   r   r   r   r   $DEFAULT_FALLBACK_API_CONNECT_OPTIONSrx   r   r   rV   __classcell__r&   r&   r\   r'   r+   )   s0    5
;(*
r+   r   c                      sB   e Zd Zedd fdd	ZdddZdddZdddZ  ZS )r   r   r   r+   re   ri   rj   r   c                  s(   t  j||td || _|| _g | _d S )N)r   rj   sample_rate)rM   rN   r   	_language_fallback_adapter_recovering_streams)rX   r   re   rj   r\   r&   r'   rN     s   
z FallbackRecognizeStream.__init__r5   r6   c           
        sR  t   }tdd jjD }|rtd d  d }d fdd}tjjD ]\}}jj| }|js8|rz|j	j
tjjjjjjjjdd	 |d u sW| r]t| }z6 4 I d H   2 z3 d H W }j| qg6 W d   I d H  n1 I d H sw   Y  W W  d S W W  d S  tjy   tj|j d
ddid   ty }	 ztj|j d|	ddid  d }	~	w ty   tj|j dddid  w  ty   |jrd|_jdt|dd Y nw | q)|d urt !|I d H  tj"dd j#D  I d H  t$ddd jjD  dt   |  d)Nc                 s  r   r>   r   r   r&   r&   r'   rA     rF   z/FallbackRecognizeStream._run.<locals>.<genexpr>r   r5   r6   c               
     s  j 2 z^3 d H W } tjD ]#}zt| tjr||  n
t| jr(|  W q t	y2   Y qw  d urbzt| tjrD |  n
t| jrN   W q t	ya   t
jdddid Y qw q6  d urtt    W d    d S 1 s}w   Y  d S d S )Nz"error happened in forwarding inputrn   Tro   )	_input_chlistr   
isinstancer   
AudioFrame
push_frame_FlushSentinelflushr~   r   r   
contextlibsuppressRuntimeError	end_input)datar   main_streamrX   r&   r'   _forward_input_task%  s>   

"z9FallbackRecognizeStream._run.<locals>._forward_input_taskrk   rl   rq   rn   Tro   ru   rs   rw   Fr   r   c                 S  s   g | ]}|  qS r&   )r   )r;   r   r&   r&   r'   r=   w  s    z0FallbackRecognizeStream._run.<locals>.<listcomp>r   c                 S  r   r&   r?   r   r&   r&   r'   r=   z  r   r   r   r   )%r   rO   r   rT   r   r   r   rP   r    r   r   ry   rz   _conn_optionsrR   rQ   rS   r   r{   r   	_event_chsend_nowaitr|   r}   r@   r   r~   r   _sttr   r   r   r   r   gatherr   r
   )
rX   r   r   forward_input_taskr   r   r   r   evr   r&   r   r'   _run  s   


*




&zFallbackRecognizeStream._runr   c                   s    j j j j jd u sj rKj jtj	 j
d j jdd j d
 fdd}t|  _}| fdd	 d S d S )Nr   r   rl   r5   r6   c               
     sb  z`d} 4 I d H + 2 z3 d H W }|j tjkr)|jr"|jd js#q| d7 }  nq6 W d   I d H  n1 I d H s;w   Y  | dkrGW d S d_tdj d  j	
dtdd W d S  tjyz   tjjj dd	did
 Y d S  ty } ztjjj d|d	did W Y d }~d S d }~w ty   tjjj dd	did
  w )Nr   r   Tzstt.FallbackAdapter, r   r   r   rm   rn   ro   rr   rs   rv   )typer   FINAL_TRANSCRIPTalternativestextr    r   r   r@   r   r   r   r{   r|   r}   r   r   r~   r   )nb_transcriptr   r   rX   r   r   r   r&   r'   r     sP   (	

z@FallbackRecognizeStream._try_recovery.<locals>._recover_stt_taskc                   s    j S r>   )r   remove)rH   )rX   r   r&   r'   <lambda>  s    z7FallbackRecognizeStream._try_recovery.<locals>.<lambda>r   )r   rT   rP   r   r*   r   r   r   ry   rz   r   rQ   r   appendr{   r   add_done_callback)rX   r   r   taskr&   r   r'   r   }  s"   (z%FallbackRecognizeStream._try_recoveryevent_aiterAsyncIterable[SpeechEvent]c                   s   |2 z3 d H W }q6 d S r>   r&   )rX   r   rH   r&   r&   r'   _metrics_monitor_task  s   z-FallbackRecognizeStream._metrics_monitor_task)r   r+   re   ri   rj   r   r   r   )r   r   r5   r6   )	r"   r#   r$   r   rN   r   r   r   r   r&   r&   r\   r'   r     s    

b:r   )+
__future__r   r{   r   ry   r   collections.abcr   r   typingr   r   rc   r    r	   _exceptionsr
   r   logr   typesr   r   r   r   r   utils.audior   r-   r   r   r   r   r   r   r   r   r   r   r(   r+   r   r&   r&   r&   r'   <module>   s:    

 f