Ë
    µŒj�T  ã            	       óÀ  — 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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mZmZmZ ddlmZmZ ddlmZ ddlmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z% erddl&Z'ddl(m)c m*c m+Z,  ejZ                  e.«      Z/d	Z0d
Z1dZ2d&d„Z3 G d„ d«      Z4 e4«       Z5 e4«       Z6 G d„ de7e	«      Z8 G d„ de!«      Z9 G d„ de!«      Z: G d„ d«      Z;dee7   de<deee7   eejz                     f   fd„Z>ddde7fd„Z?ded   dee7ddf   fd„Z@eeAe4f   ZBe7ZC G d „ d!«      ZDeDZEe7ZF G d"„ d#e9e:eeEeFf   «      ZGee7eef   ZHeAZI G d$„ d%e9e:eeHeIf   «      ZJeGZKeJZLeDZMy)'z*A common module for NVIDIA Riva Runnables.é    N)ÚEnum)ÚTYPE_CHECKINGÚAnyÚAsyncGeneratorÚAsyncIteratorÚDictÚ	GeneratorÚIteratorÚListÚOptionalÚTupleÚUnionÚcast)Ú
AnyMessageÚBaseMessage)ÚPromptValue)ÚRunnableConfigÚRunnableSerializable)Ú
AnyHttpUrlÚ	BaseModelÚFieldÚparse_obj_asÚroot_validatorÚ	validatorç      à?i�  )Ú
Ú.Ú!Ú?ô   Â¡ô   Â¿Úreturnc                  ó^   — 	 ddl } | j                  S # t        $ r}t        d«      |‚d}~ww xY w)z5Import the riva client and raise an error on failure.r   NziCould not import the NVIDIA Riva client library. Please install it with `pip install nvidia-riva-client`.)Úriva.clientÚImportErrorÚclient)ÚrivaÚerrs     ús/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/utilities/nvidia_riva.pyÚ_import_riva_clientr*   1   s@   € ðãð �;‰;Ðøô ò ÜðGó
ð ð	ûðús   ‚ ’	,›'§,c                   ó   — e Zd ZdZy)Ú	SentinelTzAn empty Sentinel type.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    r)   r,   r,   >   s   „ Ú!r2   r,   c                   óT   — e Zd ZdZdZdZdZdZdZdZ	e
ded	d fd
„«       Zedd„«       Zy)ÚRivaAudioEncodinga  An enum of the possible choices for Riva audio encoding.

    The list of types exposed by the Riva GRPC Protobuf files can be found
    with the following commands:
    ```python
    import riva.client
    print(riva.client.AudioEncoding.keys())  # noqa: T201
    ```
    ÚALAWÚENCODING_UNSPECIFIEDÚFLACÚ
LINEAR_PCMÚMULAWÚOGGOPUSÚformat_coder"   c                 ó’   — 	 | j                   | j                  | j                  dœ|   S # t        $ r}t	        d|› �«      |‚d}~ww xY w)z Return the audio encoding specified by the format code in the wave file.

        ref: https://mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
        )é   é   é   z>The following wave file format code is not supported by Riva: N)r8   r5   r9   ÚKeyErrorÚNotImplementedError)Úclsr;   r(   s      r)   Úfrom_wave_format_codez'RivaAudioEncoding.from_wave_format_codeX   sV   € ð	Ø—~‘~¨#¯(©(°s·y±yÑAÀ+ÑNÐNøÜò 	Ü%ð*Ø*5¨ð8óð ðûð	ús   ‚&) ©	A²AÁAc                 óB   — t        «       }t        |j                  | «      S )z-Returns the Riva API object for the encoding.)r*   ÚgetattrÚAudioEncoding©ÚselfÚriva_clients     r)   Úriva_pb2zRivaAudioEncoding.riva_pb2f   s   € ô *Ó+ˆÜ�{×0Ñ0°$Ó7Ð7r2   N)r"   zriva.client.AudioEncoding)r-   r.   r/   r0   r5   r6   r7   r8   r9   r:   ÚclassmethodÚintrC   ÚpropertyrJ   r1   r2   r)   r4   r4   F   s]   „ ñð €DØ1ÐØ€DØ€JØ€EØ€Gàð°ð Ð8Kò ó ðð ò8ó ñ8r2   r4   c                   ó¸   — e Zd ZU dZ e ed«      dddg¬«      Zeeef   e	d<    edd¬	«      Z
