Ë
    Gü´jæ]  ã            	       óZ  — 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j`                   ejb                  «       ¬«      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@y)*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| j                  d«      D ]  }|j                  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         úR/root/workspace/ytshorts/venv/lib/python3.12/site-packages/edge_tts/communicate.pyÚget_headers_and_datar0   2   sw   € ô �dœEÔ"ÜÐ,Ó-Ð-à€GØ�^�mÐ$×*Ñ*¨7Ó3ò ˆØ—Z‘Z  aÓ(‰
ˆˆUØˆ�Šðð �D˜¨Ñ*Ð,Ð-Ð-Ð-ó    Ústringc                 óJ  — t        | t        «      r| j                  d«      } t        | t        «      st	        d«      ‚t        | «      }t        |«      D ]>  \  }}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  sŒ7n Œ:d	||<   Œ@ d
j                  |«      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Ô"ÜÐ5Ó6Ð6ä˜F“|€Eä˜uÓ%ò ‰	ˆˆTÜ˜“IˆØ�ŒN˜ŒN  dÔ 0¨bÔ 0°b¸DÔ6FÀBÖ6FØˆE�#ŠJðð
 �7‰7�5‹>Ðr1   c                  ó>   — 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                 ó\   — | j                  dd|«      }|dk  r| j                  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   s4   € ð" �z‰z˜%  EÓ*€Hà�!‚|Ø—:‘:˜d A uÓ-ˆØ€Or1   Útext_segmentc                 óŠ   — t        | «      }|dkD  r	 | d| j                  d«       |S |S # t        $ r |dz  }Y nw xY w|dkD  rŒ3Œ)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àˆOð
 €Oøô	 "ò 	à˜‰MŠHð	úð �Q‹,øs   ’* ª;º;rS   c                 ó”   — |dkD  rBd| d| v r;| j                  dd|«      }| j                  d||«      dk7  r	 |S |}|dkD  rd| d| v rŒ;|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   ¤   sm   € ð" �QŠ,˜4 4¨	¨ ?Ñ2ØŸ+™+ d¨A¨xÓ8ˆà�9‰9�T˜?¨HÓ5¸Ò;àð
 €Oð #ˆð �QŠ,˜4 4¨	¨ ?Ò2ð €Or1   Úbyte_lengthc              #   óÆ  K  — t        | t        «      r| j                  d«      } t        | t        «      st	        d«      ‚|dk  rt        d«      ‚t        | «      |kD  rlt        | |«      }|dk  rt        | «      }t        | |«      }|dk  rt        d«      ‚| d| j                  «       }|r|–— | |dkD  r|ndd } t        | «      |kD  rŒl| j                  «       }|r|–— yy­w)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Ô"ÜÐ3Ó4Ð4à�aÒÜÐ=Ó>Ð>ä
ˆd‹)�kÒ
!ä;¸DÀ+ÓNˆà�aŠ<ä2°4Ó8ˆHô 6°d¸HÓEˆà�aŠ<ô ðCóð ð �Y�h�×%Ñ%Ó'ˆÙØŠKð  ¨1¢‘H°!Ð5Ð6ˆô5 ˆd‹)�kÓ
!ð: —j‘j“l€OÙØÓð ùs   ‚CC!Ã	C!ÚtcÚescaped_textc                 ó¸   — t        |t        «      r|j                  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     sd   € ô �,¤Ô&Ø#×*Ñ*¨7Ó3ˆð	ØŸ™�zð "ØŸ8™8˜* H¨R¯W©W¨I°ZÀÇ	Á	¸{È"Øˆ.ð	ð		ðr1   c                  óR   — 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ÁkÃ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  s)   € ð �z�lð #à �kð "àˆ&ð		ðr1   c                   óJ  — 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y)"Ú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œ| _        y )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  s  € ô $ E¨4°¸ÀÓIˆŒô ˜$¤Ô$ÜÐ.Ó/Ð/ô /ÜÔ1°$Ó7Ó8Øó
ˆŒ
ð Ð¤Z°´sÔ%;ÜÐ/Ó0Ð0Ø$)ˆŒ
ô ˜/¬3Ô/ÜÐ9Ó:Ð:Ü˜/¬3Ô/ÜÐ9Ó:Ð:Ü&×4Ñ4ØØØ(Ø%ô	 
ˆÔð Ð ¬°I¼w×?TÑ?TÔ)UÜÐEÓFÐFØ:CˆŒð  Ø#$Ø$%Ø!&Ø!"Ø&'ñ(
ˆ�
r1   r!   r#   c                 óþ   — t        j                  |«      d   D ]X  }|d   }|dv r;|d   d   | j                  d   z   }|d   d   }|||t        |d   d   d	   «      d
œc S |dv rŒLt	        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ˆHØ  Ñ(ˆIØÐ@Ñ@à˜VÑ$ XÑ.°·±Ð<QÑ1RÑRð ð $,¨FÑ#3°JÑ#?Ð à%Ø,Ø 0Ü$ X¨fÑ%5°fÑ%=¸fÑ%EÓFñ	ò ð ˜OÑ+ØÜ!Ð$;¸I¸;Ð"GÓHÐHð	Iô  !Ð!AÓ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<   y)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•  sj   € ð 	�
‰
Ð+Ó,°·
±
Ð;NÑ0OÑOÓ,à�J‰JÐ/Ñ0Øñäñô ñð 	�
‰
Ð(Ñ)ð +,ˆ�
‰
Ð&Ò'r1   c           
     óz  ‡ ‡K  — d&ˆ ˆfd„}d&ˆ ˆfd„}d}t        j                  ‰ j                  d‰ j                  ¬«      4 ƒd {  –—† }|j	                  t
        › dt        «       › dt        j                  «       › dt        › �d	‰ j                  t        j                  t        «      t        ¬
«      4 ƒd {  –—† Š |«       ƒ d {  –—†   |«       ƒ d {  –—†  ‰2 3 d {  –—† }|j                  t         j                  j                   k(  r§|j"                  j%                  d«      }t'        ||j)                  d«      «      \  }}|j+                  dd «      }	|	dk(  r/‰ j-                  |«      }
|
­–— |
d   |
d   z   ‰ j.                  d<   Œ¯|	dk(  r‰ j1                  «         �n¬|	dvsŒÌt3        d«      ‚|j                  t         j                  j4                  k(  �r$t7        |j"                  «      dk  rt9        d«      ‚t:        j=                  |j"                  d d d«      }|t7        |j"                  «      kD  rt9        d«      ‚t'        |j"                  |«      \  }}|j+                  d«      dk7  rt9        d«      ‚|j+                  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#œ­–— �Œ#|j                  t         j                  j>                  k(  s�ŒLtA        |j"                  r|j"                  «      ‚d$«      ‚|stC        d%«      ‚d d d «      ƒd {  –—†  d d d «      ƒd {  –—†  y 7 �Œ77 �ŒÉ7 �Œ½7 �Œ±7 �Œ©6 Œ?7 Œ&# 1 ƒd {  –—†7  sw Y   Œ6xY w7 Œ-# 1 ƒd {  –—†7  sw Y   y xY w­w)'Nc            	   “   ó²   •K  — ‰j                   j                  dk(  } | rdnd}| sdnd}‰j                  dt        «       › d|› d|› d�«      ƒ d{  –—†  y7 Œ­w)	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ª  sn   øè ø€ à ŸO™O×4Ñ4¸ÑFˆMÙ(‘¨gˆBÙ,‘°'ˆBØ×$Ñ$Øœ~Ó/Ð0ð 1.ð /1¨TÐ1JÈ2È$ð Oð	ó	÷ 	ò 	ús   ƒAAÁAÁAc               “   ó¼   •K  — ‰j                  t        t        «       t        «       t	        ‰ j
                  ‰ j                  d   «      «      «      ƒ d{  –—†  y7 Œ­w)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º  sM   øè ø€ à×$Ñ$Ü&Ü“LÜ"Ó$ÜØŸ™ØŸ
™
 >Ñ2óóó	÷ 	ò 	ús   ƒAAÁAÁA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‘nØØ×(Ñ(ô
÷ g	ð g	ð �g×(Ñ(Üˆi�~¤j£l ^Øœ3×2Ñ2Ó4Ð5Ø"Ô#5Ð"6ð8ð Ø—*‘*Ü×)Ñ)¬+Ó6Üð )ó 
÷	g	ð g	ð Ù&Ó(×(Ð(á#Ó%×%Ð%à"+÷ Qð Q�hØ—=‘=¤G×$5Ñ$5×$:Ñ$:Ò:Ø*2¯-©-×*>Ñ*>¸wÓ*G�LÜ';Ø$ l×&7Ñ&7¸Ó&Dó(Ñ$�J ð &Ÿ>™>¨'°4Ó8�DØÐ0Ò0à*.×*?Ñ*?ÀÓ*E˜Ø-Ó-ð ,¨HÑ5¸È
Ñ8SÑSð Ÿ
™
Ð#9Ò:ð  Ò,ð ×0Ñ0Ô2ÚØÐ%AÒAÜ-Ð.EÓFÐFØ—]‘]¤g×&7Ñ&7×&>Ñ&>Ó>ä˜8Ÿ=™=Ó)¨AÒ-Ü0Ø`óð ô
 %(§N¡N°8·=±=ÀÀ!Ð3DÀeÓ$L�MØ$¤s¨8¯=©=Ó'9Ò9Ü0ØWóð ô
 (<Ø Ÿ™ }ó(Ñ$�J ð
 "—~‘~ gÓ.°(Ò:Ü0ØQóð ð $.§>¡>°/À4Ó#H�LØ#Ð+@Ñ@Ü0Ø[óð ð
 $Ð+Ü˜t›9¨š>Ù$ô 1ØZóð ô
 ˜4“y A’~Ü0ØXóð ð
 *.Ð&Ø—J‘JÐ2Ó3´s¸4³yÑ@Ó3Ø#*°DÑ9Õ9Ø—]‘]¤g×&7Ñ&7×&=Ñ&=Ô=Ü(Ø)1¯ª˜Ÿ™óð Ø<Kóð ñ &Ü%Ø\óð ÷Kg	÷ g	÷ g	÷ g	ñ g	ùð g	ùð )ùà%ùðQù )øð#g	ø÷ g	÷ g	ñ g	úð g	ø÷ g	÷ g	ñ g	üsç   „AN;ÁM<ÁN;Á	A-N&Â6M?Â7N&Â:NÃNÃNÃNÃNÃNÃN
Ã NÃ#CNÆ'E>NÌ'4NÍN&Í&NÍ'N&Í+N;Í6N$Í7N;Í?N&ÎNÎNÎNÎNÎN&ÎN!	ÎNÎN!	ÎN&Î$N;Î&N8Î,N/Î-N8Î4N;c                óè  K  — | j                   d   rt        d«      ‚d| j                   d<   | j                  D ]=  | j                   d<   d| j                   d<   	 | j                  «       2 3 d{  –—† }|­–— Œ y7 Œ6 ŒE# t        j
                  $ r_}|j                  dk7  r‚ t        j                  |«       d| j                   d<   | j                  «       2 3 d{  –—†7  }|­–— Œ6 Y d}~Œ²d}~ww xY w­w)	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  sã   è ø€ ð �:‰:Ð)Ò*ÜÐ@ÓAÐAØ*.ˆ�
‰
Ð&Ñ'ð +/¯*©*ò 	"ˆD�J‰J�~Ñ&Ø./ˆD�J‰JÐ*Ñ+ð
"Ø%)§]¡]£_÷ "ð "˜'Ø!”Mñ		"ð"ø¡_øä×.Ñ.ò "Ø—8‘8˜s’?Øä×0Ñ0°Ô3Ø23�—
‘
Ð.Ñ/Ø%)§]¡]£_÷ "ñ "˜'Ø!”Mõ &5ûð"üss   ‚AC2ÁA=Á(A;Á,A9Á-A;Á0A=Á7C2Á9A;Á;A=Á<C2Á=C/ÂAC*ÃC$ÃC
ÃC$ÃC*Ã%C2Ã*C/Ã/C2Úaudio_fnameÚmetadata_fnamec              ƒ   ó¨  K  — |�t        |dd¬«      n	t        «       }|5  t        |d«      5 }| j                  «       2 3 d{  –—† }|d   dk(  r|j                  |d   «       Œ&t	        |t
        «      sŒ7|d   d	v sŒ?t        j                  ||«       |j                  d
«       Œg7 Œb6 	 ddd«       n# 1 sw Y   nxY wddd«       y# 1 sw Y   yxY w­w)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ä“ð 	ð
 ñ 		)”t˜K¨Ó.ð 		)°%Ø!%§¡£÷ )ð )�gØ˜6‘? gÒ-Ø—K‘K ¨¡Õ0Ü ¬-Õ8¸WÀV¹_ð Qò >ô —I‘I˜g xÔ0Ø—N‘N 4Õ(ð)ø¡÷		)÷ 		)ñ 		)ú÷ 		)÷ 		)ñ 		)üsb   ‚CŸC¬B1½B&ÁB$
