§
    	tÃjº8  ã                  ó¾  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZ ddlmZ ddlZddlmZ ddlmZ d	Zd
Zedz  ez  ZdZdZdZ ej        e¦  «        Zd„ Z G d„ de¦  «        Z  G d„ de!¦  «        Z" G d„ d¦  «        Z# G d„ de#¦  «        Z$ G d„ de#¦  «        Z%d„ Z&d„ Z'e G d„ d¦  «        ¦   «         Z( G d„ d¦  «        Z)dS ) zLBounded, memory-only push-to-talk. Identity is pinned before capture starts.é    )ÚannotationsN)Ú	dataclassÚfield)ÚProtocolé   )ÚControlError)Úsplit_targetéD¬  é   é   i:  éè  z!@cf/openai/whisper-large-v3-turboc                óD   — t          | t          ¦  «        r
| dd…         ndS )zBBound correlation IDs in lifecycle logs; never log voice contents.Né   Úunknown)Ú
isinstanceÚstr)Úvalues    úY/home/lighthouse/esp32-dev/.cache/physical-ui-cleanup-0.6a/server/device_gateway/voice.pyÚshort_idr      s#   € å# E­3Ñ/Ô/Ð>ˆ5��"�Œ:ˆ:°YÐ>ó    c                  ó   — e Zd Zdd„ZdS )ÚSpeechToTextProviderÚ	wav_bytesÚbytesÚreturnr   c              ƒ  ó
   K  — d S ©N© )Úselfr   s     r   Ú
transcribezSpeechToTextProvider.transcribe$   s
   è è € € € r   N)r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r    r   r   r   r   r   #   s   € € € € € Ø<Ð<Ð<Ð<Ð<Ð<r   r   c                  ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚTranscriptionErrorc                óJ   •— t          ¦   «                              d¦  «         d S )NúTranscription failed)ÚsuperÚ__init__)r   Ú	__class__s    €r   r)   zTranscriptionError.__init__(   s"   ø€ Ý‰Œ×ÒÐ/Ñ0Ô0Ð0Ð0Ð0r   )r!   r"   r#   r)   Ú__classcell__)r*   s   @r   r%   r%   '   s8   ø€ € € € € ð1ð 1ð 1ð 1ð 1ð 1ð 1ð 1ð 1r   r%   c                  ó*   — e Zd ZU dZded<   ddœd„ZdS )Ú_HttpSTTProviderNzfloat | NoneÚlast_request_secondsF)Úunwrap_resultc          	   ‹  óÎ  K  — t          j        ¦   «         d }}d | _        	 t          j        d¦  «        4 ƒd {V —† t          j        dd¬¦  «        4 ƒd {V —†} |j        |fddd| j        z   ii|¤Žƒ d {V —†}|j	        }| 
                    ¦   «          |                     ¦   «         }|rB|                     d¦  «        dus|                     d	¦  «        rt          ¦   «         ‚|d
         }|d         }	t          |	t          ¦  «        st          ¦   «         ‚d                     d„ |	D ¦   «         ¦  «                             ¦   «         }	|	r&t%          |	                     d¦  «        ¦  «        dk    rt          ¦   «         ‚|	cd d d ¦  «        ƒd {V —† cd d d ¦  «        ƒd {V —† t          j        ¦   «         |z
  | _        t(                               d| j        || j        ¦  «         S # 1 ƒd {V —†swxY w Y   	 d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   nA# t
          j        t0          t          t2          t4          t6          f$ r t9          ¦   «         d ‚w xY wt          j        ¦   «         |z
  | _        t(                               d| j        || j        ¦  «         d S # t          j        ¦   «         |z
  | _        t(                               d| j        || j        ¦  «         w xY w)Né   F)ÚtimeoutÚfollow_redirectsÚheadersÚAuthorizationzBearer ÚsuccessTÚerrorsÚresultÚtextÚ c              3  óH   K  — | ]}|d v st          |¦  «        dk    ¯|V — ŒdS ©z
	é    N©Úord©Ú.0Úcs     r   ú	<genexpr>z)_HttpSTTProvider._post.<locals>.<genexpr>D   s4   è è € Ð"RÐ"R¨°a¸6°k°kÅSÈÁVÄVÈrÂ\À\ 1À\À\À\À\Ð"RÐ"Rr   úutf-8é   z.STT provider=%s status=%s request_seconds=%.3f)ÚtimeÚ	monotonicr.   Úasyncior2   ÚhttpxÚAsyncClientÚpostÚapi_keyÚstatus_codeÚraise_for_statusÚjsonÚgetÚ