ee   e	d
<   edd„«       Z eddd¬«      ededefd„«       «       Zy)ÚRivaAuthMixinzBConfiguration for the authentication to a Riva service connection.zhttp://localhost:50051z1The full URL where the Riva service can be found.z"https://user@pass:riva.example.com)ÚdescriptionÚexamplesÚurlNz@A full path to the file where Riva's public ssl key can be read.©rP   Ússl_certr"   c                 óò   — t        «       }t        t        | j                  «      }|j                  dk(  }t        | j                  «      j                  d«      d   }|j                  | j                  ||¬«      S )z!Return a riva client auth object.ÚhttpsÚ/é   )rT   Úuse_sslÚuri)	r*   r   r   rR   ÚschemeÚstrÚsplitÚAuthrT   )rH   rI   rR   rY   Úurl_no_schemes        r)   ÚauthzRivaAuthMixin.authz   sj   € ô *Ó+ˆÜ”:˜tŸx™xÓ(ˆØ—*‘* Ñ'ˆÜ˜DŸH™H›×+Ñ+¨CÓ0°Ñ3ˆØ×ÑØ—]‘]¨G¸ð  ó 
ð 	
r2   T)ÚpreÚallow_reuseÚvalc                 ó~   — t        |t        «      rt        t        t	        t        |«      «      S t        t        |«      S )z:Do some initial conversations for the URL before checking.)Ú
isinstancer\   r   r   r   )rB   rc   s     r)   Ú_validate_urlzRivaAuthMixin._validate_url…   s/   € ô �cœ3ÔÜœ
¤L´¸SÓ$AÓBÐBÜ”J Ó$Ð$r2   )r"   zriva.client.Auth)r-   r.   r/   r0   r   r   rR   r   r\   Ú__annotations__rT   r   rM   r`   r   rK   r   rf   r1   r2   r)   rO   rO   m   s˜   … ÙLá"'ÙÐ+Ó,ØGØ*Ð,PÐQô#€Cˆˆz˜3ˆÑ	ó ñ
 $ØØVô€Hˆh�s‰mó ð
 ò
ó ð
ñ ˆu˜$¨DÔ1Øð% ð %¨
ò %ó ó 2ñ%r2   rO   c                   ó€   — e Zd ZU dZ eej                  d¬«      Zeed<    edd¬«      Z	e
ed<    edd	¬«      Zeed
<   y)ÚRivaCommonConfigMixinz%A collection of common Riva settings.z!The encoding on the audio stream.)ÚdefaultrP   Úencodingi@  z*The sample rate frequency of audio stream.Úsample_rate_hertzzen-USzaThe [BCP-47 language code](https://www.rfc-editor.org/rfc/bcp/bcp47.txt) for the target language.Úlanguage_codeN)r-   r.   r/   r0   r   r4   r8   rk   rg   rl   rL   rm   r\   r1   r2   r)   ri   ri   Ž   sX   … Ù/á"'Ø!×,Ñ,Ø7ô#€HÐó ñ #ØÐ"NôÐ�só ñ Øð#ô€M�3ô r2   ri   c                   ó‚   — e Zd ZU dZej
                  ed<   ej
                  ed<   dd„Zdd„Z	dd„Z
defd	„Zdd
„Zdd„Zy)Ú_Eventz3A combined event that is threadsafe and async safe.Ú_eventÚ_aeventr"   Nc                 óh   — t        j                  «       | _        t        j                  «       | _        y)zInitialize the event.N)Ú	threadingÚEventrp   Úasynciorq   ©rH   s    r)   Ú__init__z_Event.__init__¨   s   € ä—o‘oÓ'ˆŒÜ—}‘}“ˆ�r2   c                 ól   — | j                   j                  «        | j                  j                  «        y©zSet the event.N)rp   Úsetrq   rv   s    r)   rz   z
_Event.set­   s    € à�‰�‰ÔØ�‰×ÑÕr2   c                 ól   — | j                   j                  «        | j                  j                  «        yry   )rp   Úclearrq   rv   s    r)   r|   z_Event.clear²   s"   € à�‰×ÑÔØ�‰×ÑÕr2   c                 ó6   — | j                   j                  «       S )zIndicate if the event is set.)rp   Úis_setrv   s    r)   r~   z_Event.is_set·   s   € à�{‰{×!Ñ!Ó#Ð#r2   c                 ó8   — | j                   j                  «        y)zWait for the event to be set.N)rp   Úwaitrv   s    r)   r€   z_Event.wait»   s   € à�‰×ÑÕr2   c              ƒ   óT   K  — | j                   j                  «       ƒ d{  –—†  y7 Œ­w)z#Async wait for the event to be set.N)rq   r€   rv   s    r)   Ú
async_waitz_Event.async_wait¿   s   è ø€ à�l‰l×ÑÓ!×!Ò!ús   ‚( &¡(©r"   N)r-   r.   r/   r0   rs   rt   rg   ru   rw   rz   r|   Úboolr~   r€   r‚   r1   r2   r)   ro   ro   ¢   s>   … Ù=à�O‰OÓØ�]‰]Óó'ó
ó
ð
$˜ó $óô"r2   ro   Úoutput_directoryÚsample_ratec                 ó  — | r{t        j                  ddd| ¬«      5 }|j                  }ddd«       t        j                  d«      }|j                  d«       |j                  d«       |j                  |«       ||fS y	# 1 sw Y   ŒWxY w)
zECreate a new wave file and return the wave write object and filename.Úbxz.wavF)ÚmodeÚsuffixÚdeleteÚdirNÚwbr=   rX   )NN)ÚtempfileÚNamedTemporaryFileÚnameÚwaveÚopenÚsetnchannelsÚsetsampwidthÚsetframerate)r…   r†   ÚfÚwav_file_nameÚwav_files        r)   Ú_mk_wave_filer™   Ä   s…   € ñ Ü×(Ñ(Ø˜f¨UÐ8Hõ
àØŸF™FˆM÷
ô —9‘9˜]¨DÓ1ˆØ×Ñ˜aÔ Ø×Ñ˜aÔ Ø×Ñ˜kÔ*Ø˜xÐ(Ð(Ø÷
ð 
ús   œA?Á?Brc   ÚTTSInputTypec                 ó¢   — t        | t        «      r| j                  «       S t        | t        «      rt	        | j
                  «      S t	        | «      S )z�Attempt to coerce the input value to a string.

    This is particularly useful for converting LangChain message to strings.
    )re   r   Ú	to_stringr   r\   Úcontent)rc   s    r)   Ú_coerce_stringrž   Õ   s<   € ô
 �#”{Ô#Ø�}‰}‹ÐÜ�#”{Ô#Ü�3—;‘;ÓÐÜˆs‹8€Or2   Úinputsc              #   ó4  K  — d}| D ]†  }t        |«      }t        D ]-  }||v sŒ|j                  |d«      \  }}||z   |z   –— d}||v rŒ&Œ/ ||z  }t        |«      t        kD  sŒ\t        dt        |«      t        «      D ]  }|||dz    –— Œ d}Œˆ |r|–— yy­w)z9Filter the input chunks are return strings ready for TTS.Ú r=   r   é   N)rž   Ú_SENTENCE_TERMINATORSr]   ÚlenÚ_MAX_TEXT_LENGTHÚrange)rŸ   ÚbufferÚchunkÚ
