§
    ²eîiæ]  ã            	       ó~  — d 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	 ddl
mZ ddlmZ ddlmZmZmZmZmZmZmZ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mZm Z m!Z!m"Z"m#Z#m$Z$ d	dl%m&Z& d	dl'm(Z( d	dl)m*Z*m+Z+m,Z,m-Z- d	dlm.Z.m/Z/  ej0         ej1        ¦   «         ¬¦  «        Z2de3de4deee3e3f         e3f         fd„Z5dee6e3f         de6fd„Z7de6fd„Z8de3de4de4fd„Z9de3de4fd„Z:de3de4de4fd„Z;dee6e3f         de4dee3ddf         fd„Z<d e&d!ee6e3f         de6fd"„Z=de6fd#„Z>d$e6d%e6d&e6de6fd'„Z? G d(„ d)¦  «        Z@dS )*z�Communicate with the service. Only the Communicate class should be used by
end-users. The other classes and functions are for internal use only.é    N)Únullcontext)ÚTextIOWrapper)ÚQueue)ÚAsyncGeneratorÚContextManagerÚDictÚ	GeneratorÚListÚOptionalÚTupleÚUnion)ÚescapeÚunescape)ÚLiteralé   )ÚDEFAULT_VOICEÚMP3_BITRATE_BPSÚSEC_MS_GEC_VERSIONÚTICKS_PER_SECONDÚWSS_HEADERSÚWSS_URL)Ú	TTSConfig)ÚDRM)ÚNoAudioReceivedÚUnexpectedResponseÚUnknownResponseÚWebSocketError)ÚCommunicateStateÚTTSChunk)ÚcafileÚdataÚheader_lengthÚreturnc                 óè   — t          | t          ¦  «        st          d¦  «        ‚i }| d|…                              d¦  «        D ] }|                     dd¦  «        \  }}|||<   Œ!|| |dz   d…         fS )z÷
    Returns the headers and data from the given data.

    Args:
        data (bytes): The data to be parsed.
        header_length (int): The length of the header.

    Returns:
        tuple: The headers and data to be used in the request.
    zdata must be bytesNs   
ó   :r   é   )Ú
isinstanceÚbytesÚ	TypeErrorÚsplit)r!   r"   ÚheadersÚlineÚkeyÚvalues         úX/home/div/.hermes/hermes-agent/venv/lib/python3.11/site-packages/edge_tts/communicate.pyÚget_headers_and_datar0   2   s�   € õ �d�EÑ"Ô"ð .ÝÐ,Ñ-Ô-Ð-à€GØ�^�m�^Ô$×*Ò*¨7Ñ3Ô3ð ð ˆØ—Z’Z  aÑ(Ô(‰
ˆˆUØˆ�‰ˆà�D˜¨Ñ*Ð,Ð,Ô-Ð-Ð-ó    Ústringc                 ó”  — t          | t          ¦  «        r|                      d¦  «        } t          | t          ¦  «        st	          d¦  «        ‚t          | ¦  «        }t          |¦  «        D ]G\  }}t          |¦  «        }d|cxk    rdk    s!n d|cxk    rdk    sn d|cxk    rdk    rn ŒBd	||<   ŒHd
                     |¦  «        S )aS  
    The service does not support a couple character ranges.
    Most important being the vertical tab character which is
    commonly present in OCR-ed PDFs. Not doing this will
    result in an error from the service.

    Args:
        string (str or bytes): The string to be cleaned.

    Returns:
        str: The cleaned string.
    úutf-8zstring must be str or bytesr   é   é   é   é   é   Ú Ú )	r'   r(   ÚdecodeÚstrr)   ÚlistÚ	enumerateÚordÚjoin)r2   ÚcharsÚidxÚcharÚcodes        r/   Úremove_incompatible_charactersrF   J   sé   € õ �&�%Ñ Ô ð (Ø—’˜wÑ'Ô'ˆÝ�f�cÑ"Ô"ð 7ÝÐ5Ñ6Ô6Ð6å˜F‘|”|€Eå˜uÑ%Ô%ð ð ‰	ˆˆTÝ˜‘I”IˆØ�ˆNˆNŠNˆN˜ŠNˆNˆNˆN  dÐ 0Ð 0Ò 0Ð 0¨bÒ 0Ð 0Ð 0Ð 0°b¸DÐ6FÐ6FÒ6FÐ6FÀBÒ6FÐ6FÐ6FÐ6FÐ6FØˆE�#‰Jøà�7Š7�5‰>Œ>Ðr1   c                  ó2   — t          j        ¦   «         j        S )zZ
    Returns a UUID without dashes.

    Returns:
        str: A UUID without dashes.
    )ÚuuidÚuuid4Úhex© r1   r/   Ú