ValueErrorr   r   ÚjoinÚstripÚlenÚencodeÚloggerÚinfoÚprovider_nameÚ	HTTPErrorÚTimeoutErrorÚKeyErrorÚ	TypeErrorÚAttributeErrorr%   )
r   Úurlr/   ÚkwargsÚstartedÚstatusÚclientÚresponseÚpayloadr9   s
             r   Ú_postz_HttpSTTProvider._post0   sU  è è € Ýœ.Ñ*Ô*¨D�ˆØ$(ˆÔ!ð	Oõ ” rÑ*Ô*ð  ð  ð  ð  ð  ð  ð  ð  Ý Ô,°RÈ%ÐPÑPÔPð  ð  ð  ð  ð  ð  ð  ÐTZØ%0 V¤[°ð &Wð &WØ!0°)¸d¼lÑ2JÐ Kð&WØOUð&Wð &Wð  Wð  Wð  Wð  Wð  Wð  W�Hà%Ô1�FØ×-Ò-Ñ/Ô/Ð/Ø&Ÿmšm™oœo�GØ$ð 4Ø"Ÿ;š; yÑ1Ô1¸Ð=Ð=ÀÇÂÈXÑAVÔAVÐ=Ý",¡,¤,Ð.Ø")¨(Ô"3˜Ø" 6œ?�DÝ% d­CÑ0Ô0ð +Ý(™lœlÐ*ØŸ7š7Ð"RÐ"R¨dÐ"RÑ"RÔ"RÑRÔR×XÒXÑZÔZ�DØð +¥3 t§{¢{°7Ñ';Ô';Ñ#<Ô#<¸tÒ#CÐ#CÝ(™lœlÐ*Øð! ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ð  ð ð  ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ð  õ, )-¬Ñ(8Ô(8¸7Ñ(BˆDÔ%Ý�KŠKÐHØÔ*¨F°DÔ4MñOô Oð Oð Oð- ð  ð  ð  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð  ð ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  øøõ$ ”¥­z½8ÅYÕP^Ð_ð 	1ð 	1ð 	1å$Ñ&Ô&¨DÐ0ð	1øøøõ )-¬Ñ(8Ô(8¸7Ñ(BˆDÔ%Ý�KŠKÐHØÔ*¨F°DÔ4MñOô Oð Oð Oð Oøõ )-¬Ñ(8Ô(8¸7Ñ(BˆDÔ%Ý�KŠKÐHØÔ*¨F°DÔ4MñOô Oð Oð Oøøøsl    H ºH	ÁD'G%Å>H	ÆH Ç%
G/	Ç/H	Ç2G/	Ç3H	Ç7H È	
HÈH ÈHÈH ÈJ  È>IÉJ  Ê AK$)r!   r"   r#   r.   Ú__annotations__re   r   r   r   r-   r-   ,   sK   € € € € € € à)-ÐÐ-Ð-Ð-Ñ-à05ð Oð Oð Oð Oð Oð Oð Or   r-   c                  ó    — e Zd ZdZdd„Zd„ ZdS )ÚOpenAICompatibleSTTúopenai-compatibleNc                óf   — |                      d¦  «        ||c| _        | _        | _        || _        d S )Nú/)ÚrstripÚbase_urlrL   ÚmodelÚinitial_prompt)r   rm   rL   rn   ro   s        r   r)   zOpenAICompatibleSTT.__init__T   s3   € Ø2:·/²/À#Ñ2FÔ2FÈÐQVÐ/ˆŒ�t”| T¤ZØ,ˆÔÐÐr   c              ƒ  ó�   K  — d| j         i}| j        r
| j        |d<   |                      | j        dz   |dd|dfi¬¦  «        ƒ d {V —†S )Nrn   Úpromptz/audio/transcriptionsÚfilez	voice.wavz	audio/wav)ÚdataÚfiles)rn   ro   re   rm   )r   r   rs   s      r   r    zOpenAICompatibleSTT.transcribeX   s†   è è € Ø˜œÐ$ˆØÔð 	1Ø!Ô0ˆD�‰NØ—Z’Z ¤Ð0GÑ GÈdØ˜K¨°KÐ@ÐAð  ñ Cô Cð Cð Cð Cð Cð Cð Cð 	Cr   r   )r!   r"   r#   rX   r)   r    r   r   r   rh   rh   Q   sA   € € € € € Ø'€Mð-ð -ð -ð -ðCð Cð Cð Cð Cr   rh   c                  ó$   — e Zd ZdZedfd„Zd„ ZdS )ÚCloudflareWorkersAISttProviderúcloudflare-workers-aiNc                ó@   — |||c| _         | _        | _        || _        d S r   )Ú
account_idrL   rn   ro   )r   ry   rL   rn   ro   s        r   r)   z'CloudflareWorkersAISttProvider.__init__c   s&   € Ø4>ÀÈÐ1ˆŒ˜œ t¤zØ,ˆÔÐÐr   c              ƒ  óØ   K  — t          j        |¦  «                             d¦  «        ddœ}| j        r
| j        |d<   |                      d| j        › d| j        › �d|¬¦  «        ƒ d {V —†S )	NÚasciir    )ÚaudioÚtaskro   z.https://api.cloudflare.com/client/v4/accounts/z/ai/run/T)r/   rO   )Úbase64Ú	b64encodeÚdecodero   re   ry   rn   )r   r   rd   s      r   r    z)CloudflareWorkersAISttProvider.transcribeg   s�   è è € å"Ô,¨YÑ7Ô7×>Ò>¸wÑGÔGÐQ]Ð^Ð^ˆØÔð 	<Ø(,Ô(;ˆGÐ$Ñ%à—Z’ZØb¸T¼_ÐbÐbÐVZÔV`ÐbÐbØ Wð  ñ .ô .ð .ð .ð .ð .ð .ð .ð 	.r   )r!   r"   r#   rX   ÚCF_STT_MODELr)   r    r   r   r   rv   rv   `   sA   € € € € € Ø+€Mà2>Ètð -ð -ð -ð -ð.ð .ð .ð .ð .r   rv   c                 óŠ  — t           j                             d¦  «        } t           j                             d¦  «        pd }| dk    r|t           j                             d¦  «        }t           j                             d¦  «        }t           j                             d¦  «        pt          }|r|rt	          ||||¦  «        nd S | dk    rzd„ d	D ¦   «         }|d
         rI|d
                              d¦  «        dk    r*|d         s"t           j                             d¦  «        |d<   t          |¦  «        rt          |d|iŽnd S d S )NÚGATEWAY_STT_PROVIDERÚGATEWAY_STT_INITIAL_PROMPTrw   ÚGATEWAY_CF_ACCOUNT_IDÚGATEWAY_CF_API_TOKENÚGATEWAY_STT_MODELri   c                óR   — g | ]$}t           j                             d |z   ¦  «        ‘Œ%S )ÚGATEWAY_STT_)ÚosÚenvironrP   )rA   Únames     r   ú