terminatorÚlast_sentenceÚidxs         r)   Ú_process_chunksr¬   á   s¾   è ø€ à€FÛˆÜ˜uÓ%ˆ÷ 0ˆJØ Ò%Ø',§{¡{°:¸qÓ'AÑ$�˜uØ˜}Ñ,¨zÑ9Ò9Ø�ð  Ó%ð 0ð 	�%‰ˆô ˆv‹;Ô)Ó)Ü˜Q¤ F£Ô-=Ö>�Ø˜S 3¨¡7Ð+Ó+ð ?à‰Fð! ñ& Ø‹ð ùs   ‚ B£%BÁ	BÁ#5Bc                   óÀ  — e Zd ZU dZej
                  ed<   ej                  ed<   ej                  ed<   e	ed<   e	ed<   e	ed<   e
ej                     ed<   dd	ed
dfd„Zd
eeddf   fd„Zd
ee   fd„Zed
efd„«       Zed
efd„«       Zed
efd„«       Zed
efd„«       Zddede
e   d
dfd„Zddede
e   d
dfd„Zdde
e   d
dfd„Zdde
e   d
dfd„Zded   d
dfd„Zy)ÚAudioStreamz%A message containing streaming audio.Ú	_put_lockÚ_queueÚoutputÚhangupÚuser_talkingÚ
user_quietÚ_workerÚmaxsizer"   Nc                 ó  — t        j                  «       | _        t        j                  |¬«      | _        t        j                  «       | _        t        «       | _        t        «       | _	        t        «       | _
        d| _        y)zInitialize the queue.)r¶   N)rs   ÚLockr¯   ÚqueueÚQueuer°   r±   ro   r²   r´   r³   rµ   )rH   r¶   s     r)   rw   zAudioStream.__init__  sP   € ä"Ÿ™Ó)ˆŒÜ—k‘k¨'Ô2ˆŒÜ—k‘k“mˆŒÜ“hˆŒÜ ›(ˆŒÜ"›HˆÔØˆ�r2   c              #   óÒ   K  — 	 	 | j                   j                  dt        «      }|t
        k(  ry|–— | j                   j                  «        ŒJ# t        j                  $ r Y Œ`w xY w­w)zReturn an error.TN)r°   ÚgetÚ_QUEUE_GET_TIMEOUTr¹   ÚEmptyÚHANGUPÚ	task_done©rH   Únext_vals     r)   Ú__iter__zAudioStream.__iter__  sc   è ø€ àðØŸ;™;Ÿ?™?¨4Ô1CÓD�ð
 œ6Ò!Øð ŠNØ�K‰K×!Ñ!Ô#ð øô —;‘;ò Ùðüs'   ‚A'… A ¥)A'ÁA$Á!A'Á#A$Á$A'c                ó$  K  — 	 	 t        j                  «       j                  d| j                  j                  dt
        «      ƒ d{  –—† }|t        k(  ry|­–— | j                  j                  «        Œq7 Œ.# t        j                  $ r Y Œ‰w xY w­w)z4Iterate through all items in the queue until HANGUP.TN)
ru   Úget_event_loopÚrun_in_executorr°   r¼   r½   r¹   r¾   r¿   rÀ   rÁ   s     r)   Ú	__aiter__zAudioStream.__aiter__&  sƒ   è ø€ àðÜ!(×!7Ñ!7Ó!9×!IÑ!IØ˜$Ÿ+™+Ÿ/™/¨4Ô1Có"÷ �ð œ6Ò!Øð ‹NØ�K‰K×!Ñ!Ô#ð ðùô —;‘;ò Ùðüs;   ‚B…AA7 ÁA5ÁA7 Á*BÁ5A7 Á7BÂ
BÂBÂBc                 ó6   — | j                   j                  «       S )z(Indicate if the audio stream has hungup.)r²   r~   rv   s    r)   ÚhungupzAudioStream.hungup9  s   € ð �{‰{×!Ñ!Ó#Ð#r2   c                 ó6   — | j                   j                  «       S )z-Indicate in the input stream buffer is empty.)r°   Úemptyrv   s    r)   rË   zAudioStream.empty>  s   € ð �{‰{× Ñ Ó"Ð"r2   c                 óÐ   — | j                   xr | j                  }| j                  duxr7 | j                  j                  «        xr | j                  j                  «       }|xr |S )z;Indicate if the audio stream has hungup and been processed.N)rÉ   rË   rµ   Úis_aliver±   )rH   Ú
input_doneÚoutput_dones      r)   ÚcompletezAudioStream.completeC  sa   € ð —[‘[Ò/ T§Z¡Zˆ
à�L‰L Ð$ò $Ø—L‘L×)Ñ)Ó+Ð+ò$à—‘×!Ñ!Ó#ð 	ð
 Ò)˜kÐ)r2   c                 óP   — | j                   r| j                   j                  «       S y)z&Indicate if the ASR stream is running.F)rµ   rÍ   rv   s    r)   ÚrunningzAudioStream.runningN  s!   € ð �<Š<Ø—<‘<×(Ñ(Ó*Ð*Ør2   ÚitemÚtimeoutc                 óò   — | j                   5  | j                  rt        d«      ‚|t        u r| j                  j                  «        | j                  j                  ||¬«       ddd«       y# 1 sw Y   yxY w)zPut a new item into the queue.z?The audio stream has already been hungup. Cannot put more data.©rÔ   N)r¯   rÉ   ÚRuntimeErrorr¿   r²   rz   r°   Úput)rH   rÓ   rÔ   s      r)   rØ   zAudioStream.putU  sU   € à�^‹^Ø�{Š{Ü"ØUóð ð ”v‰~Ø—‘—‘Ô!Ø�K‰K�O‰O˜D¨'ˆOÔ2÷ �^‰^ús   �AA-Á-A6c              ƒ   óª   K  — t        j                  «       }t        j                  |j                  d| j                  |«      |«      ƒ d{  –—†  y7 Œ­w)z$Async put a new item into the queue.N)ru   rÅ   Úwait_forrÆ   rØ   )rH   rÓ   rÔ   Úloops       r)   ÚaputzAudioStream.aput`  s=   è ø€ ä×%Ñ%Ó'ˆÜ×Ñ˜t×3Ñ3°D¸$¿(¹(ÀDÓIÈ7ÓS×SÒSús   ‚A	AÁAÁAc                 ó0   — | j                  t        |«       y)zSend the hangup signal.N)rØ   r¿   ©rH   rÔ   s     r)   ÚclosezAudioStream.closee  s   € à�‰”˜Õ!r2   c              ƒ   óL   K  — | j                  t        |«      ƒ d{  –—†  y7 Œ­w)zAsync send the hangup signal.N)rÜ   r¿   rÞ   s     r)   ÚaclosezAudioStream.aclosei  s   è ø€ à�i‰iœ Ó(×(Ò(ús   ‚$œ"�$Ú	responseszrasr.StreamingRecognizeResponsec                 ó"  ‡ ‡‡— ‰ j                   rt        d«      ‚t        j                  dd¬«      Šd	ˆˆˆ fd„}t        j                  |¬«      ‰ _        d‰ j
                  _        ‰ j
                  j                  «        ‰j                  «        y)
zIDrain the responses from the provided iterator and put them into a queue.z,An ASR instance has already been registered.rX   r¢   rÖ   Nc                  ó2  •— ‰j                  «        ‰D �]   } | j                  sŒ| j                  D ]á  }|j                  sŒ|j                  rw‰j                  j                  «        ‰j                  j                  «        t        t        |j                  d   j                  «      }‰j                  j                  |«       Œ“‰j                  j                  «       rŒ®‰j                  j                  «        ‰j                  j                  «        Œã �Œ y)zConsume the ASR Generator.r   N)r€   ÚresultsÚalternativesÚis_finalr³   r|   r´   rz   r   r\   Ú
transcriptr±   rØ   r~   )ÚresponseÚresultrè   Úhas_startedrâ   rH   s      €€€r)   Úworkerz$AudioStream.register.<locals>.workert  sË   ø€ à×ÑÔÜ%�Ø×'Ò'Øà&×.Ô.�FØ!×.Ò.Ø à—’Ø×)Ñ)×/Ñ/Ô1ØŸ™×+Ñ+Ô-Ü%)¬#¨v×/BÑ/BÀ1Ñ/E×/PÑ/PÓ%Q˜
ØŸ™Ÿ™¨
Õ3à!×.Ñ.×5Ñ5Õ7Ø×)Ñ)×-Ñ-Ô/ØŸ™×-Ñ-Õ/ò /ñ	 &r2   )ÚtargetTrƒ   )	rÒ   r×   rs   ÚBarrierÚThreadrµ   ÚdaemonÚstartr€   )rH   râ   rì   rë   s   `` @r)   ÚregisterzAudioStream.registerm  si   ú€ à�<Š<ÜÐMÓNÐNä×'Ñ'¨°1Ô5ˆ÷	0ô* !×'Ñ'¨vÔ6ˆŒØ"ˆ�‰ÔØ�‰×ÑÔØ×ÑÕr2   )r   ©N) r-   r.   r/   r0   rs   r¸   rg   r¹   rº   ro   r   rï   rL   rw   r	   ÚbytesrÃ   r   ÚStreamInputTyperÇ   rM   r„   rÉ   rË   rÐ   rÒ   rØ   rÜ   rß   rá   r
   rò   r1   r2   r)   r®   r®      sv  … Ù/à�~‰~ÓØ�K‰KÓØ�K‰KÓØƒNØÓØÓØ�i×&Ñ&Ñ'Ó'ñ ð ¨Dó ð$˜) E¨4°Ð$5Ñ6ó $ð"$ ¨Ñ!?ó $ð& ð$˜ò $ó ð$ð ð#�tò #ó ð#ð ð*˜$ò *ó ð*ð ð˜ò ó ðñ	3˜ð 	3°(¸3±-ð 	3È4ó 	3ñT˜ð T¸À#¹ð TÐRVó Tñ
