+
    ~jh                       ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIH	t	H
t
 ^ RIt^ RIHt ^RIHtHt ^RIHt ^RIHtHtHt ^R	IHt ^R
IHt ^RIHtHt Rt]	 ! R R4      4       t]	 ! R R4      4       t]	 ! R R4      4       t ]	 ! R R4      4       t! ! R R4      t" ! R R4      t# ! R R]PH                  4      t% ! R R]PL                  4      t'R# )    )annotationsN)Callable)	dataclassfield)rtc)tokenizeutilslogger)	NOT_GIVEN
NotGivenOrTimedString)is_given)io)SpeakingRateDetectorSpeakingRateStreamgp=
ף@c                  @    ] tR t^t$ R]R&   R]R&   R]R&   R]R&   R	tR
# )_TextSyncOptionsfloatspeedCallable[[str], list[str]]hyphenate_wordztokenize.WordTokenizerword_tokenizerr   speaking_rate_detector N)__name__
__module____qualname____firstlineno____annotations____static_attributes__r       ڄ/Users/mitch_tango/dev/rabbit-r1-livekit/agent/.venv/lib/python3.14/site-packages/livekit/agents/voice/transcription/synchronizer.pyr   r      s    L..**00r"   r   c                      ] tR t^ t$ ]! ]R7      tR]R&    ]! ]R7      tR]R&    ]! ]R7      t	R]R&    ]! ]R7      t
R]R&   R R	 ltR
 R ltR R lt]R R l4       tRtR# )_SpeakingRateDatadefault_factoryzlist[float]
timestampsspeaking_ratespeak_integrals	list[str]_text_bufferc               $    V ^8  d   QhRRRRRR/# )   	timestampr   r)   returnNoner   )formats   "r#   __annotate___SpeakingRateData.__annotate__-   s!     . . .e . .r"   c               	8   V P                   '       d   V P                  R,          M^ pWP                  ,
          pW2V,          ,          pV P                   P                  V4       V P                  P                  V4       V P                  P                  V4       R# )   N)r(   r*   pushed_durationappendr)   )selfr/   r)   integraldts   &$$  r#   add_by_rate_SpeakingRateData.add_by_rate-   sq    /34''+A---B&&y)!!-0##H-r"   c               (    V ^8  d   QhRRRRRRRR/# )r.   textstr
start_timezfloat | Noneend_timer0   r1   r   )r2   s   "r#   r3   r4   6   s:     P P P !	P
 P 
Pr"   c               	*   Ve   V P                   '       d   V P                  R,          M^ pW P                  ,
          p\        R V P                   4       4      pWF,          pV^ 8  d	   We,          M^ pV P                   P                  V4       V P                  P                  V4       V P                  P                  V4       V P                  P                  4        V P                  P                  V4       Ve   V P                  RVR R7       R # R # )Nc              3  8   "   T F  p\        V4      x  K  	  R # 5iN)len).0r@   s   & r#   	<genexpr>6_SpeakingRateData.add_by_annotation.<locals>.<genexpr>C   s     C1B3t991Bs    r@   rB   rC   r7   )	r(   r*   r8   sumr,   r9   r)   clearadd_by_annotation)r:   r@   rB   rC   r;   r<   text_lenrates   &$$$    r#   rO   #_SpeakingRateData.add_by_annotation6   s     !37???t++B/H222BC1B1BCCH H$&F8=DOO"":.%%d+  ''1##%  &""x$"O  r"   c                    V ^8  d   QhRRRR/# )r.   r/   r   r0   r   )r2   s   "r#   r3   r4   Q   s      u  r"   c                   V P                   '       g   ^ # \        P                  ! V P                   VRR7      pV^ 8X  d   ^ # V P                  V^,
          ,          pWP                   V^,
          ,          ,
          pV\	        V P
                  4      8  d   V P
                  V,          MV P
                  V^,
          ,          pW5V,          ,          pV\	        V P                   4      8  d   \        W0P                  V,          4      pV# )z9Get accumulated speaking units up to the given timestamp.right)side)r(   npsearchsortedr*   rG   r)   min)r:   r/   idx
integral_tr<   rQ   s   &&    r#   accumulate_to_SpeakingRateData.accumulate_toQ   s    oodooywG!8))#'2
 q11 S++,, s###C!G, 	
 	Ri