<listcomp>z"configured_stt.<locals>.<listcomp>{   s+   € ÐeÐeÐe¸D•"”*—.’. °$Ñ!6Ñ7Ô7ÐeÐeÐer   )ÚBASE_URLÚAPI_KEYÚMODELr   rk   zhttps://api.groq.com/openai/v1r   ÚGROQ_API_KEYro   )rŠ   r‹   rP   r�   rv   rl   Úallrh   )Úproviderrq   ÚaccountÚtokenrn   Úvaluess         r   Úconfigured_sttr—   r   s8  € ÝŒz�~Š~Ð4Ñ5Ô5€HÝŒZ�^Š^Ð8Ñ9Ô9ÐA¸T€FØÐ*Ò*Ð*Ý”*—.’.Ð!8Ñ9Ô9ˆÝ”
—’Ð5Ñ6Ô6ˆÝ”
—’Ð2Ñ3Ô3ÐCµ|ˆØPWÐkÐ\aÐkÕ-¨g°u¸eÀVÑLÔLÐLÐgkÐkØÐ&Ò&Ð&ØeÐeÐDdÐeÑeÔeˆà�!Œ9ð 	7˜ œ×)Ò)¨#Ñ.Ô.Ð2RÒRÐRÐ[aÐbcÔ[dÐRÝœ
Ÿš ~Ñ6Ô6ˆF�1‰IÝFIÈ&ÁkÄkÐ[Õ" FÐB¸6ÐBÐBÐBÐW[Ð[Øˆ4r   c                ó\  — t          j        ¦   «         }t          j        |d¦  «        5 }|                     d¦  «         |                     d¦  «         |                     t          ¦  «         |                     | ¦  «         d d d ¦  «         n# 1 swxY w Y   | 	                    ¦   «         S )NÚwbr   r   )
ÚioÚBytesIOÚwaveÚopenÚsetnchannelsÚsetsampwidthÚsetframerateÚSAMPLE_RATEÚwriteframesÚgetvalue)ÚpcmÚoutputÚstreams      r   Úwav_pcmr§   ƒ   sÓ   € ÝŒZ‰\Œ\€FÝ	Œ�6˜4Ñ	 Ô	 ð   FØ×Ò˜AÑÔÐØ×Ò˜AÑÔÐØ×Ò�KÑ(Ô(Ð(Ø×Ò˜3ÑÔÐð	 ð  ð  ñ  ô  ð  ð  ð  ð  ð  ð  øøøð  ð  ð  ð  ð
 �?Š?ÑÔÐs   ©ABÂBÂBc                  óø   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   dZded	<    eed
¬¦  «        Zded<   dZded<    edd
¬¦  «        Z	ded<    edd
¬¦  «        Z
ded<    edd
¬¦  «        Zded<   dS )ÚVoiceRequestr   Úvoice_idÚ
connectionÚtargetÚagentÚ
session_idrŒ   Ú	RECORDINGÚstateF)Údefault_factoryÚreprÚ	bytearrayr¤   r   ÚintÚsequencer:   )Údefaultr²   Ú
transcriptNzasyncio.Task | Noner}   zasyncio.TimerHandle | NoneÚtimer)r!   r"   r#   rf   r°   r   r³   r¤   rµ   r·   r}   r¸   r   r   r   r©   r©   �   sê   € € € € € € à€M€M�MØ€O€O�OØ€K€K�KØ€J€J�JØ€O€O�OØ€I€I�IØ€EÐÐÐÑØ�U¨9¸5ÐAÑAÔA€CÐAÐAÐAÑAØ€HÐÐÐÑØ�e B¨UÐ3Ñ3Ô3€JÐ3Ð3Ð3Ñ3Ø % ¨d¸Ð ?Ñ ?Ô ?€DÐ?Ð?Ð?Ñ?Ø(-¨°dÀÐ(GÑ(GÔ(G€EÐGÐGÐGÑGÐGÐGr   r©   c                  óZ   — e Zd Zd„ Zd„ Zd„ Zdd„Zdddœd	„Zd
„ Zd„ Z	d„ Z
d„ Zd„ Zd„ ZdS )ÚVoiceManagerc                ó    — |||c| _         | _        | _        |||c| _        | _        | _        i | _        i | _        t          ¦   «         | _	        d S r   )
r“   Ú
target_forÚadapter_forÚsendÚ
is_currentÚapproval_pendingÚrequestsÚseenÚsetÚtasks)r   r“   r¼   r½   r¾   r¿   rÀ   s          r   r)   zVoiceManager.__init__ž   sO   € Ø;CÀZÐQ\Ð8ˆŒ�t”¨Ô(8Ø<@À*ÐN^Ð9ˆŒ	�4”? DÔ$9ØˆŒØˆŒ	Ý‘U”UˆŒ
ˆ
ˆ
r   c                ó    — t          j        |¦  «        }| j                             |¦  «         |                     | j        j        ¦  «         |S r   )rH   Úcreate_taskrÄ   ÚaddÚadd_done_callbackÚdiscard)r   Úcoror}   s      r   ÚspawnzVoiceManager.spawn¥   sD   € ÝÔ" 4Ñ(Ô(ˆØŒ
�Š�tÑÔÐØ×Ò˜tœzÔ1Ñ2Ô2Ð2Øˆr   c                óÞ   — | j                              |j        ¦  «        |u oL|                      |¦  «        o7|                      |j        ¦  «        |j        k    o|                      ¦   «          S r   )rÁ   rP   Úconnection_idr¿   r¼   Ú	device_idr¬   rÀ   ©r   ÚdeviceÚrequests      r   ÚvalidzVoiceManager.valid«   so   € Ø”×!Ò! &Ô"6Ñ7Ô7¸7ÐBð hÀtÇÂÐW]ÑG^ÔG^ð hØ—O’O FÔ$4Ñ5Ô5¸¼ÒGðhØPT×PeÒPeÑPgÔPgÐLgð	ir   Úvoice_statec              ‹  óÄ   K  — |                       |¦  «        rH|                      |t          d||j        |j        |j        |j        |j        dœ|¤Ž¦  «        ƒ d {V —† d S d S )N)Útyperª   r°   r­   r®   rŒ   r   )r¿   r¾   Údictrª   r°   r­   r®   rŒ   )r   rÐ   rÑ   ÚkindÚextras        r   ÚemitzVoiceManager.emit¯   s°   è è € Ø�?Š?˜6Ñ"Ô"ð 	aØ—)’)˜F¥Dð %`¨d¸WÔ=MÐU\ÔUbØ”m°Ô0BÈÌð%`ð %`ØY^ð%`ð %`ñ aô að að að að að að að að að að	að 	ar   TF)ÚnotifyÚforgetc               óê  — | j                              |j        d ¦  «        }|r¬|j        r|j                             ¦   «          |j        r3|j        t          j        ¦   «         ur|j                             ¦   «          d|_        |j	         
                    ¦   «          d|_        |r)|                      |                      ||¦  «        ¦  «         |r"| j                             |j        d ¦  «         d S d S )NÚ	CANCELLEDr:   )rÁ   ÚpoprÍ   r¸   Úcancelr}   rH   Úcurrent_taskr°   r¤   Úclearr·   rË   Úemit_safelyrÂ   )r   rÐ   rÚ   rÛ   rÑ   s        r   rß   zVoiceManager.cancel´   só   € Ø”-×#Ò# FÔ$8¸$Ñ?Ô?ˆØð 		>ØŒ}ð 'Ø”×$Ò$Ñ&Ô&Ð&ØŒ|ð & ¤µGÔ4HÑ4JÔ4JÐ JÐ JØ”×#Ò#Ñ%Ô%Ð%Ø'ˆGŒMØŒK×ÒÑÔÐØ!#ˆGÔØð >Ø—