"˜X c™]ð "°dó "ñ) H¨S¡Mð )¸Tó )ð (Ð+LÑ"Mð ÐRVô r2   r®   c            	       ó
  — e Zd ZU dZdZeed<   dZeed<    edd¬«      Z	e
ed	<    ed
d¬«      Zeed<    ed
d¬«      Zeed<    ed
¬«      edeeef   deeef   fd„«       «       Zedd„«       Zdd„Z	 ddedee   dedefd„Zy)ÚRivaASRzNA runnable that performs Automatic Speech Recognition (ASR) using NVIDIA Riva.Únvidia_riva_asrr�   zžA Runnable for converting audio bytes to a string.This is useful for feeding an audio stream into a chain andpreprocessing that audio to create an LLM prompt.rP   r=   z7The number of audio channels in the input audio stream.rS   Úaudio_channel_countTz\Controls whether or not Riva should attempt to filter profanity out of the transcribed text.Úprofanity_filterz]Controls whether Riva should attempt to correct senetence puncuation in the transcribed text.Úenable_automatic_punctuation©ra   Úvaluesr"   c                 ó   — t        «       }|S ©z4Validate the Python environment and input arguments.©r*   ©rB   rý   Ú_s      r)   Ú_validate_environmentzRivaASR._validate_environmentµ  ó   € ô  Ó!ˆØˆr2   c                 óà   — t        «       }|j                  d|j                  | j                  | j                  | j
                  d| j                  | j                  | j                  ¬«      ¬«      S )z)Create and return the riva config object.Tr=   )rk   rl   rù   Úmax_alternativesrú   rû   rm   )Úinterim_resultsÚconfig)	r*   ÚStreamingRecognitionConfigÚRecognitionConfigrk   rl   rù   rú   rû   rm   rG   s     r)   r  zRivaASR.config¼  sq   € ô *Ó+ˆØ×5Ñ5Ø Ø×0Ñ0ØŸ™Ø"&×"8Ñ"8Ø$(×$<Ñ$<Ø!"Ø!%×!6Ñ!6Ø-1×-NÑ-NØ"×0Ñ0ð 1ó ð 6ó 