connect_idrL   f   s   € õ Œ:‰<Œ<ÔÐr1   ÚtextÚlimitc                 ón   — |                       dd|¦  «        }|dk     r|                       dd|¦  «        }|S )a  
    Finds the index of the rightmost preferred split character (newline or space)
    within the initial `limit` bytes of the text.

    This helps find a natural word or sentence boundary for splitting, prioritizing
    newlines over spaces.

    Args:
        text (bytes): The byte string to search within.
        limit (int): The maximum index (exclusive) to search up to.

    Returns:
        int: The index of the last found newline or space within the limit,
             or -1 if neither is found in that range.
    ó   
r   ó    )Úrfind)rM   rN   Úsplit_ats      r/   Ú(_find_last_newline_or_space_within_limitrT   p   s<   € ð" �zŠz˜%  EÑ*Ô*€Hà�!‚|€|Ø—:’:˜d A uÑ-Ô-ˆØ€Or1   Útext_segmentc                 ó¦   — t          | ¦  «        }|dk    r;	 | d|…                              d¦  «         |S # t          $ r |dz  }Y nw xY w|dk    °;|S )aÿ  
    Finds the rightmost possible byte index such that the
    segment `text_segment[:index]` is a valid UTF-8 sequence.

    This prevents splitting in the middle of a multi-byte UTF-8 character.

    Args:
        text_segment (bytes): The byte segment being considered for splitting.

    Returns:
        int: The index of the safe split point. Returns 0 if no valid split
             point is found (e.g., if the first byte is part of a multi-byte
             sequence longer than the limit allows).
    r   Nr4   r   )Úlenr<   ÚUnicodeDecodeError)rU   rS   s     r/   Ú_find_safe_utf8_split_pointrY   ˆ   s{   € õ �<Ñ Ô €HØ
�QŠ,ˆ,ð	Ø˜˜(˜Ô#×*Ò*¨7Ñ3Ô3Ð3àˆOøÝ!ð 	ð 	ð 	à˜‰MˆHˆHˆHð	øøøð �QŠ,ˆ,ð €Os   —6 ¶AÁArS   c                 ó¸   — |dk    rSd| d|…         v rG|                       dd|¦  «        }|                      d||¦  «        dk    rn|}|dk    rd| d|…         v °G|S )a¡  
    Adjusts a proposed split point backward to prevent splitting inside an XML entity.

    For example, if `text` is `b"this &amp; that"` and `split_at` falls between
    `&` and `;`, this function moves `split_at` to the index before `&`.

    Args:
        text (bytes): The text segment being considered.
        split_at (int): The proposed split point index, determined by whitespace
                        or UTF-8 safety.

    Returns:
        int: The adjusted split point index. It will be moved to the '&'
             if an unterminated entity is detected right before the original `split_at`.
             Otherwise, the original `split_at` is returned.
    r   ó   &Nó   ;éÿÿÿÿ)ÚrindexÚfind)rM   rS   Úampersand_indexs      r/   Ú"_adjust_split_point_for_xml_entityra   ¤   s}   € ð" �QŠ,ˆ,˜4 4¨	¨¨	¤?Ð2Ð2ØŸ+š+ d¨A¨xÑ8Ô8ˆà�9Š9�T˜?¨HÑ5Ô5¸Ò;Ð;àð #ˆð �QŠ,ˆ,˜4 4¨	¨¨	¤?Ð2Ð2ð €Or1   Úbyte_lengthc              #   óP  K  — t          | t          ¦  «        r|                      d¦  «        } t          | t          ¦  «        st	          d¦  «        ‚|dk    rt          d¦  «        ‚t          | ¦  «        |k    r‘t          | |¦  «        }|dk     rt          | ¦  «        }t          | |¦  «        }|dk     rt          d¦  «        ‚| d|…          
                    ¦   «         }|r|V — | |dk    r|ndd…         } t          | ¦  «        |k    °‘|  
                    ¦   «         }|r|V — dS dS )a  
    Splits text into chunks, each not exceeding a maximum byte length.

    This function prioritizes splitting at natural boundaries (newlines, spaces)
    while ensuring that:
    1. No chunk exceeds `byte_length` bytes.
    2. Chunks do not end with an incomplete UTF-8 multi-byte character.
    3. Chunks do not split XML entities (like `&amp;`) in the middle.

    Args:
        text (str or bytes): The input text. If str, it's encoded to UTF-8.
        byte_length (int): The maximum allowed byte length for any yielded chunk.
                           Must be positive.

    Yields:
        bytes: Text chunks (UTF-8 encoded, stripped of leading/trailing whitespace)
               that conform to the byte length and integrity constraints.

    Raises:
        TypeError: If `text` is not str or bytes.
        ValueError: If `byte_length` is not positive, or if a split point
                    cannot be determined (e.g., due to extremely small byte_length
                    relative to character/entity sizes).
    r4   ztext must be str or bytesr   z"byte_length must be greater than 0zTMaximum byte length is too small or invalid text structure near '&' or invalid UTF-8Nr   )r'   r=   Úencoder(   r)   Ú