T__%%Z)=)=c)BCJr"   c                   V ^8  d   QhRR/# )r.   r0   r   r   )r2   s   "r#   r3   r4   l   s     = = =r"   c                	P    V P                   '       d   V P                   R,          # ^ # )r6   r7   )r(   r:   s   &r#   r8   !_SpeakingRateData.pushed_durationk   s    &*oootr"<1<r"   r   N)r   r   r   r   r   listr(   r    r)   r*   r,   r=   rO   r\   propertyr8   r!   r   r"   r#   r%   r%       sk    #D9J9)!&t!<M;< #(#>O[>8#D9L)9.P64 = =r"   r%   c                  h    ] tR t^pt$ R]R&   RtR]R&   RtR]R&   ]! ]R	7      t	R
]R&   Rt
R]R&   RtR# )
_AudioDatar   	sr_stream        r   r8   Fbooldoner&   r%   estimated_rateNz_SpeakingRateData | Noneannotated_rater   )r   r   r   r   r    r8   ri   r   r%   rj   rk   r!   r   r"   r#   re   re   p   s8    !! OU D$(->O(PN%P/3N,3r"   re   c                  Z    ] tR t^yt$ R]R&   RtR]R&   RtR]R&   ^ tR	]R
&   RtR]R&   Rt	R# )	_TextDataztokenize.WordStreamword_streamrK   rA   pushed_textFrh   ri   intforwarded_hyphensforwarded_textr   N)
r   r   r   r   r    ro   ri   rq   rr   r!   r   r"   r#   rm   rm   y   s1    $$KD$sNCr"   rm   c                     ] tR t^tRtR R lt]R R l4       t]R R l4       t]R R	 l4       t	R
 R lt
R R ltR R ltR R ltR R ltR R ltR R ltR R ltR R lt]R R l4       t]P*                  ! ]R7      R R  l4       t]P*                  ! ]R7      R! R" l4       t]P*                  ! ]R7      R# R$ l4       tR% R& ltR' R( ltR) R* ltR+tR,# )-_SegmentSynchronizerImplz4Synchronizes one text segment with one audio segmentc               $    V ^8  d   QhRRRRRR/# )r.   optionsr   next_in_chainio.TextOutput | Noner0   r1   r   )r2   s   "r#   r3   %_SegmentSynchronizerImpl.__annotate__   s$     " " 0 "DX "]a "r"   c               	   a  VS n         \        S P                   P                  P                  4       R 7      S n        \        S P                   P                  P                  4       R7      S n        VS n        RS n	        \        P                  ! 4       S n        RS n        RS n        \        P                  ! 4       S n        S P                  P!                  4        \"        S P                   P$                  ,          S n        RS n        \*        P,                  P.                  \0        ,          ! 4       S n        \        P4                  R,          ! 4       S n        \        P8                  ! S P;                  4       4      S n        S P<                  P?                  V 3R l4       \        P8                  ! S PA                  4       4      S n!        \        P8                  ! S PE                  4       4      S n#        RS n$        RS n%        R# ))rn   )rf   Nrg   c                8   < SP                   P                  4       # rF   )_out_chclose)_r:   s   &r#   <lambda>3_SegmentSynchronizerImpl.__init__.<locals>.<lambda>   s    T\\5G5G5Ir"   F)&_optsrm   r   stream
_text_datare   r   _audio_data_next_in_chain_start_wall_timeasyncioEvent
_start_fut_paused_wall_time_paused_duration_output_enabled_evsetSTANDARD_SPEECH_RATEr   _speed_speed_on_speaking_unitr	   aioChanr   r|   Future_close_futurecreate_task
_main_task_main_ataskadd_done_callback_capture_task_capture_atask_speaking_rate_task_speaking_rate_atask_playback_completed_interrupted)r:   rv   rw   s   f&$r#   __init__!_SegmentSynchronizerImpl.__init__   sX   
#

0I0I0P0P0RS%

0Q0Q0X0X0Z[+.2)0/3'*")--/##%*TZZ-=-==59$ yy~~k24$^^D13"..t/@A**+IJ%11$2D2D2FG$+$7$78P8P8R$S!#( !r"   c                   V ^8  d   QhRR/# r.   r0   rh   r   )r2   s   "r#   r3   ry      s     ) ) )r"   c                	6    V P                   P                  4       # rF   )r   ri   r`   s   &r#   closed_SegmentSynchronizerImpl.closed   s    !!&&((r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry      s     % %4 %r"   c                	.    V P                   P                  # rF   )r   ri   r`   s   &r#   audio_input_ended*_SegmentSynchronizerImpl.audio_input_ended   s    $$$r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry      s     $ $$ $r"   c                	.    V P                   P                  # rF   )r   ri   r`   s   &r#   text_input_ended)_SegmentSynchronizerImpl.text_input_ended   s    ###r"   c                    V ^8  d   QhRRRR/# )r.   rB   r   r0   r1   r   )r2   s   "r#   r3   ry      s      e  r"   c                	
   V P                   '       d   \        P                  ! R 4       R# V P                  P	                  4       '       d   \        P                  ! R4       R# Wn        V P                  P                  4        R# )z?_SegmentSynchronizerImpl.on_playback_started called after closeNzJ_SegmentSynchronizerImpl.on_playback_started called after start_fut is set)r   r   warningr   is_setr   r   )r:   rB   s   &&r#   on_playback_started,_SegmentSynchronizerImpl.on_playback_started   sX    ;;;NN\]??!!##NN\  *r"   c                    V ^8  d   QhRRRR/# r.   framezrtc.AudioFramer0   r1   r   )r2   s   "r#   r3   ry      s     ; ; ;4 ;r"   c                	    V P                   '       d   \        P                  ! R 4       R# V P                  P                  P                  V4       V P                  ;P                  VP                  ,          un        R# )z6_SegmentSynchronizerImpl.push_audio called after closeN)r   r   r   r   rf   