ð 	
r2   c                 óˆ   — t        «       }	 |j                  | j                  «      S # t        $ r}t	        d«      |‚d}~ww xY w)ú;Connect to the riva service and return the a client object.z5Error raised while connecting to the Riva ASR server.N)r*   Ú
ASRServicer`   Ú	ExceptionÚ
ValueError©rH   rI   r(   s      r)   Ú_get_servicezRivaASR._get_serviceÍ  sG   € ä)Ó+ˆð	Ø×)Ñ)¨$¯)©)Ó4Ð4øÜò 	ÜØGóàðûð	úó   Œ' §	A°<¼ANÚinputr  Úkwargsc                 óü  — |j                   s>| j                  «       }|j                  || j                  ¬«      }|j	                  |«       g }|j
                  sÿ|j                  j                  5  |j                  j                  j                  d«      }ddd«       r¬|j                  j                  «       sT	 ||j                  j                  «       gz  }|j                  j                  «        |j                  j                  «       sŒTt        j                  dt!        |«      «       dj#                  |«      j%                  «       S |j
                  sŒÿy# 1 sw Y   ŒÅxY w# t        j                  $ r Y ŒÛw xY w)z3Transcribe the audio bytes into a string with Riva.)Úaudio_chunksÚstreaming_configgš™™™™™¹?NzRiva ASR returning: %sÚ r¡   )rÒ   r  Ústreaming_response_generatorr  rò   rÐ   r±   Ú	not_emptyr€   rË   Ú
get_nowaitr¹   r¾   rÀ   Ú_LOGGERÚdebugÚreprÚjoinÚstrip)rH   r  r  r  Úservicerâ   Úfull_responseÚreadys           r)   ÚinvokezRivaASR.invoke×  s4  € ð �}Š}Ø×'Ñ'Ó)ˆGØ×<Ñ<Ø"Ø!%§¡ð =ó ˆIð �N‰N˜9Ô%ð $&ˆØ—.’.Ø—‘×'Ó'ØŸ™×.Ñ.×3Ñ3°CÓ8�÷ (ñ ØŸ,™,×,Ñ,Ô.ð!Ø%¨%¯,©,×*AÑ*AÓ*CÐ)DÑD˜ð —L‘L×*Ñ*Ô,ð  Ÿ,™,×,Ñ,Õ.ô —‘Ð6¼¸]Ó8KÔLØ—x‘x Ó.×4Ñ4Ó6Ð6ð —.“.ð ÷ (Ð'ûô !Ÿ;™;ò !Ù ð!ús   Á/&EÂ:E% ÅE"Å%E;Å:E;)r"   z&riva.client.StreamingRecognitionConfig)r"   zriva.client.ASRServiceró   )r-   r.   r/   r0   r�   r\   rg   rP   r   rù   rL   rú   r„   rû   r   rK   r   r   r  rM   r  r  ÚASRInputTyper   r   ÚASROutputTyper$  r1   r2   r)   r÷   r÷   ”  s  … ñ
 Yà!€Dˆ#Ó!ð	<ð �ó ñ  %Ø	ÐPô Ð˜ó ñ #Øð5ôÐ�dó ñ */Øð<ô*Ð  $ó ñ ˜ÔØð¨4°°S°©>ð ¸dÀ3ÈÀ8¹nò ó ó ðð
 ò
ó ð
ó ð ,0ñ àð ð ˜Ñ(ð ð ð	 ð
 
ô r2   r÷   c                   ó|  — e Zd ZU dZdZeed<   dZeed<    edd¬«      Z	eed	<    ed
d¬«      Z
ee   ed<    ed¬«      edeeef   deeef   fd„«       «       Z ed«      ededefd„«       «       Zdd„Z	 ddedee   dedefd„Z	 ddee   dee   dee   dee   fd„Z	 ddee   dee   dee   deed
f   fd„Zy
)ÚRivaTTSz?A runnable that performs Text-to-Speech (TTS) with NVIDIA Riva.Únvidia_riva_ttsr�   z_A tool for converting text to speech.This is useful for converting LLM output into audio bytes.rP   zEnglish-US.Female-1zºThe voice model in Riva to use for speech. Pre-trained models are documented in [the Riva documentation](https://docs.nvidia.com/deeplearning/riva/user-guide/docs/tts/tts-overview.html).rS   Ú
voice_nameNz—The directory where all audio files should be saved. A null value indicates that wave files should not be saved. This is useful for debugging purposes.r…   Trü   rý   r"   c                 ó   — t        «       }|S rÿ   r   r  s      r)   r  zRivaTTS._validate_environment   r  r2   Úvc                 óŒ   — |rAt        j                  |«      }|j                  dd¬«       t        |j	                  «       «      S |S )NT)ÚparentsÚexist_ok)ÚpathlibÚPathÚmkdirr\   Úabsolute)rB   r,  Údirpaths      r)   Ú_output_directory_validatorz#RivaTTS._output_directory_validator'  s=   € ñ Ü—l‘l 1“oˆGØ�M‰M $°ˆMÔ6Ü�w×'Ñ'Ó)Ó*Ð*Øˆr2   c                 óˆ   — t        «       }	 |j                  | j                  «      S # t        $ r}t	        d«      |‚d}~ww xY w)r  z5Error raised while connecting to the Riva TTS server.N)r*   ÚSpeechSynthesisServicer`   r  r  r  s      r)   r  zRivaTTS._get_service0  sG   € ä)Ó+ˆð	Ø×5Ñ5°d·i±iÓ@Ð@øÜò 	ÜØGóàðûð	úr  r  r  r  c                 óV   — dj                  | j                  t        |g«      «      «      S )zDPerform TTS by taking a string and outputting the entire audio file.r2   )r  Ú	transformÚiter)rH   r  r  r  s       r)   r$  zRivaTTS.invoke:  s"   € ð �x‰x˜Ÿ™¤t¨U¨G£}Ó5Ó6Ð6r2   c              +   ó  K  — | j                  «       }t        | j                  | j                  «      \  }}t	        |«      D ]˜  }t
        j                  d|«       |j                  || j                  | j                  | j                  j                  | j                  ¬«      }|D ]3  }	t        t        |	j                  «      }