ÁB&Á.B1Á4B1Á<(B1Â$B&Â&B1Â(	CÂ1B:	Â6CÂ=	CÃCÃCc              #   óü   ‡ K  — dt         ddfˆ fd„}t        «       }t        j                  j                  «       5 }|j	                  ||«       	 |j                  «       }|€n|–— Œ	 ddd«       y# 1 sw Y   yxY w­w)z-Synchronous interface for async stream methodÚqueuer#   Nc                 ó´   •‡ — dˆ ˆfd„}t        j                  «       }t        j                  |«       |j                   |«       «       |j	                  «        y )Nc               “   óŒ   •K  — ‰j                  «       2 3 d {  –—† } ‰j                  | «       Œ7 Œ6 ‰j                  d «       y ­w©N)rã   Úput)Úitemrñ   r›   s    €€r/   Ú	get_itemszECommunicate.stream_sync.<locals>.fetch_async_items.<locals>.get_itemss  s:   øè ø€ Ø"&§+¡+£-÷ $ð $˜$Ø—I‘I˜d•Oð$ø -à—	‘	˜$•ùs   ƒA”1˜/™1œA¯1±A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  s?   ù€ ö ô
 ×)Ñ)Ó+ˆDÜ×"Ñ" 4Ô(Ø×#Ñ#¡I£KÔ0Ø�J‰J�Lr1   )r   Ú
concurrentÚfuturesÚThreadPoolExecutorÚsubmitrÌ   )r›   rþ   rñ   Úexecutorrö   s   `    r/   Ústream_synczCommunicate.stream_synco  s   øè ø€ ð		¤Uð 		¨tõ 		ô “wˆä×Ñ×2Ñ2Ó4ð 	¸Ø�O‰OÐ-¨uÔ5àØ—y‘y“{�Ø�<ØØ’
ð	 ð ÷	÷ 	ñ 	üs   ƒ7A<º,A0Á'	A<Á0A9Á5A<c                 óê   — t         j                  j                  «       5 }|j                  t        j
                  | j                  ||«      «      }|j                  «        ddd«       y# 1 sw Y   yxY w)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ˆ  sZ   € ô ×Ñ×2Ñ2Ó4ð 	¸Ø—_‘_Ü—‘˜TŸY™Y {°NÓCóˆFð �M‰MŒO÷		÷ 	ñ 	ús   ŸAA)Á)A2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  sŒ  „ ñð #ð9
ð
 ØØØ@RØ59Ø#Ø)+Ø)+ò9
àð9
ð ð9
ð
 ð9
ð ð9
ð ð9
ð Ð<Ñ=ð9
ð ˜G×1Ñ1Ñ2ð9
ð ˜‰}ð9
ð " #™ð9
ð " #™ó9
ðvC Uð C¨xó Có&,ð(K ¨x¸¨~Ñ >ó 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ó Û Û Û 
Û Û Ý "Ý Ý ÷	÷ 	ó 	÷ .ã Û Ý %÷÷ õ $Ý ÷ó ÷ /à%ˆ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ðJˆyð ¨¨c°5¨jÑ(9ð ¸có ð2˜ó ð  sð °sð À#ð È#ó ÷"Qò Qr1   