push_framer8   duration)r:   r   s   &&r#   
push_audio#_SegmentSynchronizerImpl.push_audio   sP    ;;;NNST""--e4((ENN:(r"   c                   V ^8  d   QhRR/# r.   r0   r1   r   )r2   s   "r#   r3   ry      s     ! ! !r"   c                	    V P                   '       d   \        P                  ! R 4       R# RV P                  n        V P                  P
                  P                  4        V P                  4        R# )z;_SegmentSynchronizerImpl.end_audio_input called after closeNT)r   r   r   r   ri   rf   	end_input_reestimate_speedr`   s   &r#   end_audio_input(_SegmentSynchronizerImpl.end_audio_input   sM    ;;;NNXY $"",,. r"   c                    V ^8  d   QhRRRR/# r.   r@   rA   r0   r1   r   )r2   s   "r#   r3   ry      s     , ,c ,d ,r"   c                	   V P                   '       d   \        P                  ! R 4       R# RRr2\        V\        P
                  4      '       d   \        P                  ! VP                  4      '       d   VP                  MRp\        P                  ! VP                  4      '       d   VP                  MRpV P                  P                  '       g   \        4       V P                  n        V P                  P                  P                  WVR7       V P                  P                  P!                  V4       V P                  ;P"                  V,          un        R# )z5_SegmentSynchronizerImpl.push_text called after closeNrL   )r   r   r   
isinstancer   r   r	   r   rB   rC   r   rk   r%   rO   r   rn   	push_textro   )r:   r@   rB   rC   s   &&  r#   r   "_SegmentSynchronizerImpl.push_text   s    ;;;NNRS#THdBNN++,1NN4??,K,KQUJ(-t}}(E(Et}}4H##2222C2E  / ++==8 >  	##--d3##t+#r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry      s     ! ! !r"   c                	    V P                   '       d   \        P                  ! R 4       R# RV P                  n        V P                  P
                  P                  4        V P                  4        R# )z:_SegmentSynchronizerImpl.end_text_input called after closeNT)r   r   r   r   ri   rn   r   r   r`   s   &r#   end_text_input'_SegmentSynchronizerImpl.end_text_input   sI    ;;;NNWX###--/ r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry      s     ( (t (r"   c                	    V P                   '       d   \        P                  ! R 4       R# V P                  f   \        P                  ! 4       V n        V P
                  P                  4        R# )z1_SegmentSynchronizerImpl.pause called after closeN)r   r   r   r   timer   rN   r`   s   &r#   pause_SegmentSynchronizerImpl.pause   sG    ;;;NNNO!!)%)YY[D"%%'r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry      s     & & &r"   c                	v   V P                   '       d   \        P                  ! R 4       R# V P                  eg   V P                  eR   V ;P
                  \        P                  ! 4       \        V P                  V P                  4      ,
          ,          un        RV n        V P                  P                  4        R# )z2_SegmentSynchronizerImpl.resume called after closeN)
