
    "|hl                    h   d dl mZ d dlmZmZ d dlmZmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZ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mZmZ d dlmZ d dl Z d dl!Z!d d	l!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'Z'd
dl(m)Z)m*Z* d
dl+m,Z,m-Z- d
dl.m/Z/m0Z0 d
dl1m2Z2m3Z3 d
dl4m5Z5m6Z6m7Z7 dd ejp                  di gdddddgddgi      fgZ9 G d de      Z: G d de      Z; G d de      Z<dSd Z= G d! d"e      Z>i e>j~                  d#e>j                  d$e>j                  d%e>j                  d&e>j                  d'e>j                  d(e>j                  d)e>j                  d*e>j                  d+e>j                  d,e>j                  d-e>j                  d e>j                  d.e>j                  d/e>j                  d0e>j                  d1e>j                  d2i e>j                  d3e>j                  d4e>j                  d5e>j                  d6e>j                  de>j                  de>j                  d7e>j                  d
e>j                  d8e>j                  d9e>j                  d:e>j                  d;e>j                  d<e>j                  d=e>j                  d>e>j                  d?e>j                  d@e>j                  dAe>j                  dBe>j                  dCiZde G dD dE             ZedTdFZfdUdGZg G dH dIe      Zh G dJ dK      Zi G dL dMeej         Zk G dN dO      Zl G dP dQeem         ZndVdRZoy)W    )annotations)	dataclassfield)datetime	timedelta)Enum)	AnyDict	GeneratorIterableIteratorListTupleOptionalUnionN)connectClientConnection)ConnectionClosed)Channelinsecure_channelsecure_channelssl_channel_credentials
StatusCode   )get_coordinatesInferenceCoordinatesOptions)LeaseLeaseFactory)api_pb2api_pb2_grpc)Metrics	Telemetry)prepare_textSENTENCE_END_REGEXget_voice_engine_and_protocol)zgrpc.enable_retriesr   zgrpc.service_configmethodConfig   z0.01sz0.3s   UNAVAILABLE)maxAttemptsinitialBackoff
maxBackoffbackoffMultiplierretryableStatusCodes)nameretryPolicyc                      e Zd Zej                  Zej
                  Zej                  Zej                  Zej                  Zej                  Z	ej                  Z
y)FormatN)__name__
__module____qualname__r   
FORMAT_RAW
FORMAT_MP3
FORMAT_WAV
FORMAT_OGGFORMAT_FLACFORMAT_MULAW
FORMAT_PCM     J/var/www/html/test/engine/venv/lib/python3.12/site-packages/pyht/client.pyr2   r2   /   sO    ##J##J##J##J%%K''L##Jr>   r2   c                  (    e Zd ZdZdZdZdZdZdZdZ	y)	
HTTPFormatrawmp3wavoggflacmulawpcmN)
r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   rA   rA   9   s%    JJJJKLJr>   rA   c                      e Zd ZdZdZdZy)CandidateRankingMethoddescription_asr_with_mean_probmean_prob_with_end_probxls_alignerN)r3   r4   r5   DescriptionASRWithMeanProbRankMeanProbWithEndProbRankXLSAlignerRankr=   r>   r?   rJ   rJ   D   s    %E" 8"Nr>   rJ   c                   | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S | t         j
                  k(  rt        j
                  S | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S | t         j                  k(  rt        j                  S t        d|        )Nz!Unsupported format for HTTP API: )