ValueErrorrW   rT   rY   ra   Ústrip)rM   rb   rS   ÚchunkÚremaining_chunks        r/   Úsplit_text_by_byte_lengthri   Â   s`  è è € õ6 �$�ÑÔð $Ø�{Š{˜7Ñ#Ô#ˆÝ�d�EÑ"Ô"ð 5ÝÐ3Ñ4Ô4Ð4à�aÒÐÝÐ=Ñ>Ô>Ð>å
ˆd‰)Œ)�kÒ
!Ð
!å;¸DÀ+ÑNÔNˆà�aŠ<ˆ<å2°4Ñ8Ô8ˆHõ 6°d¸HÑEÔEˆà�aŠ<ˆ<õ ðCñô ð ð �Y�h�Y”×%Ò%Ñ'Ô'ˆØð 	ØˆKˆKˆKð  ¨1¢ �H�H°!Ð5Ð5Ô6ˆõ5 ˆd‰)Œ)�kÒ
!Ð
!ð: —j’j‘l”l€OØð ØÐÐÐÐÐðð r1   ÚtcÚescaped_textc                 ó¢   — t          |t          ¦  «        r|                     d¦  «        }d| j        › d| j        › d| j        › d| j        › d|› d�S )zû
    Creates a SSML string from the given parameters.

    Args:
        tc (TTSConfig): The TTS configuration.
        escaped_text (str or bytes): The escaped text. If bytes, it must be UTF-8 encoded.

    Returns:
        str: The SSML string.
    r4   z_<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'><voice name='z'><prosody pitch='z' rate='z
' volume='z'>z</prosody></voice></speak>)r'   r(   r<   ÚvoiceÚpitchÚrateÚvolume)rj   rk   s     r/   Úmkssmlrq     sƒ   € õ �,¥Ñ&Ô&ð 4Ø#×*Ò*¨7Ñ3Ô3ˆð	Øœð	ð 	àœ8ð	ð 	à-/¬Wð	ð 	à@BÄ	ð	ð 	ð ð	ð 	ð 	ðr1   c                  óN   — t          j        dt          j        ¦   «         ¦  «        S )zg
    Return Javascript-style date string.

    Returns:
        str: Javascript-style date string.
    z:%a %b %d %Y %H:%M:%S GMT+0000 (Coordinated Universal Time))ÚtimeÚstrftimeÚgmtimerK   r1   r/   Údate_to_stringrv      s#   € õ Œ=ØDÅdÄkÁmÄmñô ð r1   Ú
request_idÚ	timestampÚssmlc                 ó   — d| › d|› d|› �S )zŒ
    Returns the headers and data to be used in the request.

    Returns:
        str: The headers and data to be used in the request.
    zX-RequestId:z1
Content-Type:application/ssml+xml
X-Timestamp:zZ
Path:ssml

rK   )rw   rx   ry   s      r/   Ússml_headers_plus_datar{   0  s4   € ð	�zð 	ð 	à ð	ð 	ð ð		ð 	ðr1   c                   ó–  — e Zd ZdZefdddddddddœd	ed
ededededed         deej	                 dee         dee
         dee
         fd„Zdedefd„Zd d„Zdeedf         fd„Zdeedf         fd„Z	 d!deeef         deeeef                  ddfd„Zdeeddf         fd„Z	 d!deeef         deeeef                  ddfd„ZdS )"ÚCommunicatez'
    Communicate with the service.
    z+0%z+0HzÚSentenceBoundaryNé
   é<   )ro   rp   rn   ÚboundaryÚ	connectorÚproxyÚconnect_timeoutÚreceive_timeoutrM   rm   ro   rp   rn   r�   ©ÚWordBoundaryr~   r‚   rƒ   r„   r…   c                ó€  — t          |||||¦  «        | _        t          |t          ¦  «        st	          d¦  «        ‚t          t          t          |¦  «        ¦  «        d¦  «        | _        |�$t          |t          ¦  «        st	          d¦  «        ‚|| _	        t          |	t          ¦  «        st	          d¦  «        ‚t          |
t          ¦  «        st	          d¦  «        ‚t          j        d d |	|
¬¦  «        | _        |�)t          |t          j        ¦  «        st	          d¦  «        ‚|| _        dd	d	d
d	d	dœ| _        d S )Nztext must be stri   zproxy must be strzconnect_timeout must be intzreceive_timeout must be int)ÚtotalÚconnectÚsock_connectÚ	sock_readz'connector must be aiohttp.BaseConnectorr1   r   F)Úpartial_textÚoffset_compensationÚlast_duration_offsetÚstream_was_calledÚchunk_audio_bytesÚcumulative_audio_bytes)r   Ú
tts_configr'   r=   r)   ri   r   rF   Útextsrƒ   ÚintÚaiohttpÚClientTimeoutÚsession_timeoutÚBaseConnectorr‚   Ústate)ÚselfrM   rm   ro   rp   rn   r�   r‚   rƒ   r„   r…   s              r/   Ú__init__zCommunicate.__init__G  sU  € õ $ E¨4°¸ÀÑIÔIˆŒõ ˜$¥Ñ$Ô$ð 	0ÝÐ.Ñ/Ô/Ð/õ /ÝÕ1°$Ñ7Ô7Ñ8Ô8Øñ
ô 
ˆŒ
ð Ð¥Z°µsÑ%;Ô%;ÐÝÐ/Ñ0Ô0Ð0Ø$)ˆŒ
õ ˜/­3Ñ/Ô/ð 	;ÝÐ9Ñ:Ô:Ð:Ý˜/­3Ñ/Ô/ð 	;ÝÐ9Ñ:Ô:Ð:Ý&Ô4ØØØ(Ø%ð	 
ñ  
ô  
ˆÔð Ð ­°I½wÔ?TÑ)UÔ)UÐ ÝÐEÑFÔFÐFØ:CˆŒð  Ø#$Ø$%Ø!&Ø!"Ø&'ð(
ð (
ˆŒ
ˆ
ˆ
r1   r!   r#   c                 óB  — t          j        |¦  «        d         D ]v}|d         }|dv rR|d         d         | j        d         z   }|d         d         }|||t          |d         d         d	         ¦  «        d
œc S |dv rŒet	          d|› �¦  «        ‚t          d¦  «        ‚)NÚMetadataÚTyper†   ÚDataÚOffsetrŽ   ÚDurationrM   ÚText)ÚtypeÚoffsetÚdurationrM   )Ú
SessionEndzUnknown metadata type: zNo WordBoundary metadata found)ÚjsonÚloadsrš   r   r   r   )r›   r!   Úmeta_objÚ	meta_typeÚcurrent_offsetÚcurrent_durations         r/   Ú__parse_metadatazCommunicate.__parse_metadata‚  sÛ   € Ýœ
 4Ñ(Ô(¨Ô4ð 	Ið 	IˆHØ  Ô(ˆIØÐ@Ð@Ð@à˜VÔ$ XÔ.°´Ð<QÔ1RÑRð ð $,¨FÔ#3°JÔ#?Ð à%Ø,Ø 0Ý$ X¨fÔ%5°fÔ%=¸fÔ%EÑFÔFð	ð ð ð ð ð ˜OÐ+Ð+ØÝ!Ð"G¸IÐ"GÐ"GÑHÔHÐHÝ Ð!AÑBÔBÐBr1   c                 óª   — | j         dxx         | j         d         z  cc<   | j         d         dz  t          z  t          z  | j         d<   d| j         d<   dS )aç  Update inter-chunk offset_compensation from cumulative CBR audio bytes.

        The output format is audio-24khz-48kbitrate-mono-mp3 (48 kbps CBR).
        For any CBR stream the byte-to-tick conversion is exact integer
        arithmetic:  ticks = total_bytes * 8 * 10_000_000 // 48_000.

        This replaces the previous metadata-based accumulation which drifted
        on long texts due to variable AI silence and Microsoft's integer
        overflow in reported offsets.
        r’   r‘   r5   rŽ   r   N)rš   r   r   )r›   s    r/   Ú__compensate_offsetzCommunicate.__compensate_offset•  sr   € ð 	Œ
Ð+Ð,Ð,Ô,°´
Ð;NÔ0OÑOÐ,Ð,Ñ,àŒJÐ/Ô0Øñåñõ ñð 	Œ
Ð(Ñ)ð +,ˆŒ
Ð&Ñ'Ð'Ð'r1   c           
     óx  ‡ ‡K  — d'ˆ ˆfd„}d'ˆ ˆfd„}d}t          j        ‰ j        d‰ j        ¬¦  «        4 ƒd {V —†	 }|                     t
          › dt          ¦   «         › dt          j        ¦   «         › d	t          › �d
‰ j
        t          j        t          ¦  «        t          ¬¦  «        4 ƒd {V —†	 Š |¦   «         ƒ d {V —†  |¦   «         ƒ d {V —† ‰2 3 d {V —†}|j        t           j        j        k    rÁ|j                             d¦  «        }t'          ||                     d¦  «        ¦  «        \  }}|                     dd ¦  «        }	|	dk    r4‰                      |¦  «        }
|
W V — |
d         |
d         z   ‰ j        d<   Œ±|	dk    r‰                      ¦   «           �n¾|	dvrt3          d¦  «        ‚Œâ|j        t           j        j        k    �rUt7          |j        ¦  «        dk     rt9          d¦  «        ‚t:                               |j        d d…         d¦  «        }|t7          |j        ¦  «        k    rt9          d¦  «        ‚t'          |j        |¦  «        \  }}|                     d¦  «        dk    rt9          d¦  «        ‚|                     dd ¦  «        }|dvrt9          d¦  «        ‚|€$t7          |¦  «        dk    r�Œót9          d ¦  «        ‚t7          |¦  «        dk    rt9          d!¦  «        ‚d}‰ j        d"xx         t7          |¦  «        z  cc<   d#|d$œW V — �ŒR|j        t           j        j        k    rtA          |j        r|j        nd%¦  «        ‚�Œ‹6 |stC          d&¦  «        ‚	 d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   d d d ¦  «        ƒd {V —† d S # 1 ƒd {V —†swxY w Y   d S )(Nr#   c            	   “   ó¦   •K  — ‰j         j        dk    } | rdnd}| sdnd}‰                     dt          ¦   «         › d|› d|› d�¦  «        ƒ d{V —† dS )	z)Sends the command request to the service.r‡   ÚtrueÚfalsezX-Timestamp:z–
Content-Type:application/json; charset=utf-8
Path:speech.config

{"context":{"synthesis":{"audio":{"metadataoptions":{"sentenceBoundaryEnabled":"z","wordBoundaryEnabled":"z9"},"outputFormat":"audio-24khz-48kbitrate-mono-mp3"}}}}
N)r“   r�   Úsend_strrv   )Úword_boundaryÚwdÚsqr›   Ú	websockets      €€r/   Úsend_command_requestz2Communicate.__stream.<locals>.send_command_requestª  s®   øè è € à œOÔ4¸ÒFˆMØ(Ð5��¨gˆBØ,Ð9��°'ˆBØ×$Ò$ð�~Ñ/Ô/ð ð ð /1ð	ð ð LNð	ð ð ñ	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r1   c               “   óÌ   •K  — ‰                      t          t          ¦   «         t          ¦   «         t	          ‰ j        ‰ j        d         ¦  «        ¦  «        ¦  «        ƒ d{V —† dS )z&Sends the SSML request to the service.r�   N)rµ   r{   rL   rv   rq   r“   rš   )r›   r¹   s   €€r/   Úsend_ssml_requestz/Communicate.__stream.<locals>.send_ssml_requestº  s€   øè è € à×$Ò$Ý&Ý‘L”LÝ"Ñ$Ô$ÝØœØœ
 >Ô2ñô ñô ñ	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r1   FT)r‚   Ú	trust_envÚtimeoutz&ConnectionId=z&Sec-MS-GEC=z&Sec-MS-GEC-Version=é   )Úcompressrƒ   r+   Ússlr4   s   

s   Paths   audio.metadatar¥   r¦   r�   s   turn.end)s   responses
   turn.startzUnknown path receivedr&   zBWe received a binary message, but it is missing the header length.Úbigz9The header length is greater than the length of the data.s   audioz3Received binary message, but the path is not audio.s   Content-Type)s
   audio/mpegNz=Received binary message, but with an unexpected Content-Type.r   z<Received binary message with no Content-Type, but with data.z:Received binary message, but it is missing the audio data.r‘   Úaudio)r¤   r!   zUnknown errorzFNo audio was received. Please verify that your parameters are correct.©r#   N)"r–   ÚClientSessionr‚   r˜   Ú
ws_connectr   rL   r   Úgenerate_sec_ms_gecr   rƒ   Úheaders_with_muidr   Ú_SSL_CTXr¤   Ú	WSMsgTypeÚTEXTr!   rd   r0   r_   ÚgetÚ_Communicate__parse_metadatarš   Ú_Communicate__compensate_offsetr   ÚBINARYrW   r   r•   Ú
from_bytesÚERRORr   r   )r›   rº   r¼   Úaudio_was_receivedÚsessionÚreceivedÚencoded_dataÚ
parametersr!   ÚpathÚparsed_metadatar"   Úcontent_typer¹   s   `            @r/   Ú__streamzCommunicate.__stream©  s-  øøè è € ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð  #Ðõ Ô(Ø”nØØÔ(ð
ñ 
ô 
ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð �g×(Ò(Ýð 8ð 8¥j¡l¤lð 8ð 8ÝÔ2Ñ4Ô4ð8ð 8å#5ð8ð 8ð Ø”*ÝÔ)­+Ñ6Ô6Ýð )ñ 
ô 
ð	g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð Ø&Ð&Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(à#Ð#Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%à"+ð Qð Qð Qð Qð Qð Qð Q�hØ”=¥GÔ$5Ô$:Ò:Ð:Ø*2¬-×*>Ò*>¸wÑ*GÔ*G�LÝ';Ø$ l×&7Ò&7¸Ñ&DÔ&Dñ(ô (Ñ$�J ð &Ÿ>š>¨'°4Ñ8Ô8�DØÐ0Ò0Ð0à*.×*?Ò*?ÀÑ*EÔ*E˜Ø-Ð-Ð-Ð-Ð-ð ,¨HÔ5¸È
Ô8SÑSð œ
Ð#9Ñ:Ð:ð  Ò,Ð,ð ×0Ò0Ñ2Ô2Ð2Ø™ØÐ%AÐAÐAÝ-Ð.EÑFÔFÐFð Bà”]¥gÔ&7Ô&>Ò>Ñ>å˜8œ=Ñ)Ô)¨AÒ-Ð-Ý0Ø`ñô ð õ
 %(§N¢N°8´=ÀÀ!ÀÔ3DÀeÑ$LÔ$L�MØ$¥s¨8¬=Ñ'9Ô'9Ò9Ð9Ý0ØWñô ð õ
 (<Ø œ }ñ(ô (Ñ$�J ð
 "—~’~ gÑ.Ô.°(Ò:Ð:Ý0ØQñô ð ð $.§>¢>°/À4Ñ#HÔ#H�LØ#Ð+@Ð@Ð@Ý0Ø[ñô ð ð
 $Ð+Ý˜t™9œ9¨š>˜>Ù$õ 1ØZñô ð õ
 ˜4‘y”y A’~�~Ý0ØXñô ð ð
 *.Ð&Ø”JÐ2Ð3Ð3Ô3µs¸4±y´yÑ@Ð3Ð3Ñ3Ø#*°DÐ9Ð9Ð9Ð9Ð9Ð9Ñ9Ø”]¥gÔ&7Ô&=Ò=Ð=Ý(Ø)1¬ÐK˜œ˜¸Oñô ð ñ >ð] #,ðf &ð Ý%Ø\ñô ð ð ðKg	ð g	ð g	ñ g	ô g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	øøøð g	ð g	ð g	ð g	ð g	ð g	ð g	ñ g	ô g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	ð g	øøøð g	ð g	ð g	ð g	ð g	ð g	sC   ½A4N)Â2#NÃM ÃJNÍ3N)Î
N	ÎN)ÎN	ÎN)Î)
N3Î6N3c                ó¤  K  — | j         d         rt          d¦  «        ‚d| j         d<   | j        D ]Ÿ| j         d<   d| j         d<   	 |                      ¦   «         2 3 d{V —†}|W V — Œ6 Œ8# t          j        $ rV}|j        dk    r‚ t          j        |¦  «         d| j         d<   |                      ¦   «         2 3 d{V —†}|W V — Œ6 Y d}~Œ˜d}~ww xY wdS )	au  
        Streams audio and metadata from the service.

        Raises:
            NoAudioReceived: If no audio is received from the service.
            UnexpectedResponse: If the response from the service is unexpected.
            UnknownResponse: If the response from the service is unknown.
            WebSocketError: If there is an error with the websocket.
        r�   zstream can only be called once.Tr�   r   r‘   Ni“  )	rš   ÚRuntimeErrorr”   Ú_Communicate__streamr–   ÚClientResponseErrorÚstatusr   Úhandle_client_response_error)r›   ÚmessageÚes      r/   ÚstreamzCommunicate.stream6  sI  è è € ð Œ:Ð)Ô*ð 	BÝÐ@ÑAÔAÐAØ*.ˆŒ