r   r   r   r   r   r   r   maxr   r   r`   s   &r#   resume_SegmentSynchronizerImpl.resume   s    ;;;NNOP!!-$$0 %%s))4+A+A8 * % &*D"##%r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry     s     R R4 Rr"   c                	   V P                   P                  '       d   V P                  P                  '       g   R # \        V P	                  V P                   P
                  4      4      pV P                  P                  ^ 8  d"   WP                  P                  ,          V n        V P                  P                  P                  V P                  P                  4      pV^ 8  d   W,          V n
        R # R # rF   )r   ri   r   rG   _calc_hyphensro   r8   r   rj   r\   r   )r:   pushed_hyphenspushed_speaking_unitss   &  r#   r   *_SegmentSynchronizerImpl._reestimate_speed  s    ###4+;+;+@+@+@T//0K0KLM++a/(+;+;+K+KKDK !% 0 0 ? ? M M,,!
 !1$+9+QD( %r"   c               $    V ^8  d   QhRRRRRR/# )r.   playback_positionr   interruptedrh   r0   r1   r   )r2   s   "r#   r3   ry     s"     , ,5 ,t ,X\ ,r"   c               	   V P                   '       d   \        P                  ! R 4       R# W n        V P                  P
                  '       d   V P                  P
                  '       gG   \        P                  ! RRV P                  P
                  RV P                  P
                  /R7       R# V'       g
   RV n        R# R# )z=_SegmentSynchronizerImpl.playback_finished called after closeNzQ_SegmentSynchronizerImpl.playback_finished called before text/audio input is done	text_done
audio_done)extraT)r   r   r   r   r   ri   r   r   )r:   r   r   s   &$$r#   mark_playback_finished/_SegmentSynchronizerImpl.mark_playback_finished  s    ;;;NNZ['###4+;+;+@+@+@NNc"DOO$8$8,HXHXH]H]^  '+D$ r"   c                   V ^8  d   QhRR/# )r.   r0   rA   r   )r2   s   "r#   r3   ry   '  s     . . .r"   c                	~    V P                   '       d   V P                  P                  # V P                  P                  # rF   )r   r   ro   rr   r`   s   &r#   synchronized_transcript0_SegmentSynchronizerImpl.synchronized_transcript&  s.    ###??...---r"   r
   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry   .  s     , ,T ,r"   c                	z  "    V P                     R j  xL
  pV P                  '       g   K  V P                  P                  V4      G R j  xL
  KC   L> LDA T P                  '       d   T P                  P                  4        R # R #   T P                  '       d   T P                  P                  4        i i ; i5irF   )r|   r   capture_textflushr:   r@   s   & r#   r   &_SegmentSynchronizerImpl._capture_task-  s     	,"ll A Ad&&&--::4@@@A@ + """##))+ #t"""##))+ #sY   B;B	 AAAB	 B	 AB	 AB	 B	 B;+B;	/B88B;c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry   8  s      4 r"   c                	   "   V P                   P                    R j  xL
  pV P                   P                  P                  VP                  VP
                  R7       KG   LBDCR # 5i)N)r/   r)   )r   rf   rj   r=   r/   r)   )r:   evs   & r#   r   ,_SegmentSynchronizerImpl._speaking_rate_task7  sV     ((22 	 	"++77,,b6F6F 8 	2s%   A%A"A A"?A% A""A%c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry   ?  s     =3 =3$ =3r"   c                	X  "   V P                   P                  4       G R j  xL
  V P                  '       d   V P                  '       g   R # V P                  f   Q hV P
                  P                    R j  xL
  pVP                  pV P                  P                  4       '       g8   V P                  P                  4       G R j  xL
  V P                  '       d    R # V P                  '       d   V P                  '       g    R # V P                  '       dM   V P                  P                  \        V\        P                  ! 4       V P                  ,
          R7      4       K  \        V P                   P#                  V4      4      p\        P                  ! 4       V P                  ,
          V P$                  ,
          p^ pV P&                  P(                  ;p'       d   VP*                  V8  d   \-        VP/                  V4      4      p\        V P
                  P0                  4      pWx8  d4   V P
                  P2                  W p	\        V P5                  V	4      4      pMV P
                  P2                  Wx p	\        V P5                  V	4      4      ) pMzV P6                  '       di   V P&                  P8                  P/                  V4      p