’
˜4×+Ò+¨F°GÑ<Ô<Ñ=Ô=Ð=Øð 	6ØŒI�MŠM˜&Ô.°Ñ5Ô5Ð5Ð5Ð5ð	6ð 	6r   c              ƒ  óf   K  — 	 |                       ||¦  «        ƒ d {V —† d S # t          $ r Y d S w xY wr   )rÙ   Ú	ExceptionrÏ   s      r   râ   zVoiceManager.emit_safelyÃ   sY   è è € ð	Ø—)’)˜F GÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð 	ð 	ð 	ØˆDˆDð	øøøs   „" ¢
0¯0c           	   ƒ  ó„  ‡ ‡‡‡K  — ‰                      d¦  «        ‰                      d¦  «        }}t          |t          ¦  «        rt          j        d|¦  «        sd S ‰                      ‰¦  «        sd S |dk    �rat                               dt          |¦  «        t          ‰j	        ¦  «        ¦  «         ‰ j
                             ‰j	        t          ¦   «         ¦  «        }||v st          |¦  «        dk    rd S |                     |¦  «         ‰                      ‰¦  «         ‰                      ‰j        ¦  «        }t%          |¦  «        }|s"‰                      ‰d|dd	œ¦  «        ƒ d {V —† d S ‰                      ¦   «         rd S |\  }}	t+          ˆfd