Ð&Ñ'ð +/¬*ð 	"ð 	"ˆDŒJ�~Ñ&Ø./ˆDŒJÐ*Ñ+ð
"Ø%)§]¢]¡_¤_ð "ð "ð "ð "ð "ð "ð "˜'Ø!�M�M�M�M�Mð &5 _øåÔ.ð "ð "ð "Ø”8˜s’?�?ØåÔ0°Ñ3Ô3Ð3Ø23�”
Ð.Ñ/Ø%)§]¢]¡_¤_ð "ð "ð "ð "ð "ð "ð "˜'Ø!�M�M�M�M�Mð &5 _ _ _ _ _øøøøð"øøøð	"ð 	"s0   ÁA(ÁA&ÁA(Á(CÁ7>CÂ5CÂ;CÃCÚaudio_fnameÚmetadata_fnamec              ƒ   óò  K  — |�t          |dd¬¦  «        nt          ¦   «         }|5  t          |d¦  «        5 }|                      ¦   «         2 3 d{V —†}|d         dk    r|                     |d         ¦  «         Œ/t	          |t
          ¦  «        r4|d         d	v r*t          j        ||¦  «         |                     d
¦  «         Œy6 	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )zE
        Save the audio and metadata to the specified files.
        NÚwr4   )ÚencodingÚwbr¤   rÃ   r!   r†   Ú
)Úopenr   rã   Úwriter'   r   r¨   Údump)r›   rä   rå   ÚmetadatarÃ   rá   s         r/   ÚsavezCommunicate.saveW  s¬  è è € ð Ð)õ � ¨wÐ7Ñ7Ô7Ð7å‘”ð 	ð
 ð 		)ð 		)•t˜K¨Ñ.Ô.ð 		)°%Ø!%§¢¡¤ð )ð )ð )ð )ð )ð )ð )�gØ˜6”? gÒ-Ð-Ø—K’K ¨¤Ñ0Ô0Ð0Ð0Ý ­-Ñ8Ô8ð )¸WÀV¼_ð Qð >ð >õ ”I˜g xÑ0Ô0Ð0Ø—N’N 4Ñ(Ô(Ð(øð "/ ð		)ð 		)ð 		)ñ 		)ô 		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)øøøð 		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)ñ 		)ô 		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)ð 		)øøøð 		)ð 		)ð 		)ð 		)ð 		)ð 		)sA   §C,¸CÁCÁA4CÃC,ÃC	ÃC,ÃC	ÃC,Ã,C0Ã3C0c              #   ó  ‡ K  — dt           ddfˆ fd„}t          ¦   «         }t          j                             ¦   «         5 }|                     ||¦  «         	 |                     ¦   «         }|€n|V — Œ	 ddd¦  «         dS # 1 swxY w Y   dS )z-Synchronous interface for async stream methodÚqueuer#   Nc                 óÈ   •‡ — dˆ ˆfd„}t          j        ¦   «         }t          j        |¦  «         |                      |¦   «         ¦  «         |                     ¦   «          d S )Nr#   c               “   óš   •K  — ‰                      ¦   «         2 3 d {V —†} ‰                     | ¦  «         Œ6 ‰                     d ¦  «         d S ©N)rã   Úput)Úitemrñ   r›   s    €€r/   Ú	get_itemszECommunicate.stream_sync.<locals>.fetch_async_items.<locals>.get_itemss  s`   øè è € Ø"&§+¢+¡-¤-ð $ð $ð $ð $ð $ð $ð $˜$Ø—I’I˜d‘O”O�O�Oð #0à—	’	˜$‘”���s   ˜5rÄ   )ÚasyncioÚnew_event_loopÚset_event_loopÚrun_until_completeÚclose)rñ   r÷   Úloopr›   s   `  €r/   Úfetch_async_itemsz2Communicate.stream_sync.<locals>.fetch_async_itemsr  ss   øø€ ð ð  ð  ð  ð  ð  ð  õ
 Ô)Ñ+Ô+ˆDÝÔ" 4Ñ(Ô(Ð(Ø×#Ò# I I¡K¤KÑ0Ô0Ð0Ø�JŠJ‰LŒLˆLˆLˆLr1   )r   Ú
concurrentÚfuturesÚThreadPoolExecutorÚsubmitrÌ   )r›   rþ   rñ   Úexecutorrö   s   `    r/   Ústream_synczCommunicate.stream_synco  sö   øè è € ð		¥Uð 		¨tð 		ð 		ð 		ð 		ð 		ð 		õ ‘w”wˆåÔ×2Ò2Ñ4Ô4ð 	¸Ø�OŠOÐ-¨uÑ5Ô5Ð5ðØ—y’y‘{”{�Ø�<ØØ�
�
�
ð	ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ¿4BÂBÂBc                 ó  — t           j                             ¦   «         5 }|                     t          j        |                      ||¦  «        ¦  «        }|                     ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )z,Synchronous interface for async save method.N)rÿ   r   r  r  rø   Úrunrï   Úresult)r›   rä   rå   r  Úfutures        r/   Ú	save_synczCommunicate.save_syncˆ  s±   € õ Ô×2Ò2Ñ4Ô4ð 	¸Ø—_’_Ý”˜TŸYšY {°NÑCÔCñô ˆFð �MŠM‰OŒOˆOð		ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   ŸA	A5Á5A9Á<A9rÄ   rô   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r=   r   r   r–   r™   r•   rœ   r(   r   rÍ   rÎ   r   rÝ   rã   r   rï   r	   r  r	  rK   r1   r/   r}   r}   A  s2  € € € € € ðð ð #ð9
ð
 ØØØ@RØ59Ø#Ø)+Ø)+ð9
ð 9
ð 9
àð9
ð ð9
ð
 ð9
ð ð9
ð ð9
ð Ð<Ô=ð9
ð ˜GÔ1Ô2ð9
ð ˜Œ}ð9
ð " #œð9
ð " #œð9
ð 9
ð 9
ð 9
ðvC Uð C¨xð Cð Cð Cð Cð&,ð ,ð ,ð ,ð(K ¨x¸¨~Ô >ð Kð Kð Kð KðZ"à	˜ $˜Ô	'ð"ð "ð "ð "ðH 7;ð)ð )à˜3 ˜:Ô&ð)ð !  s¨E zÔ!2Ô3ð)ð 
ð	)ð )ð )ð )ð0˜Y x°°tÐ';Ô<ð ð ð ð ð8 7;ð
ð 
à˜3 ˜:Ô&ð
ð !  s¨E zÔ!2Ô3ð
ð 
ð	
ð 
ð 
ð 
ð 
ð 
r1   r}   )Ar  rø   Úconcurrent.futuresrÿ   r¨   rÁ   rs   rH   Ú
contextlibr   Úior   rñ   r   Útypingr   r   r   r	   r
   r   r   r   Úxml.sax.saxutilsr   r   r–   ÚcertifiÚtyping_extensionsr   Ú	constantsr   r   r   r   r   r   Údata_classesr   Údrmr   Ú
exceptionsr   r   r   r   r   r   Úcreate_default_contextÚwhererÉ   r(   r•   r0   r=   rF   rL   rT   rY   ra   ri   rq   rv   r{   r}   rK   r1   r/   ú<module>r     s  ððIð Ið €€€Ø Ð Ð Ð Ø €€€Ø 
€
€
€
Ø €€€Ø €€€Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð .Ð -Ð -Ð -Ð -Ð -Ð -Ð -à €€€Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð $Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð /Ð .Ð .Ð .Ð .Ð .Ð .Ð .à%ˆ3Ô%¨]¨W¬]©_¬_Ð=Ñ=Ô=€ð.Ø
ð.Ø #ð.à
ˆ4��u�Ô˜uÐ$Ô%ð.ð .ð .ð .ð0¨5°°e°Ô+<ð Àð ð ð ð ð8�Cð ð ð ð ð°5ð Àð Èð ð ð ð ð0¨eð ¸ð ð ð ð ð8¨Uð ¸cð Àcð ð ð ð ð<BØ
��U�
Ô
ðBØ*-ðBàˆu�d˜DÐ Ô!ðBð Bð Bð BðJˆyð ¨¨c°5¨jÔ(9ð ¸cð ð ð ð ð2˜ð ð ð ð ð  sð °sð À#ð È#ð ð ð ð ð"Qð Qð Qð Qð Qñ Qô Qð Qð Qð Qr1   