WP6                  ,          p\:        P<                  ! V4      V P
                  P>                  ,
          p\A        RW5,
          4      V PB                  ,          pV P                  '       d   ^ pV PE                  VR,          4      G R j  xL
  V P                  P                  \        V\        P                  ! 4       V P                  ,
          R7      4       V PE                  VR,          4      G R j  xL
  V P
                  ;P>                  V,          un        V P
                  ;P0                  V,          un        EK   EL EL EL[ L LXEDR # 5i)N)rC   rg   g       @)#r   waitr   r   r   r   rn   tokenr   r   r   r|   send_nowaitr   r   rG   r   r   r   r   rk   r8   rp   r\   rr   ro   r   r   rj   rW   ceilrq   r   r   _sleep_if_not_closed)r:   datawordword_hyphenselapsed	d_hyphens	annotated
target_lenforwarded_lend_texttarget_speaking_unitstarget_hyphensdelays   &            r#   r   #_SegmentSynchronizerImpl._main_task>  s    oo""$$$;;;t777$$000//55 5	3 5	3$::D**1133--22444$$${{{4#;#;#;'''((tyy{T=R=R/RS tzz88>?LiikD$9$99D<Q<QQGI!--<<<	<))W4 !!8!8!AB
 #DOO$B$B C.!__88RF #D$6$6v$> ?I!__88RF!$T%7%7%?!@ @I---(,(8(8(G(G(U(UV](^%!69U9U!UGGN3doo6W6WW	\56DE '''++ECK888LL$$D499;9N9N+NO ++ECK888OO--=-OO**d2**y 	%5	3 5T 9 9e 6s   P*PP*P*	(P*1P&5P6P&9AP*PP*P*0P*P*FP*'B:P*!P""A)P*P$AP*P&P*"P*$P*&P*c                    V ^8  d   QhRRRR/# )r.   r@   rA   r0   r+   r   )r2   s   "r#   r3   ry   ~  s      # ) r"   c                   a  S P                   P                  P                  V4      p\        \        P
                  P                  V 3R lV 4       4      4      pV# )zCalculate hyphens for text.c              3  Z   <"   T F   pSP                   P                  V4      x  K"  	  R # 5irF   )r   r   )rH   r   r:   s   & r#   rI   9_SegmentSynchronizerImpl._calc_hyphens.<locals>.<genexpr>  s%     )\V[d$***C*CD*I*IV[s   (+)r   r   r   rb   	itertoolschainfrom_iterable)r:   r@   wordshyphenss   f&  r#   r   &_SegmentSynchronizerImpl._calc_hyphens~  sG    

))2248OO)))\V[)\\
 r"   c                    V ^8  d   QhRRRR/# )r.   r  r   r0   r1   r   )r2   s   "r#   r3   ry     s     D D D$ Dr"   c                	   "   \         P                  ! \        P                  4      ;_uu_ 4        \        P                  ! V P
                  .VR 7      G Rj  xL
  RRR4       R#  L  + '       g   i     R# ; i5i))timeoutN)