„dD ¦   «         ¦  «        r"‰                      ‰d|dd	œ¦  «        ƒ d {V —† d S t-          |‰j	        |||	|	¦  «        Š‰‰ j        ‰j	        <   	 ‰                      |¦  «                             |	¦  «        ƒ d {V —†}
‰                      ‰‰¦  «        s‰                      ‰¦  «         d S |
j        ‰_        t9          j        ¦   «                              t>          ˆˆˆ fd„¦  «        ‰_         ‰  !                    ‰‰¦  «        ƒ d {V —† n-# tD          $ r  ‰  #                    ‰‰d¦  «        ƒ d {V —† Y nw xY wd S ‰ j                              ‰j	        ¦  «        Š‰r‰j$        |k    rd S ‰                      ‰‰¦  «        s‰                      ‰¦  «         d S |dk    s|dk    r0‰                      d¦  «        dk    r‰                      ‰¦  «         d S |dk    �r}‰j%        dk    �rq	 ‰                      d¦  «        }t          |t          ¦  «        rt          |¦  «        dk    rtM          ¦   «         ‚tO          j(        |d¬¦  «        }tS          ‰                      d¦  «        ¦  «        tT          usz‰d         ‰j+        k    si|rgt          |¦  «        dz  sUt          |¦  «        tX          k    s=t          ‰j-        ¦  «        t          |¦  «        z   t\          k    s‰j+        t^          k    rtM          ¦   «         ‚‰j-         0                    |¦  «         ‰xj+        dz  c_+        d S # tL          tb          j2        f$ r ‰                      ‰¦  «         Y d S w xY w|dk    rrt                               dt          |¦  «        t          ‰j	        ¦  «        ‰j+        t          ‰j-        ¦  «        ¦  «         ‰  3                    ‰‰¦  «        ƒ d {V —† d S |dk    rÇ‰                      d¦  «        dk    r°‰j%        dk    r§d ‰_%        ‰j4        d!c}‰_4        	 ‰                      ‰j5        ¦  «         6                    ‰j7        |¦  «        ƒ d {V —† d"‰_%        ‰  !                    ‰‰¦  «        ƒ d {V —† d S # tD          $ r! ‰  #                    ‰‰d#¦  «        ƒ d {V —† Y d S w xY wd S d S d S )$NrÕ   rª   z[A-Za-z0-9_-]{1,64}Úvoice_startz0[VOICE_RX] event=start voice_id=%s connection=%sé   Úvoice_errorzNO AGENT SELECTED)rÕ   rª   Úmessagec              3  óP   •K  — | ] \  }}‰                      |¦  «        |k    V — Œ!d S r   )rP   )rA   ÚkÚvÚevents      €r   rC   z&VoiceManager.handle.<locals>.<genexpr>ß   s6   øè è € ÐdÐd©¨¨A�5—9’9˜Q‘<”< 1Ò$ÐdÐdÐdÐdÐdÐdr   ))Úsample_rater
   )Úbitsr   )Úchannelsr   zUnsupported audio formatc                 óV   •— ‰                      ‰                     ‰ ‰¦  «        ¦  «        S r   )rË   Úend)rÐ   Úreqr   s   €€€r   ú<lambda>z%VoiceManager.handle.<locals>.<lambda>í   s!   ø€ ˜DŸJšJ t§x¢x°¸Ñ'<Ô'<Ñ=Ô=€ r   zAgent unavailableÚvoice_cancelÚvoice_decisionÚdecisionrß   Úvoice_chunkr¯   r|   iø  T)Úvalidaterµ   r   r   Ú	voice_endzE[VOICE_RX] event=end voice_id=%s connection=%s chunks=%d pcm_bytes=%dr¾   ÚAWAITING_CONFIRMATIONÚSENDINGr:   ÚSENTz0Input failed; check Agent status before retrying)8rP   r   r   ÚreÚ	fullmatchr¿   rV   rW   r   rÍ   rÂ   Ú