|r|j                  |
«       |
–— Œ5 Œš |r'|j!                  «        t
        j                  d|«       yy­w)zHPerform TTS by taking a stream of characters and streaming output bytes.zRiva TTS chunk: %s)Útextr*  rm   rk   Úsample_rate_hzzRiva TTS wrote file: %sN)r  r™   r…   rl   r¬   r  r  Úsynthesize_onliner*  rm   rk   rJ   r   rô   ÚaudioÚwriteframesrawrß   )rH   r  r  r  r!  r—   r˜   r¨   râ   Úrespr?  s              r)   r9  zRivaTTS.transformC  sí   è ø€ ð ×#Ñ#Ó%ˆô #0Ø×!Ñ! 4×#9Ñ#9ó#
Ñˆ�xô
 % UÖ+ˆEÜ�M‰MÐ.°Ô6ð  ×1Ñ1ØØŸ?™?Ø"×0Ñ0ØŸ™×/Ñ/Ø#×5Ñ5ð 2ó ˆIó "�ÜœU D§J¡JÓ/�ÙØ×+Ñ+¨EÔ2Ø“ñ	 "ð ,ñ( Ø�N‰NÔÜ�M‰MÐ3°]ÕCð ùs   ‚DDc                óP  ‡ ‡‡	‡