r2   r6   rA   r7   r8   r9   r:   r;   r<   
ValueError)formats    r?   grpc_format_to_http_formatrT   M   s    """$$$	6$$	$$$$	6$$	$$$$	6$$	$$$$	6%%	%%%%	6&&	&&&&	6$$	$$$$<VHEFFr>   c                      e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'y&)'Language	afrikaansalbanianamharicarabicbengali	bulgariancatalancroatianczechdanishdutchenglishfrenchgaliciangermangreekhebrewhindi	hungarian
indonesianitalianjapanesekoreanmalaymandarinpolish
portugueserussianserbianspanishswedishtagalogthaiturkish	ukrainianurduxhosaN)(r3   r4   r5   	AFRIKAANSALBANIANAMHARICARABICBENGALI	BULGARIANCATALANCROATIANCZECHDANISHDUTCHENGLISHFRENCHGALICIANGERMANGREEKHEBREWHINDI	HUNGARIAN
INDONESIANITALIANJAPANESEKOREANMALAYMANDARINPOLISH
PORTUGUESERUSSIANSERBIANSPANISHSWEDISHTAGALOGTHAITURKISH	UKRAINIANURDUXHOSAr=   r>   r?   rV   rV   `   s    IHGFGIGHEFEGFHFEFEIJGHFEHFJGGGGGDGIDEr>   rV      !                "                  $   
                           	                        #         c                  h   e Zd ZU ded<   ej
                  Zded<   dZded<   dZd	ed
<   dZ	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZd ed!<   dZded"<   d$d#Zy)%
TTSOptionsstrvoicer2   rS   NzOptional[int]sample_rateg      ?floatspeedseedzOptional[float]temperaturetop_ptext_guidancevoice_guidancerepetition_penaltystyle_guidancezOptional[bool]disable_stabilizationzOptional[Language]languageOptional[str]voice_2turn_prefixturn_prefix_2voice_conditioning_secondsvoice_conditioning_seconds_2scene_descriptionturn_clip_descriptionnum_candidatesz Optional[CandidateRankingMethod]candidate_ranking_methodqualityc           	     \   |d}n|dk7  r|dk7  rt        d|       d }| j                  t        | j                     }t        j                  || j
                  | j                  j                  t        j                  | j                  || j                        }| j                  | j                  |_        | j                  | j                  |_        | j                  | j                  |_        | j                  | j                  |_        | j                  | j                  |_        |S )NPlayHT2.0-turboPlay3.0-minizIgRPC API only supports PlayHT2.0-turbo, Play3.0-mini (on-prem only); got )textr   rS   r   r   language_identifierr   )rR   r   LanguageIdentifiersr   	TtsParamsr   rS   valueQUALITY_DRAFTr   r   r   r   r   r   r   )selfr   voice_enginer   paramss        r?   
tts_paramszTTSOptions.tts_params   s   ,L^+@Q0Qhiuhvwxx"==$"5dmm"D""**;;$$))(( 3**
 '!%!1!1F::!::FL)#'#5#5F *$($7$7F!99 ))FKr>   )r   z	list[str]r   r   returnzapi_pb2.TtsParams)r3   r4   r5   __annotations__r2   r8   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r=   r>   r?   r   r      s   J&&FF&!%K%E5D-#'K'!E?! &*M?)&*NO**.. '+NO* -1>0 $(H ' "G]!!%K%#'M='04426 -6'+}++/=/$(NM(AE>E "G]!r>   r   c                
   t        |       }|t        j                  k(  ry|t        j                  k(  ry|t        j                  k(  ry|t        j
                  k(  ry|t        j                  k(  ry|t        j                  k(  ryy)Nzaudio/basicz
audio/mpegz	audio/wavz	audio/oggz
audio/flac)rT   rA   r6   r7   r8   r9   r:   r;   )rS   http_formats     r?   output_format_to_mime_typer      su    ,V4Kj+++	
--	-	
--	-	
--	-	
..	.	
//	/r>   c                \   |j                  d      rd}n6|j                  d      rd}n"|j                  d      rd}nt        d|       | |j                  t        |j                        j
                  |j                  |j                  |d|j                  |j                  |j                  |j                  |j                  |j                  |j                  d	j                         D ci c]
  \  }}||| c}}|j                   |j                   j
                  nd ||j"                  |j$                  |j&                  |j(                  |j*                  |j,                  |j.                  |j0                  |j2                  |j2                  j
                  d
S d d
S c c}}w )NzPlay3.0v3z	PlayHT2.0v2
PlayDialogldmzUnknown voice engine: )r   r   output_formatr   r   r   )r   r   r   r   r   r   r   )r   versionr   r   r   r   r   r   r   r   r   )
startswithrR   r   rT   rS   r   r   r   r   r   r   r   r   r   r   itemsr   r   r   r   r   r   r   r   r   r   )r   optionsr   r   kvs         r?   http_prepare_dictr     s   y)		 	 	-		 	 	.1,@AA3GNNCII**$ LL"..]]$22%44%44")"<"<
 %'$DAq ] a4 $  /6.>.>.JG$$**PT ??** ..&-&H&H(/(L(L$66!(!>!>!00++7 %,$D$D$J$J; < >B= $s   /F(c                      e Zd ZdZdZdZy)CongestionCtrlzw
    Enumerates a streaming congestion control algorithm, used to optimize the rate at which text is sent to Play.
    r   r   N)r3   r4   r5   __doc__OFFSTATIC_MAR_2023r=   r>   r?   r   r   7  s    
 C Or>   r   c                     e Zd ZU dZded<   ej                  j                   ej                         d      Z
ded<    ej                         Ze G d d             Z	 	 d	 	 	 	 	 	 	 dd	Zddd
Zd Zedd       Zedd       Zd Zd Z	 	 	 d	 	 	 	 	 	 	 	 	 	 	 d dZ	 	 	 d	 	 	 	 	 	 	 	 	 	 	 d!dZ	 	 	 	 	 	 	 	 	 	 d"dZ	 d#	 	 	 	 	 	 	 	 	 	 	 d$dZ	 	 	 	 	 	 	 	 	 	 d"dZ	 	 d%	 	 	 	 	 	 	 d&dZd Zd Zd'dZ y)(ClientNOptional[bytes]
LEASE_DATAzplayht.temporary.leaser   LEASE_CACHE_PATHc                      e Zd ZU dZded<   ej                  Zded<   dZded<   d	Z	d
ed<   dZ
ded<   d	Zd
ed<   d	Zd
ed<   dZd
ed<   d	Zd
ed<    ee      Zded<   y)Client.AdvancedOptionszhttps://api.play.ht/apir   api_urlr   congestion_ctrl  intmetrics_buffer_sizeFboolremove_ssml_tagsNr   	grpc_addrinsecurefallback_enabledTauto_refresh_leasedisable_lease_disk_cache)default_factoryr   inference_coordinates_options)r3   r4   r5   r  r   r   r   r	  r  r  r  r  r  r  r  r   r   r  r=   r>   r?   AdvancedOptionsr  M  s    00*8*<*<<#'S'!&$& $(	='$!&$&#'D'). $. FK[vEw%'Bwr>   r  c                R    sJ d       sJ d       |xs  j                          _        d fd}| _        d  _        d  _        d  _        t        j                          _        d  _	        t         j                  j                         _         _         _        d  _        d  _        d _        d _         j                  j&                  t(        j*                  k(  rd _        d _        nd _        d _        |r! j1                           j3                          y y )	Nzuser_id is requiredzapi_key is requiredc                 b   t        j                  j                        } j                  j                  r |        S j	                         }|;t        |      }|j                  t        j                         t        d      z   kD  r|S  |        }j                  |j                         |S )Nr   minutes)r   	_advancedr  r  _lease_cache_readr   expiresr   nowr   _lease_cache_writedata)_factory
maybe_dataleaseapi_keyr   user_ids      r?   lease_factoryz&Client.__init__.<locals>.lease_factoryj  s    #GWdnn6L6LMH~~66z!//1J%j)==8<<>Ia4H#HH LJE##EJJ/Lr>   r   r'   皙?r   )r   r   )r  r  _lease_factory_lease_rpc_fallback_rpc	threadingLock_lock_timerr"   r  
_telemetry_user_id_api_key_inference_coordinates_ws_ws_requests_sent_ws_responses_receivedr	  r   r   _max_attempts_backoffrefresh_leasewarmup)r   r%  r$  auto_connectadvancedr&  s   ```   r?   __init__zClient.__init__^  s    ---w---w!;T%9%9%;	 ,'+37	<@^^%
15#DNN$F$FG@D#/3!"&'#>>))^-K-KK!"D DM!"DDM KKM r>   c                   | j                   )| j                   d   t        j                         dz  k  s|r| j                  j                  j
                  U| j                  j                  j                  | j                  | j                  | j                  j                        | _         n:t        | j                  | j                  | j                  j                        | _         | j                   J d       y )Nrefresh_at_msi@B No connection)	r3  timetime_nsr  r  coordinates_generator_functionr1  r2  r   )r   forces     r?   ensure_inference_coordinatesz#Client.ensure_inference_coordinates  s    &&.++O<t||~QX?XX~~;;ZZf.2nn.Z.Z224==$--37>>3_3_a + />dmmT]]>Bnn>j>j/l+ **6GG6r>   c                    | j                          	 | j                  J d       t        j                  | j                  d   d   ddd       y # t        $ r"}t        j                  d|        Y d }~y d }~ww xY w)	Nr@  r   http_streaming_urlzhttps://play.htPOST)OriginzAccess-Control-Request-Method)headerszFailed to warmup: )rE  r3  requestsr   	Exceptionloggingwarning)r   es     r?   r:  zClient.warmup  s    ))+	6..:KOK:T88HI]^0AGM&OP  	6OO0455	6s   =A 	A;A66A;c                >   | j                   5  | j                  | j                  cd d d        S 	 t        j                  | j                  dz         5  t
        j                  j                  | j                        s	 d d d        d d d        y t        | j                  d      5 }|j                         cd d d        cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        n# 1 sw Y   nxY wn# t        $ r Y d d d        y w xY wd d d        y # 1 sw Y   y xY w)N.lockrb)
LEASE_LOCKr  filelockFileLockr  ospathexistsopenreadIOError)clsfps     r?   r  zClient._lease_cache_read  s   ^^ 
	~~)~~
	 
	&&s';';g'EF )77>>#*>*>?#)	
	 
	 c22D9 )R!wwy) )) )	
	 
	) ) )) ) )
  
	 
	
	 
	 
	sp   D"C3+C&=C3C&$C4	C&=	C3CC&	C3&C/	+C32D3	D<DDDDc                j   | j                   5  || _        	 t        j                  | j                  dz         5  t        | j                  d      5 }|j                  |       d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# t        $ r Y d d d        y w xY w# 1 sw Y   y xY w)NrQ  wb)rS  r  rT  rU  r  rY  writer[  )r\  r   r]  s      r?   r  zClient._lease_cache_write  s    ^^ 	!CN&&s';';g'EF 'c22D9 'R''	 	' '' '  	 		 	sW   B)"BBA:!B)B:B?BB	B	B&B)%B&&B))B2c                   | j                   j                  sJ | j                  t        dd      j	                         }nF| j                  j
                  t        d      z
  t        j                         z
  j	                         }t        j                  || j                        | _        | j                  j                          y )Nr(   -   )r  secondsr   r  )r.  lockedr)  r   total_secondsr  r   r  r,  Timerr9  r/  start)r   
refresh_ins     r?   _schedule_refreshzClient._schedule_refresh  s    zz    ;;"1b9GGIJ ##i&::X\\^Kmo   ooj$2D2DEr>   c                B   | j                   5  | j                  rt| j                  j                  t        j                         t        d      z   kD  r<| j                  j                  r| j                  | j                          	 ddd       y| j                         | _        | j                  j                  xs | j                  j                  d   }| j                  r6| j                  d   |k7  r$| j                  d   j                          d| _        | j                  sR| j                  j                  xs d|v }|rt!        |t"              nt%        |t'               t"              }||f| _        | j                  j(                  r| j                  j                  d   }||k7  r| j*                  r6| j*                  d   |k7  r$| j*                  d   j                          d| _        | j*                  sJ| j                  j                  rt!        |t"              nt%        |t'               t"              }||f| _        | j                  r| j                  j-                          | j                  j                  r| j                          ddd       y# 1 sw Y   yxY w)	z'Manually refresh credentials with Play.r   r  Ninference_addressr   r   zon-prem.play.ht)r   )r.  r)  r  r   r  r   r  r  r/  ri  r(  r  metadatar*  closer  r   CLIENT_RETRY_OPTIONSr   r   r  r+  cancel)r   r  r  channelfallback_addrs        r?   r9  zClient.refresh_lease  s   ZZ *	){{t{{22X\\^iXYFZ5ZZ>>449L**,	*	) *	)
 --/DK00]DKK4H4HI\4]IyyTYYq\Y6		!""$ 	99>>22T6G96TQY$Y8LM'	3J3LVjk  '0	 ~~.. !% 4 45H I -))d.@.@.C}.T**1-335-1*--]a]k]k]t]t,]DXY!/?V?Xbv!w   /<W-E*{{""$~~00&&(U*	) *	) *	)s   A8JG>JJc              #    K   t        j                         }|D ]  }|j                         }|j                  |       |j                  d       t	        j
                  |      K| j                  |j                         ||||      E d{    t        j                         } |j                         dkD  r,| j                  |j                         ||||      E d{    yy7 Z7 w)z3Stream input to Play.ht via the text_stream object. Nr   )	ioStringIOstripr`  r$   matchttsgetvaluetell)	r   text_streamr   r   protocol	streamingbufferr   ts	            r?   stream_tts_inputzClient.stream_tts_input  s       	#D

ALLOLL!''*2xx 17L(T]^^^[[]F	# ;;=1xx 17L(T]^^^  _ _s%   BC)
C%AC)C'C)'C)c                   | j                   j                  d      }	 t        ||      \  }}|dk(  r| j                  |||||      S |dk(  r!|st	        d      | j                  ||||      S |dk(  r!|st	        d      | j                  ||||      S t	        d|       # t        $ r!}|j                  t        |             |d }~ww xY w)Nztts-requesthttpwsz0Non-streaming is not supported for WebSocket APIgrpcz+Non-streaming is not supported for gRPC APIzUnknown protocol )
r0  rg  r%   	_tts_httprR   _tts_ws	_tts_grpcrL  finish_errorr   )r   r   r   r   r|  r}  metricsrO  s           r?   rx  z
Client.tts  s     //''6	%B<QY%Z"L(6!~~dG\7IVVT! $%WXX||D'<IIV# $%RSS~~dG\7KK #4XJ!?@@ 	  Q(G	s)   (B  %B  ,%B  B   	C
)CC
c              #   
  K   ddg}||vrt        d| d|       t        j                         }| j                          | j                  5  | j
                  | j                  J d       | j
                  j                  }d d d        t        || j                  j                        }|j                  dt        |            j                  dt        | j                  d                |j                  t        j                  k(  rt        d	      t!        j"                  |j%                  ||      
      }t'        d| j(                  dz         D ]  }		 t+        j,                  | j                  d         }
|
j/                  |      }d}|D ]T  }|dz  }|t1        |j                        k(  r'|j3                  dt        j                         |z
         |j                   V |j5                           y  y # 1 sw Y   yxY w# t6        j8                  $ r} t;        |d             }t=        j>                  d|        |t@        jB                  t@        jD                  hvr|jG                  t        |              |	| j(                  k  rt=        j>                  d| jH                  dz   d|	 d| d       |jK                  d      j                  dt        |             |jM                  d       | jH                  dkD  rt        jN                  | jH                         |jQ                  d       Y d }~| jR                  |jG                  t        |              t=        jT                  d| jR                  d    d| j                  d    d|        |jK                  d      j                  dt        |             	 |j                  dt        |jV                  jX                              j                  dt        | jR                  d                t+        j,                  | jR                  d         }
|
j/                  |      }d}|D ]T  }|dz  }|t1        |j                        k(  r'|j3                  dt        j                         |z
         |j                   V |j5                          Y d }~ y # t6        j8                  $ r"}|jG                  t        |             ||d }~ww xY wd }~ww xY ww)Nr   r   Only z$ are supported in the gRPC API; got r@  r   endpointr   z+PCM format is not supported in the gRPC API)r   r#  r   time-to-first-audiocodeError: Retrying in r
   ms ( attempts so far); ()retryretry.reasonretry-backoffzFalling back to z	 because z threw: fallbackzfallback.reason)-rR   rA  perf_counterr9  r.  r)  r*  r   r#   r  r  appendr   rS   r2   r<   r   
TtsRequestr   ranger7  r    TtsStubTts_audio_begins_at	set_timer	finish_okr  RpcErrorgetattrrM  debugr   RESOURCE_EXHAUSTEDr)   r  r8  incstart_timersleepfinish_timerr+  infor   r   )r   r   r   r   r  supported_voice_enginesrg  
lease_datarequestattemptstubstream	chunk_idxchunkrO  
error_code
fallback_es                    r?   r  zClient._tts_grpc-  sP     $23D"E66u%<$==abnaopqq!!#ZZ 	*;;*tyy/DUoUD))J	* D$.."A"ABvs4y)00S1=NO>>V...JKK$$G,>,>t\,RZdeQ 2 2Q 67 3	,G2,#++DIIaL9'*	# %ENI $4W^^$DD))*?ARARATW\A\]**$	%
 !!#3	,	* 	*. == ',/WQ/1

|45j&C&CZE[E[%\\((Q0T///MMLt1C0DE'Rfgqfrrs"tuKK(//JP''8}}q(

4==1((9%%-((Q0 /0B0B10E/FiPTPYPYZ[P\~]efpeqrsJ'../@#j/R,NN63w~~/B/B+CDKKJX[\`\n\nop\qXrs'//0B0B10EFD!XXg.F "I!' )!Q	$(8(HH#--.CTEVEVEX[`E`a#jj(	)
 %%'}} ,((Z9$!+,K',sw   A
S>6G9CS>BH5S>9H>S>S;DS65S>;B	S6C3R>8S>>S3S..S33S66S;;S>c              #    K   g d}||vrt        d| d|       t        j                         }| j                          | j                  J d       |r| j                  |   d   }n| j                  |   d   }t        || j                  j                        }|j                  dt        |            j                  dt        |             t        d	| j                  d	z         D ]   }		 | j                  J d       t        j                  |d
t        |j                        it!        |||      d      }
|
j"                  dk7  r0t%        d|
j"                   d|
j&                   |
j"                        d}|
j)                  d       D ]J  }|d	z  }|t+        |j                        k(  r'|j-                  dt        j                         |z
         | L |j/                           y  y # t$        $ r\}t1        j2                  d|        |j4                  d	   dk(  r| j                          n,|j4                  d	   dvr|j7                  t        |              |	| j                  k  rt1        j2                  d| j8                  dz   d|	 d|j4                  d	    d       |j;                  d      j                  dt        |j4                  d	                |j=                  d       | j8                  dkD  rt        j>                  | j8                         |jA                  d       Y d }~K|j7                  t        |              d }~ww xY ww)Nr   r   PlayDialogMultilingualr  z$ are supported in the HTTP API; got r@  rG  http_nonstreaming_urlr   r  r   acceptT)rJ  jsonr     zHTTP z: r  )
chunk_sizer  r  401>       r  r
  r  r  r  r  r  r  r   )!rR   rA  r  rE  r3  r#   r  r  r  r   r  r7  rK  postr   rS   r   status_coderL  r   iter_contentr  r  r  rM  r  argsr  r8  r  r  r  r  )r   r   r   r   r  r}  r  rg  urlr  responser  r  rO  s                 r?   r  zClient._tts_http{  s     #[66u%<$==abnaopqq!!#))+**6GG6--l;<PQC--l;<STCD$.."A"ABvs4y)00SXFQ 2 2Q 67 (	G'22>OO>#==$&@&P! /tWlK# ''3.#eH,@,@+AHMM?$SU]UiUijj	%22d2C  ENI $4W^^$DD))*?ARARATW\A\]K	 
 !!#)(	*  sm,66!9%557VVAYj0((Q0T///MMLt1C0DE'Rfghgmgmnogpfqqr"stKK(//AFF1IO''8}}q(

4==1((9$$SV,'s8   C)M,C<G,(M,
M6D6M,M2MMMc              #  h  K   g d}||vrt        d| d|       t        j                         }| j                          t	        || j
                  j                        }| j                  J d       |j                  dt        |            j                  dt        | j                  |   d                t        |||      }t        d| j                  dz         D ]  }	 | j                  J d       | j                  |   d   }	| j                  t        |	      | _        d	| _        d	| _        	 | j                  j#                  t%        j&                  |             | xj                  dz  c_        d}d}d}| j                  D ]  }|dz  }t/        |t              rt%        j0                  |      }|d   dk(  r[| xj                   dz  c_        | j                   | j                  k(  rd}|d   }k| j                   | j                  kD  st3        d      |d   dk(  r
|d   |k(  r nN|s|dz  }|t5        |j6                        k(  r'|j9                  dt        j                         |z
         |  |j;                           y  y # t(        $ ro}
t+        j,                  d
|
        t        |	      | _        | j                  j#                  t%        j&                  |             d| _        d	| _        Y d }
~
d }
~
ww xY w# t2        $ r}
t+        j,                  d|
        || j                  k  rt+        j,                  d| j<                  dz   d| d|
j>                  d    d       |jA                  d      j                  dt        |
j>                  d                |jC                  d       | j<                  d	kD  rt        jD                  | j<                         |jG                  d       | j                  d       Y d }
~
2|jI                  t        |
              d }
~
ww xY ww)Nr  r  z) are supported in the WebSocket API; got r@  r   r  websocket_urlr   r   z2Reconnecting websocket which closed unexpectedly: r  Ftyperg  T
request_idz%Received more responses than requestsendr  r  r  r
  r  r  r  r  r  r  )rD  )%rR   rA  r  rE  r#   r  r  r3  r  r   r   r  r7  r4  r   r5  r6  sendr  dumpsr   rM  r  
isinstanceloadsrL  r  rS   r  r  r8  r  r  r  r  r  r  )r   r   r   r   r  r  rg  	json_datar  
ws_addressrO  r  r  startedr  msgs                   r?   r  zClient._tts_ws  s     #[66u%<$==fgsftuvv!!#))+D$.."A"AB**6GG6vs4y)0014T5P5PQ]5^_n5o1p	r%dG\B	Q 2 2Q 67 8	G722>OO>!88FW
88#&z2DH-.D*23D/4HHMM$**Y"78**a/* 	
!XX $ENI!%-"jj/v;'1 771<7#::d>T>TT*.-0->
!%!<!<t?U?U!U&/0W&X X [E1c,6G:6U!$ !Q	$(8(HH#--.CTEVEVEX[`E`a#'$( !!#S8	 ( 4MM$VWXVY"Z[&z2DHHHMM$**Y"78-.D*23D//4>  sm,T///MMLt1C0DE'Rfghgmgmnogpfqqr"stKK(//AFF1IO''8}}q(

4==1((955D5A$$SV,sr   CP2"AL2AJ5BL L-ALP2	LA$K>8L>LL
P/C9P*	P2P**P//P2c                ^    t        j                         }t        | ||||      t        |      fS )zGet a linked pair of (input, output) streams.

        These stream objects are thread-aware and safe to use in separate threads.
        )queueQueue_InputStream_OutputStream)r   r   r   r|  shared_qs        r?   get_stream_pairzClient.get_stream_pair  s1     ;;=w,I(#
 	
r>   c                    | j                   r!| j                   j                          d | _         | j                  r$| j                  d   j                          d | _        | j                  r%| j                  d   j                          d | _        y y )Nr   )r/  ro  r*  rm  r+  r   s    r?   rm  zClient.close  so    ;;KK DK99IIaL DIq!'')!%D r>   c                $    | j                          y N)rm  r  s    r?   __del__zClient.__del__&  s    

r>   c                6    | j                   j                         S r  )r0  r  r  s    r?   r  zClient.metrics)  s    &&((r>   )TN)r%  r   r$  r   r;  r  r<  z"Optional['Client.AdvancedOptions'])F)rD  r  )r   r  )r   bytes)NNT)r{  z0Union[Generator[str, None, None], Iterable[str]]r   r   r   r   r|  r   r}  r  r   Iterable[bytes])r   Union[str, List[str]]r   r   r   r   r|  r   r}  r  r   r  )
r   r  r   r   r   r   r  r!   r   r  )T)r   r  r   r   r   r   r  r!   r}  r  r   r  )NN)r   r   r   r   r|  r   r   z&Tuple['_InputStream', '_OutputStream'])r   zList[Metrics])!r3   r4   r5   r  r   rV  rW  jointempfile
gettempdirr  r,  r-  rS  r   r  r=  rE  r:  classmethodr  r  ri  r9  r  rx  r  r  r  r  rm  r  r  r=   r>   r?   r  r  H  sn   "&J&GGLL)<)<)<)>@XYcY!Jx x x( "7;00 0 	0
 50dH	6    	,)d '+"&_E_ _ $	_
  _ _ 
_4 +/&*"'   (	
 $  
8L,'L,  L, (	L,
 L, 
L,h #@'@  @ (	@
 @ @ 
@DL'L  L (	L
 L 
Lb '+"&	

 $
  	

 
0
 	&)r>   r  c                  @     e Zd Zdd fdZddZd	dZd
dZd Z xZS )
TextStreamc                \    t         |           |xs t        j                         | _        y r  )superr=  r  r  _q)r   q	__class__s     r?   r=  zTextStream.__init__.  s     $u{{}r>   c                    | S r  r=   r  s    r?   __iter__zTextStream.__iter__2      r>   c                R    | j                   j                         }|
t               |S r  )r  getStopIteration)r   r   s     r?   __next__zTextStream.__next__5  s#    =/!r>   c                H    |D ]  }| j                   j                  |        y r  r  put)r   r  as      r?   __call__zTextStream.__call__;  s      	AGGKKN	r>   c                :    | j                   j                  d        y r  r  r  s    r?   rm  zTextStream.close?  s    Dr>   r  )r  zOptional[queue.Queue])r   zIterator[str])r   r   r  r   )	r3   r4   r5   r=  r  r  r  rm  __classcell__)r  s   @r?   r  r  -  s    %r>   r  c                  8    e Zd ZdZ	 d	 	 	 ddZd	dZd
dZd Zy)r  zInput stream handler for text.

    usage:
       input_stream('send', 'multiple', 'words', 'in', 'one', 'call.')
       input_stream += 'Add another sentence to the stream.'
       input_stream.done()
    Nc                     t                _         fd}t        j                  d |d       _         j                  j                          y )Nc                     j                  j                        D ]  } j                  |         j                  d        y r  )r  _inputr  )outputclientr   r|  r  r   r   s    r?   listenz%_InputStream.__init__.<locals>.listenO  s>     11$++wV^_ fEE$Kr>   zlisten-thread)r  r   r,  Thread	_listenerrg  )r   r  r   r  r   r|  r  s   `````` r?   r=  z_InputStream.__init__K  s>     l	 	
 #))$Hr>   c                "     | j                   |  y r  r   )r   r  s     r?   r  z_InputStream.__call__W  s    Tr>   c                &    | j                  |       y r  r  )r   inputs     r?   __iadd__z_InputStream.__iadd__Z  s    Er>   c                l    | j                   j                          | j                  j                          y r  )r   rm  r  r  r  s    r?   donez_InputStream.done]  s"    r>   r  )
r  r  r   r   r  queue.Queue[Optional[bytes]]r   r   r|  r   r  )r	  r   )r3   r4   r5   r   r=  r  r
  r  r=   r>   r?   r  r  C  s2     IM
,
8E
r>   r  c                  .    e Zd ZdZddZddZd	dZd Zy)
r  zIterator for output audio.

    usage:
       for audio in output_stream:
           <do stuff with audio bytes>
        output_stream.close()
    c                D    t        j                         | _        || _        y r  )r,  Event_closer  )r   r  s     r?   r=  z_OutputStream.__init__j  s    oo'r>   c                    | S r  r=   r  s    r?   r  z_OutputStream.__iter__n  r  r>   c                    	 	 | j                   j                  d      }	 |
t               |S # t        j                  $ r/}| j                  j                         rt               |Y d }~jd }~ww xY w)Nr'  )timeout)r  r  r  Emptyr  is_setr  )r   r   rO  s      r?   r  z_OutputStream.__next__q  sh    D1
 =/! ;; ;;%%''/q0s   . A0%A++A0c                8    | j                   j                          y r  )r  setr  s    r?   rm  z_OutputStream.close~  s    r>   N)r  r  )r   zIterator[bytes])r   r  )r3   r4   r5   r   r=  r  r  rm  r=   r>   r?   r  r  b  s    r>   r  c                N    | t         j                  t         j                  hv rdS dS )Nr   r   )r2   r6   r;   )fmts    r?   r  r    s%    ))6+>+>??1FQFr>   )rS   r2   r   rA   )rS   r2   r   r   )r   z	List[str]r   r   r   r   r   zDict[str, Any])r  r2   r   r  )p
__future__r   dataclassesr   r   r   r   enumr   typingr	   r
   r   r   r   r   r   r   r   rt  r  rM  rV  r  r  r,  rA  websockets.sync.clientr   r   websockets.exceptionsr   rT  r  r   r   r   r   r   rK  inference_coordinatesr   r   r#  r   r   protosr   r    	telemetryr!   r"   utilsr#   r$   r%   r  rn  r2   rA   rJ   rT   rV   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r  r  r  r  r=   r>   r?   <module>r%     s   " ( (  Y Y Y 	   	     < 2   _ _  O & ) ) R R 	#	


#$&-"()*-:O 	 	,
 ! 	 "$T $ #T #G&%t %R&&r& b& OOQ	&
 b& & b& r& NNB& OOR& NNB& a& OOQ& r& OOR&  NNB!&" OOR#&$ NNA%&& '&( )&* a+&, q-&. OOQ/&0 NNB1&2 q3&4 OOR5&6 7&8 b9&: b;&< a=&> b?&@ bA&B MM2C&D bE&F MM2NNBK& R D D DN$(VT "b) b)J# , >HUO @Gr>   