setdefaultrÃ   rT   rÇ   rß   r¼   rÎ   r	   r¾   rÀ   Úanyr©   rÁ   r½   Úget_sessionrÒ   rŒ   rH   Úget_running_loopÚ
call_laterÚMAX_SECONDSr¸   rÙ   rä   Úfailrª   r°   rQ   r~   Ú	b64decoderÕ   r´   rµ   ÚCHUNK_BYTESr¤   Ú	MAX_BYTESÚ
MAX_CHUNKSÚextendÚbinasciiÚErrorrò   r·   r­   Ú
send_inputr®   )r   rÐ   rí   r×   ÚvidÚusedr¬   Úparsedr­   ÚsidÚsessionr|   r¤   r·   ró   s   ```           @r   ÚhandlezVoiceManager.handleÉ   sÕ  øøøøè è € Ø—I’I˜fÑ%Ô% u§y¢y°Ñ'<Ô'<ˆcˆÝ˜#�sÑ#Ô#ð 	­2¬<Ð8NÐPSÑ+TÔ+Tð 	ØˆFØ�Š˜vÑ&Ô&ð 	ØˆFØ�=Ò Ñ Ý�KŠKÐJÝ  ™œ¥x°Ô0DÑ'EÔ'EñGô Gð Gà”9×'Ò'¨Ô(<½c¹e¼eÑDÔDˆDØ�dˆ{ˆ{�c $™iœi¨3Ò.Ð.Ø�Ø�HŠH�S‰MŒMˆMØ�KŠK˜ÑÔÐØ—_’_ VÔ%5Ñ6Ô6ˆFÝ! &Ñ)Ô)ˆFØð Ø—i’i °ÈÐWjÐ(kÐ(kÑlÔlÐlÐlÐlÐlÐlÐlÐlØ�Ø×$Ò$Ñ&Ô&ð Ø�Ø‰JˆE�3ÝÐdÐdÐdÐdÐ1cÐdÑdÔdÑdÔdð Ø—i’i °ÈÐWqÐ(rÐ(rÑsÔsÐsÐsÐsÐsÐsÐsÐsØ�õ ˜s FÔ$8¸&À%ÈÈcÑRÔRˆCØ25ˆDŒM˜&Ô.Ñ/ð
BØ $× 0Ò 0°Ñ 7Ô 7× CÒ CÀCÑ HÔ HÐHÐHÐHÐHÐHÐH�Ø—z’z &¨#Ñ.Ô.ð Ø—K’K Ñ'Ô'Ð'Ø�FØ"œ<�”Ý#Ô4Ñ6Ô6×AÒAÅ+Ø=Ð=Ð=Ð=Ð=Ð=ñ?ô ?�”	à—i’i ¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð Bð Bð BØ—i’i ¨Ð-@ÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAðBøøøàˆFØŒm×Ò Ô 4Ñ5Ô5ˆØð 	�c”l cÒ)Ð)ØˆFØ�zŠz˜& #Ñ&Ô&ð 	Ø�KŠK˜ÑÔÐØˆFØ�>Ò!Ð! dÐ.>Ò&>Ð&>À5Ç9Â9ÈZÑCXÔCXÐ\dÒCdÐCdØ�KŠK˜ÑÔÐÐÐØ�]Ò"Ñ" s¤y°KÒ'?Ñ'?ð$ØŸ	š	 'Ñ*Ô*�Ý! %­Ñ-Ô-ð 'µ°U±´¸dÒ1BÐ1BÝ$™,œ,Ð&ÝÔ& u°tÐ<Ñ<Ô<�Ý˜Ÿš :Ñ.Ô.Ñ/Ô/µsÐ:Ð:¸eÀJÔ>OÐSVÔS_Ò>_Ð>_Ø"ð ?`Ý&)¨#¡h¤h°¡lð ?`Ý69¸#±h´hÅÒ6LÐ6LÝ˜sœw™<œ<­#¨c©(¬(Ñ2µYÒ>Ð>À#Ä,ÕR\ÒB\ÐB\Ý$™,œ,Ð&Ø”—’˜sÑ#Ô#Ð#Ø�” Ñ!�”��øÝ¥¤Ð/ð $ð $ð $Ø—’˜FÑ#Ô#Ð#Ð#Ð#Ð#ð$øøøà�[Ò Ð Ý�KŠKÐ_Ý  ™œ¥x°Ô0DÑ'EÔ'EÀsÄ|ÕUXÐY\ÔY`ÑUaÔUañcô cð cà—(’(˜6 3Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐ%Ò%Ð%¨%¯)ª)°JÑ*?Ô*?À6Ò*IÐ*IÈcÌiÐ[rÒNrÐNrà!ˆCŒIØ),¬¸Ð&ˆJ˜œðaØ×&Ò& s¤yÑ1Ô1×<Ò<¸S¼^ÈZÑXÔXÐXÐXÐXÐXÐXÐXÐXØ"�”	Ø—i’i ¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð að að aØ—i’i ¨Ð-_Ñ`Ô`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`Ð`ðaøøøð &Ð%Ð*IÐ*IÐNrÐNrs@   Ç3AJ- ÉAJ- Ê-'KËKÎD<S Ó+S4Ó3S4Ö0AX Ø'X9Ø8X9c              ƒ  ó2  K  — |j         dk    s|                      ||¦  «        sd S |j        r|j                             ¦   «          d|_         |                      ||¦  «        ƒ d {V —† |                      |                      ||¦  «        ¦  «        |_        d S )Nr¯   ÚTRANSCRIBING)r°   rÒ   r¸   rß   rÙ   rË   r    r}   )r   rÐ   ró   s      r   rò   zVoiceManager.end  s›   è è € ØŒ9˜Ò#Ð#¨4¯:ª:°f¸cÑ+BÔ+BÐ#ØˆFØŒ9ð 	ØŒI×ÒÑÔÐØ"ˆŒ	Ø�iŠi˜ Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø—:’:˜dŸošo¨f°cÑ:Ô:Ñ;Ô;ˆŒˆˆr   c           	   ƒ  ó  K  — t          j        ¦   «         }d}t                               dt	          |j        ¦  «        t	          |j        ¦  «        |j        t          |j	        ¦  «        ¦  «         	 | j
        r|j	        st          ¦   «         ‚t          |j	        ¦  «        }|j	                             ¦   «          t          j        | j
                             |¦  «        d¦  «        ƒ d {V —†}t#          |t$          ¦  «        r1d                     d„ |D ¦   «         ¦  «                             ¦   «         }t#          |t$          ¦  «        r(|r&t          |                     d¦  «        ¦  «        dk    rt          ¦   «         ‚|                      ||¦  «        su	 |j	                             ¦   «          t                               dt	          |j        ¦  «        t	          |j        ¦  «        t          j        ¦   «         |z
  d	z  |¦  «         d S |                     ¦   «         d