‡‡‡K  — t        j                  «       Št        j                  «       Št        j                  «       Šdˆˆfd„}dt        t
           fˆfd„Š
dˆ
ˆˆ fd„Š	dˆ	ˆfd„}‰j                   |«       «      }‰j                   |«       «      }	 	 t        j                  ‰j                  «       d«      ƒ d{  –—† }‰j                  «        |t        u rn|­–— ŒL|ƒ d{  –—†  |ƒ d{  –—†  y7 Œ8# t         j                  j                  $ r Y Œƒw xY w7 Œ47 Œ,­w)	zGIntercept async transforms and route them to the synchronous transform.r"   Nc               “   óx   •K  — ‰2 3 d{  –—† } ‰j                  | «       Œ7 Œ6 ‰j                  t        «       y­w)z#Produce input into the input queue.N)Ú
put_nowaitÚ_TRANSFORM_END)rc   r  Úinput_queues    €€r)   Ú	_producerz%RivaTTS.atransform.<locals>._produceru  s5   øè ø€ á"÷ ,�cØ×&Ñ& sÕ+ð,ø˜Uà×"Ñ"¤>Õ2ùs   ƒ:†#Š!‹#Ž:¡#£:c               3   ó„   •K  — 	 	 ‰j                  d¬«      } | t        k(  ry| –— Œ"# t        j                  $ r Y Œ8w xY w­w)zIterate over the input_queue.r   rÖ   N)r¼   r¹   r¾   rE  )rc   rF  s    €r)   Ú_input_iteratorz+RivaTTS.atransform.<locals>._input_iterator{  sM   øè ø€ àðØ%Ÿ/™/°#˜/Ó6�Cð œ.Ò(ØØ’	ð øô —{‘{ò Ùðüs    ƒA †' ˜A §=ºA ¼=½A c                  óˆ   •— ‰j                   ‰«       «      D ]  } ‰j                  | «       Œ ‰j                  t        «       y)z!Consume the input with transform.N)r9  rD  rE  )rc   rI  Ú	out_queuerH   s    €€€r)   Ú	_consumerz%RivaTTS.atransform.<locals>._consumer†  s5   ø€ à—~‘~¡oÓ&7Ö8�Ø×$Ñ$ SÕ)ð 9à× Ñ ¤Õ0r2   c               “   óF   •K  — ‰j                  d‰ «      ƒ d{  –—†  y7 Œ­w)z"Coroutine that wraps the consumer.N)rÆ   )rL  rÛ   s   €€r)   Ú_consumer_coroz*RivaTTS.atransform.<locals>._consumer_coroŒ  s   øè ø€ à×&Ñ& t¨YÓ7×7Ò7ús   ƒ!™š!r   rƒ   )ru   Úget_running_loopr¹   rº   r
   rš   Úcreate_taskrÚ   r¼   Ú