contextlibsuppressr   TimeoutErrorr   r   )r:   r  s   &&r#   r   -_SegmentSynchronizerImpl._sleep_if_not_closed  sO       !5!566,, 2 23UCCC 76C 766s.   -A;'A'A%A'
A;%A''A8	2	A;c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   ry     s     ( (d (r"   c                	4  "   V P                   '       d   R # V P                  P                  R 4       V P                  f   \        P                  ! 4       V n        V P
                  P                  4        V P                  P                  4        V P                  P                  P                  4       G R j  xL
  V P                  P                  P                  4       G R j  xL
  V P                  G R j  xL
  V P                  G R j  xL
  R #  LZ L0 L L5irF   )r   r   
set_resultr   r   r   r   r   r   rn   acloser   rf   r   r   r`   s   &r#   r  _SegmentSynchronizerImpl.aclose  s     ;;;%%d+  ($(IIKD!##%oo))00222((//111!!!!'''' 	31!'sH   B3D5D6+D!D"D5D6D	D
DDDD)r   r   r   r   r   r   r   r|   r   r   r   r   r   r   r   r   r   r   N)r   r   r   r   __doc__r   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   log_exceptionsr   r   r   r   r   r   r  r!   r   r"   r#   rt   rt      s    >": ) ) % % $ $;!,(!(& R ,$ . . (, ), ( ) (=3 )=3~D( (r"   rt   c                     a  ] tR tRtRtRRR]P                  P                  R]/R V 3R lllt	]
R	 R
 l4       t]
R R l4       t]
R R l4       tR R ltR R ltR]R]/R R lltR R ltR R ltR R ltRtV ;t# )TranscriptSynchronizeri  z
Synchronizes text with audio playback timing.

This class is responsible for synchronizing text with audio playback timing.
It starts sending transcription when AudioOutput.on_playback_started is called.
r   g      ?r   r   c               0    V ^8  d   QhRRRRRRRRR	R
RR/# )r.   next_in_chain_audioio.AudioOutputnext_in_chain_textrx   r   r   r   r   r   z"NotGivenOr[tokenize.WordTokenizer]r0   r1   r   )r2   s   "r#   r3   #TranscriptSynchronizer.__annotate__  sP     %E %E ,%E 1	%E
 %E 3%E ;%E 
%Er"   c          
     	  < \         SV `  4        \        WR 7      V n        \	        WR 7      V n        RRuV n        V n        \        TTT;'       g#    \        P                  P                  RRRR7      \        4       R7      V n        RV n        RV n        RV n        RV n        \%        V P                  VR7      V n        RV n        R# ))rw   TF)retain_formatignore_punctuationsplit_character)r   r   r   r   rv   rw   N)superr   _SyncedTextOutput_text_output_SyncedAudioOutput_audio_output_text_attached_audio_attachedr   r   basicWordTokenizerr   r   _enabled_closed_paused_warned_asymmetric_detachrt   _impl_rotate_segment_atask)r:   r#  r%  r   r   r   	__class__s   &$$$$$r#   r   TranscriptSynchronizer.__init__  s     	-dU/X48$1T1%)  >>//"&5RV 0  $8#9


   */& .djjPbc
@D"r"   c                   V ^8  d   QhRR/# )r.   r0   r/  r   )r2   s   "r#   r3   r&    s     " "0 "r"   c                	    V P                   # rF   )r0  r`   s   &r#   audio_output#TranscriptSynchronizer.audio_output  s    !!!r"   c                   V ^8  d   QhRR/# )r.   r0   r-  r   )r2   s   "r#   r3   r&    s     ! !. !r"   c                	    V P                   # rF   )r.  r`   s   &r#   text_output"TranscriptSynchronizer.text_output  s       r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   r&    s       r"   c                	    V P                   # rF   )r5  r`   s   &r#   enabledTranscriptSynchronizer.enabled  s    }}r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   r&    s     " "d "r"   c                	   "   R V n         V P                  4       G Rj  xL
  V P                  P                  4       G Rj  xL
  R#  L( L5iTN)r6  barrierr9  r  r`   s   &r#   r  TranscriptSynchronizer.aclose  s9     llnjj!!! 	!s    A
A!A
A A
A
c                    V ^8  d   QhRRRR/# )r.   rG  rh   r0   r1   r   )r2   s   "r#   r3   r&    s     
" 
"4 
"D 
"r"   c                	    V P                   V8X  d   R # Wn         V'       d   RV n        V P                  '       d!   V P                  P                  4       '       d   V P	                  4        R # R # NF)r5  r8  r:  ri   rotate_segment)r:   rG  s   &&r#   set_enabled"TranscriptSynchronizer.set_enabled  sU    ==G#-2D*)))T-G-G-L-L-N-N ! .Or"   audio_attachedtext_attachedc               $    V ^8  d   QhRRRRRR/# )r.   rT  zNotGivenOr[bool]rU  r0   r1   r   )r2   s   "r#   r3   r&    s/     G G )G (	G
 
Gr"   c               	    \        V4      '       d   Wn        \        V4      '       d   W n        T P                  V P                  ;'       d    V P                  4       R # rF   )r   r2  r1  rR  )r:   rT  rU  s   &$$r#   _on_attachment_changed-TranscriptSynchronizer._on_attachment_changed  sH     N###1 M"""/--EE$2E2EFr"   c                    V ^8  d   QhRRRR/# )r.   old_taskzasyncio.Task[None] | Noner0   r1   r   )r2   s   "r#   r3   r&    s      3L QU r"   c                	  "   V'       d6   \         P                  ! \        4      ;_uu_ 4        VG R j  xL
  R R R 4        V P                  P	                  4       G R j  xL
  \        V P                  V P                  P                  R7      V n        V P                  '       d   V P                  P                  4        R # R #  L  + '       g   i     L; i Ly  \         d    \
        P                  ! R4        Li ; i5i)Nz9failed to close segment synchronizer impl during rotationr+  )r  r  	Exceptionr9  r  r   	exceptionrt   r   r.  r   r7  r   )r:   r[  s   &&r#   _rotate_segment_task+TranscriptSynchronizer._rotate_segment_task  s     $$Y// 0	Z**##%%% .JJd.?.?.N.N


 <<<JJ   0/ & 	ZXY	Zsb   +DCCCDC CC #A DCC	DC !C>;D=C>>Dc                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   r&    s     	
 	
 	
r"   c                	&   V P                   '       d   R # V P                  '       d7   V P                  P                  4       '       g   \        P                  ! R4       \
        P                  ! V P                  V P                  4      4      V n        R # )NzCrotate_segment called while previous segment is still being rotated)r6  r:  ri   r   r   r   r   r_  r`   s   &r#   rQ  %TranscriptSynchronizer.rotate_segment  sb    <<<%%%d.H.H.M.M.O.ONN`a%,%8%8%%d&@&@A&
"r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   r&    s     - -t -r"   c                	   "   V P                   f   R # V P                   P                  4       '       g   V P                   G R j  xL
  K6  R #  L5irF   )r:  ri   r`   s   &r#   rL  TranscriptSynchronizer.barrier  sB     %%- ,,1133,,,, 4,s   0AAA	A)r2  r0  r6  r5  r9  r   r7  r:  r1  r.  r8  )r   r   r   r   r  r   r3  r   r   r   rc   r?  rC  rG  r  rR  rX  r_  rQ  rL  r!   __classcell__r;  s   @r#   r!  r!    s    %E
 %E 6>^^5R5R%E >G%E %EN " " ! !  "

"G ,5G +4	G(	
- -r"   r!  c                     a  ] tR tRtR V 3R lltR V 3R lltR V 3R lltR R	 ltR
 V 3R lltRR/R V 3R lllt	R V 3R llt
R V 3R lltR V 3R lltR V 3R lltRtV ;t# )r/  i  c               $    V ^8  d   QhRRRRRR/# )r.   synchronizerr!  rw   r$  r0   r1   r   )r2   s   "r#   r3   _SyncedAudioOutput.__annotate__  s$     + +2+FT+	+r"   c          	     	   < \         SV `  R VVP                  \        P                  ! RR7      R7       W n        Wn        RV n        R# )r!  T)r   )labelrw   sample_ratecapabilitiesrg   N)r,  r   ro  r   AudioOutputCapabilitiesr   _synchronizer_pushed_durationr:   rk  rw   r;  s   &&$r#   r   _SyncedAudioOutput.__init__  sJ     	*'%1133$?	 	 	
 /<)'*r"   c                    V ^8  d   QhRRRR/# r   r   )r2   s   "r#   r3   rl  +  s     3 3 3D 3r"   c                	  <"   V P                   P                  4       G R j  xL
  V P                  P                  V4      G R j  xL
  \        SV `  V4      G R j  xL
  V ;P
                  VP                  ,          un        V P                   P                  '       g~   V P                   P                  '       d`   V P                   P                  '       gD   V P                   P                  '       g(   RV P                   n
        \        P                  ! R4       R # V P                   P                  P                  '       dS   \        P                  ! R4       V P                   P                  4        V P                   P                  4       G R j  xL
  V P                   P                  P!                  V4       R #  EL ELz ELf L45i)NTzTranscriptSynchronizer text output was detached while audio output is still active; transcription sync is disabled. This usually means session.output.transcription was replaced after AgentSession.start().zQ_SegmentSynchronizerImpl audio marked as ended in capture audio, rotating segment)rr  rL  r   capture_framer,  rs  r   rG  r2  r1  r8  r   r   r9  r   rQ  r   )r:   r   r;  s   &&r#   rx   _SyncedAudioOutput.capture_frame+  sL       ((***!!//666g#E***/!!)))""222**999**DDD?C""<\
 ##555NNc --/$$,,...  ++E29 	+6*. /sf   GF;"GF>GGAGG;GG3AGAGG,G>GGGc                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   rl  L  s     3 3t 3r"   c                	8  < \         SV `  4        V P                  P                  4        V P                  P                  '       g   R # V P
                  '       g   V P                  P                  4        R # V P                  P                  P                  4        R # rF   )	r,  r   r   rr  rG  rs  rQ  r9  r   r:   r;  s   &r#   r   _SyncedAudioOutput.flushL  sl    !!#!!)))$$$--/  002r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   rl  Z  s     + +d +r"   c                	:    V P                   P                  4        R # rF   )r   clear_bufferr`   s   &r#   r  _SyncedAudioOutput.clear_bufferZ  s    ((*r"   c                    V ^8  d   QhRRRR/# )r.   
created_atr   r0   r1   r   )r2   s   "r#   r3   rl  ^  s     P P P4 Pr"   c               	   < \         SV `  VR 7       V P                  P                  '       d)   V P                  P                  P                  VR7       R# R# ))r  )rB   N)r,  r   rr  rG  r9  )r:   r  r;  s   &$r#   r   &_SyncedAudioOutput.on_playback_started^  sG    #z#:%%%$$88J8O &r"   r   Nc               (    V ^8  d   QhRRRRRRRR/# )	r.   r   r   r   rh   r   z
str | Noner0   r1   r   )r2   s   "r#   r3   rl  c  s4     $ $ !$ 	$
 ",$ 
$r"   c               	V  < V P                   P                  '       g   \        SV `  VVVR 7       R# V P                   P                  P                  WR7       \        SV `  VVV P                   P                  P                  R 7       V P                   P                  4        RV n        R# ))r   r   r   N)r   r   rg   )	rr  rG  r,  on_playback_finishedr9  r   r   rQ  rs  )r:   r   r   r   r;  s   &$$$r#   r  '_SyncedAudioOutput.on_playback_finishedc  s     !!)))G("3'(? ) 
   77/ 	8 	
 	$/#$($6$6$<$<$T$T 	% 	
 	))+ #r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   rl  ~       G GT Gr"   c                	\   < \         SV `  4        V P                  P                  R R7       R# )TrT  Nr,  on_attachedrr  rX  r|  s   &r#   r  _SyncedAudioOutput.on_attached~  s%    111Fr"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   rl    s     H HT Hr"   c                	\   < \         SV `  4        V P                  P                  R R7       R# )Fr  Nr,  on_detachedrr  rX  r|  s   &r#   r  _SyncedAudioOutput.on_detached  s%    111Gr"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   rl    s     - -t -r"   c                	   < \         SV `  4        R V P                  n        V P                  P                  P
                  '       g'   V P                  P                  P                  4        R# R# rK  )r,  r   rr  r7  r9  r   r|  s   &r#   r   _SyncedAudioOutput.pause  sO    %)"!!''...$$**, /r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   rl    s     . . .r"   c                	   < \         SV `  4        R V P                  n        V P                  P                  P
                  '       g'   V P                  P                  P                  4        R# R# )FN)r,  r   rr  r7  r9  r   r|  s   &r#   r   _SyncedAudioOutput.resume  sP    %*"!!''...$$++- /r"   )r   rs  rr  )r   r   r   r   r   rx  r   r  r   r  r  r  r   r   r!   rg  rh  s   @r#   r/  r/    ss    + +3 3B3 3+P P