c|_        |_        |                      ||d|j        ¬¦  «        ƒ d {V —† d}nR# t          j        $ r ‚ t6          $ r6 |                      ||¦  «        r|                      ||d¦  «        ƒ d {V —† Y nw xY w|j	                             ¦   «          t                               dt	          |j        ¦  «        t	          |j        ¦  «        t          j        ¦   «         |z
  d	z  |¦  «         d S # |j	                             ¦   «          t                               dt	          |j        ¦  «        t	          |j        ¦  «        t          j        ¦   «         |z
  d	z  |¦  «         w xY w)NFzH[VOICE_STT] event=start voice_id=%s connection=%s chunks=%d pcm_bytes=%dé   r:   c              3  óH   K  — | ]}|d v st          |¦  «        dk    ¯|V — ŒdS r<   r>   r@   s     r   rC   z*VoiceManager.transcribe.<locals>.<genexpr>,  s4   è è € ÐNÐN Q°!°v°+°+ÅÀQÁÄÈ2ÂÀ˜qÀÀÀÀÐNÐNr   rD   rE   zP[VOICE_STT] event=complete voice_id=%s connection=%s duration_ms=%.1f success=%dr   rû   Úvoice_transcript)r·   Tr'   )rF   rG   rV   rW   r   rª   r«   rµ   rT   r¤   r“   rQ   r§   rá   rH   Úwait_forr    r   r   rR   rS   rU   rÒ   r·   r°   rÙ   ÚCancelledErrorrä   r  )r   rÐ   ró   r`   r6   r|   r9   s          r   r    zVoiceManager.transcribe   sr  è è € Ý”.Ñ"Ô"ˆØˆÝ�ŠÐ^Ý˜Sœ\Ñ*Ô*­H°S´^Ñ,DÔ,DÀcÄlÕTWÐX[ÔX_ÑT`ÔT`ñ	bô 	bð 	bð	FØ”=ð #¨¬ð #Ý ‘l”lÐ"Ý˜CœGÑ$Ô$ˆEØŒG�MŠM‰OŒOˆOÝ Ô)¨$¬-×*BÒ*BÀ5Ñ*IÔ*IÈ2ÑNÔNÐNÐNÐNÐNÐNÐNˆDÝ˜$¥Ñ$Ô$ð WØ—w’wÐNÐN¨$ÐNÑNÔNÑNÔN×TÒTÑVÔV�Ý˜d¥CÑ(Ô(ð #°ð #½¸D¿KºKÈÑ<PÔ<PÑ8QÔ8QÐTXÒ8XÐ8XÝ ‘l”lÐ"Ø—:’:˜f cÑ*Ô*ð Øð ŒG�MŠM‰OŒOˆOÝ�KŠKÐjÝ  ¤Ñ.Ô.µ¸¼Ñ0HÔ0HÝœÑ)Ô)¨GÑ3°tÑ;¸WñFô Fð Fð Fð Fð )-¯