exceptionsÚTimeoutErrorrÀ   rE  )rH   r  r  r  rG  rN  ÚproducerÚconsumerrc   rL  rI  rF  rÛ   rK  s   ``       @@@@@r)   Ú
atransformzRivaTTS.atransformj  s÷   þè ø€ ô ×'Ñ'Ó)ˆÜ#(§;¡;£=ˆÜ#*§=¡=£?ˆ	ö	3ð		¤¬,Ñ!7õ 		÷	1ö	8ð ×#Ñ#¡I£KÓ0ˆØ×#Ñ#¡NÓ$4Ó5ˆàðÜ#×,Ñ,¨Y¯]©]«_¸cÓB×B�ð ×ÑÔ!à”nÑ$ØØ‹Ið ð �ˆØ�‰ð CùÜ×%Ñ%×2Ñ2ò Ùðúð 	øØúsZ   ‰BD&Â'C? ÃC=ÃC? Ã	$D&Ã-D"Ã.	D&Ã7D$Ã8D&Ã=C? Ã?DÄD&ÄDÄD&Ä$D&)r"   z"riva.client.SpeechSynthesisServiceró   )r-   r.   r/   r0   r�   r\   rg   rP   r   r*  r…   r   r   rK   r   r   r  r   r5  r  rš   r   ÚTTSOutputTyper$  r
   r9  r   r   rU  r1   r2   r)   r(  r(     sš  … ñ
 Jà!€Dˆ#Ó!ð	Eð �ó ñ Øðaô€J�ó ñ ',Øð5ô'Ð�h˜s‘mó ñ ˜ÔØð¨4°°S°©>ð ¸dÀ3ÈÀ8¹nò ó ó ðñ
 Ð!Ó"Øð¨Cð °Cò ó ó #ðóð ,0ñ7àð7ð ˜Ñ(ð7ð ð	7ð
 
ó7ð ,0ñ%Dà˜Ñ%ð%Dð ˜Ñ(ð%Dð ˜3‘-ð	%Dð
 
�-Ñ	 ó%DðT ,0ñ5à˜\Ñ*ð5ð ˜Ñ(ð5ð ˜3‘-ð	5ð
 
˜ tÐ+Ñ	,ô5r2   r(  )r"   zriva.client)Nr0   ru   Úloggingr0  r¹   rŽ   rs   r‘   Úenumr   Útypingr   r   r   r   r   r	   r
   r   r   r   r   r   Úlangchain_core.messagesr   r   Úlangchain_core.prompt_valuesr   Úlangchain_core.runnablesr   r   Úpydanticr   r   r   r   r   r   r$   r'   Úriva.client.proto.riva_asr_pb2r&   ÚprotoÚriva_asr_pb2ÚrasrÚ	getLoggerr-   r  r½   r¥   r£   r*   r,   r¿   rE  r\   r4   rO   ri   ro   ÚfloatÚ
Wave_writer™   rž   r¬   rô   rõ   ÚStreamOutputTyper®   r%  r&  r÷   rš   rV  r(  ÚNVIDIARivaASRÚNVIDIARivaTTSÚNVIDIARivaStreamr1   r2   r)   Ú<module>ri     sÕ  ðÙ 0ã Û Û Û Û Û Û Ý ÷÷ ÷ ó ÷ <Ý 4ß I÷÷ ñ Ûß1Ó1à
ˆ'×
Ñ
˜HÓ
%€ØÐ ØÐ Ø9Ð ó
÷"ñ "ñ 
‹€Ù“€ô$8˜˜Tô $8ôN%�Iô %ôB˜Iô ÷("ñ "ðDØ˜s‘mðØ27ðà
ˆ8�C‰=˜( 4§?¡?Ñ3Ð3Ñ4óð"	˜ð 	¨3ó 	ð˜H ^Ñ4ð ¸À3ÈÈdÀ?Ñ9Só ð6 ˜˜yÐ(Ñ)€ØÐ ÷Lñ Lð` €Ø€ôcØØØ˜ }Ð4Ñ5ôcðP �S˜* kÐ1Ñ2€Ø€ô_ØØØ˜ }Ð4Ñ5ô_ðF €Ø€ØÑ r2   