$
 /3$ $6G GH H- -. .r"   r/  c                  j   a  ] tR tRtR V 3R lltR R ltR R ltR V 3R	 lltR
 V 3R lltRt	V ;t
# )r-  i  c               $    V ^8  d   QhRRRRRR/# )r.   rk  r!  rw   rx   r0   r1   r   )r2   s   "r#   r3   _SyncedTextOutput.__annotate__  s$        2 FZ 	 r"   c               	P   < \         SV `  R VR7       W n        Wn        RV n        R# )r!  )rn  rw   FN)r,  r   r   rr  
_capturingrt  s   &&$r#   r   _SyncedTextOutput.__init__  s+     	7}U4A)r"   c                    V ^8  d   QhRRRR/# r   r   )r2   s   "r#   r3   r    s     1 1s 1t 1r"   c                	D  "   V P                   P                  4       G R j  xL
  V P                   P                  '       g   V P                   P                  '       d`   V P                   P                  '       gD   V P                   P
                  '       g(   RV P                   n        \        P                  ! R4       V P                  '       d$   V P                  P                  V4      G R j  xL
  R # RV n
        V P                   P                  P                  '       dS   \        P                  ! R4       V P                   P                  4        V P                   P                  4       G R j  xL
  V P                   P                  P                  V4       R #  ELy L L05i)NTzTranscriptSynchronizer audio output was detached while text output is still active; transcription sync is disabled. This usually means session.output.audio was replaced after AgentSession.start().zO_SegmentSynchronizerImpl text marked as ended in capture text, rotating segment)rr  rL  rG  r1  r2  r8  r   r   r   r   r  r9  r   rQ  r   r   s   &&r#   r   _SyncedTextOutput.capture_text  s3      ((***!!)))""111**:::**DDD?C""<T
 """))66t<<<##444NNa --/$$,,...  **407 	+ = /sX   F FF F F 9F 8F F ,F-2F  AF -F.,F F F c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   r    s     
2 
2t 
2r"   c                	   V P                   P                  '       g/   V P                  '       d   V P                  P                  4        R # V P                  '       g   R # RV n        V P                   P
                  P                  4        R # rP  )rr  rG  r   r   r  r9  r   r`   s   &r#   r   _SyncedTextOutput.flush  s`    !!)))"""##))+  //1r"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   r    s     F FT Fr"   c                	\   < \         SV `  4        V P                  P                  R R7       R# )TrU  Nr  r|  s   &r#   r  _SyncedTextOutput.on_attached  s%    111Er"   c                   V ^8  d   QhRR/# r   r   )r2   s   "r#   r3   r    r  r"   c                	\   < \         SV `  4        V P                  P                  R R7       R# )Fr  Nr  r|  s   &r#   r  _SyncedTextOutput.on_detached  s%    111Fr"   )r  r   rr  )r   r   r   r   r   r   r   r  r  r!   rg  rh  s   @r#   r-  r-    s/       1<
2F FG Gr"   r-  )(
__future__r   r   r  r  r   collections.abcr   dataclassesr   r   numpyrW   livekitr   rK   r   r	   logr   typesr   r   r   r   r   _speaking_rater   r   r   r   r%   re   rm   rt   r!  AudioOutputr/  
TextOutputr-  r   r"   r#   <module>r     s    "     $ (     7 7   D  1 1 1 L= L= L=^ 4 4 4   U( U(p@- @-Fu. u.p9G 9Gr"   