ª
©¬Ð6MÐ%ˆCŒN˜CœIØ—)’)˜F CÐ);ÈÌ�)ÑWÔWÐWÐWÐWÐWÐWÐWÐWØˆGˆGøÝÔ%ð 	ð 	ð 	ØÝð 	Eð 	Eð 	EØ�zŠz˜& #Ñ&Ô&ð EØ—i’i ¨Ð-CÑDÔDÐDÐDÐDÐDÐDÐDÐDøøð	Eøøøð ŒG�MŠM‰OŒOˆOÝ�KŠKÐjÝ  ¤Ñ.Ô.µ¸¼Ñ0HÔ0HÝœÑ)Ô)¨GÑ3°tÑ;¸WñFô Fð Fð Fð Føð ŒG�MŠM‰OŒOˆOÝ�KŠKÐjÝ  ¤Ñ.Ô.µ¸¼Ñ0HÔ0HÝœÑ)Ô)¨GÑ3°tÑ;¸WñFô Fð Fð Føøøs4   Á2D#I È
AI ÉL ÉAJ!ÊL Ê J!Ê!L ÌA4Nc              ƒ  óØ   K  — d\  |_         |_        |j                             ¦   «          |j        r|j                             ¦   «          |                      ||d|¬¦  «        ƒ d {V —† d S )N)ÚFAILEDr:   rè   )ré   )r°   r·   r¤   rá   r¸   rß   rÙ   )r   rÐ   ró   ré   s       r   r  zVoiceManager.fail?  ss   è è € Ø$0Ñ!ˆŒ	�3”>ØŒ�Š‰ŒˆØŒ9ð 	ØŒI×ÒÑÔÐØ�iŠi˜  ]¸GˆiÑDÔDÐDÐDÐDÐDÐDÐDÐDÐDÐDr   c              ƒ  óš  K  — | j                              ¦   «         D ]B}|j        r|j                             ¦   «          |j                             ¦   «          d|_        ŒC| j                              ¦   «          | j                             ¦   «          | j        D ]}|                     ¦   «          Œt          j
        | j        ddiŽƒ d {V —† d S )Nr:   Úreturn_exceptionsT)rÁ   r–   r¸   rß   r¤   rá   r·   rÂ   rÄ   rH   Úgather)r   ró   r}   s      r   ÚclosezVoiceManager.closeF  sÆ   è è € Ø”=×'Ò'Ñ)Ô)ð 	 ð 	 ˆCØŒyÐ,˜#œ)×*Ò*Ñ,Ô,Ð,ØŒG�MŠM‰OŒOˆOØˆCŒNˆNØŒ×ÒÑÔÐØŒ	�ŠÑÔÐØ”JÐ-Ð-ˆD §¢¡¤  ÝŒn˜dœjÐA¸DÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐAr   N)rÓ   )r!   r"   r#   r)   rË   rÒ   rÙ   rß   râ   r  rò   r    r  r"  r   r   r   rº   rº   �   sè   € € € € € ðð ð ðð ð ðið ið iðað að að að
 (,°Eð 6ð 6ð 6ð 6ð 6ðð ð ðLað Lað Lað\<ð <ð <ðFð Fð Fð>Eð Eð EðBð Bð Bð Bð Br   rº   )*Ú__doc__Ú
__future__r   rH   r~   r  rš   ÚloggingrŠ   rþ   rF   rœ   Údataclassesr   r   Útypingr   rI   Úcontrol.modelsr   r°   r	   r¡   r  r	  r  r
  r�   Ú	getLoggerr!   rV   r   r   ÚRuntimeErrorr%   r-   rh   rv   r—   r§   r©   rº   r   r   r   ú<module>r+     s�  ðØ RÐ RØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø €€€Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à €€€à (Ð (Ð (Ð (Ð (Ð (Ø Ð Ð Ð Ð Ð à€Ø€Ø˜!‰O˜kÑ)€	Ø€Ø€
Ø2€Ø	ˆÔ	˜8Ñ	$Ô	$€ð?ð ?ð ?ð
=ð =ð =ð =ð =˜8ñ =ô =ð =ð1ð 1ð 1ð 1ð 1˜ñ 1ô 1ð 1ð
"Oð "Oð "Oð "Oð "Oñ "Oô "Oð "OðJCð Cð Cð Cð CÐ*ñ Cô Cð Cð.ð .ð .ð .ð .Ð%5ñ .ô .ð .ð$ð ð ð"ð ð ð ðHð Hð Hð Hð Hñ Hô Hñ „ðHðqBð qBð qBð qBð qBñ qBô qBð qBð qBð qBr   