§
    šŠtj’U  ã            	       ó,  — 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j-        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j=                 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         ¦  «        ZJeGZKeJZLeDZMdS )(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�  )ú
ú.ú!ú?õ   Â¡õ   Â¿Úreturnúriva.clientc                  ó`   — 	 ddl } n"# t          $ r}t          d¦  «        |‚d}~ww xY w| j        S )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     úg/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/utilities/nvidia_riva.pyÚ_import_riva_clientr+   1   s\   € ðàÐÐÐÐøÝð ð ð ÝðGñ
ô 
ð ð	øøøøðøøøð
 Œ;Ðs   ‚ ‡
&‘!¡&c                   ó   — e Zd ZdZdS )Ú	SentinelTzAn empty Sentinel type.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    r*   r-   r-   >   s   € € € € € Ø!Ð!Ð!Ð!r3   r-   c                   ób   — 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dS )Ú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)r9   r6   r:   ÚKeyErrorÚNotImplementedError)Úclsr<   r)   s      r*   Úfrom_wave_format_codez'RivaAudioEncoding.from_wave_format_codeX   sj   € ð	Ø”~¨#¬(°s´yÐAÐAÀ+ÔNÐNøÝð 	ð 	ð 	Ý%ð8Ø*5ð8ð 8ñô ð ðøøøøð	øøøs   ‚ �
?§:º?úriva.client.AudioEncodingc                 óH   — 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°$Ñ7Ô7Ð7r3   N)r"   rE   )r.   r/   r0   r1   r6   r7   r8   r9   r:   r;   ÚclassmethodÚintrD   ÚpropertyrL   r2   r3   r*   r5   r5   F   sŒ   € € € € € ðð ð €DØ1ÐØ€DØ€JØ€EØ€Gàð°ð Ð8Kð ð ð ñ „[ðð ð8ð 8ð 8ñ „Xð8ð 8ð 8r3   r5   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dS )Ú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.©rR   Ússl_certr"   úriva.client.Authc                 óü   — t          ¦   «         }t          t          | j        ¦  «        }|j        dk    }t          | j        ¦  «                             d¦  «        d         }|                     | j        ||¬¦  «        S )z!Return a riva client auth object.Úhttpsú/é   )rV   Úuse_sslÚuri)	r+   r   r   rT   ÚschemeÚstrÚsplitÚAuthrV   )rJ   rK   rT   r\   Úurl_no_schemes        r*   ÚauthzRivaAuthMixin.authz   sr   € õ *Ñ+Ô+ˆÝ•:˜tœxÑ(Ô(ˆØ”* Ò'ˆÝ˜DœH™œ×+Ò+¨CÑ0Ô0°Ô3ˆØ×ÒØ”]¨G¸ð  ñ 
ô 
ð 	
r3   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   )rC   rf   s     r*   Ú_validate_urlzRivaAuthMixin._validate_url…   sA   € õ �c�3ÑÔð 	CÝ�
¥Lµ¸SÑ$AÔ$AÑBÔBÐBÝ•J Ñ$Ô$Ð$r3   )r"   rW   )r.   r/   r0   r1   r   r   rT   r   r_   Ú__annotations__rV   r   rO   rc   r   rM   r   ri   r2   r3   r*   rQ   rQ   m   s  € € € € € € ØLÐLà"' %Øˆ
Ð+Ñ,Ô,ØGØ*Ð,PÐQð#ñ #ô #€Cˆˆz˜3ˆÔ	ð ð ñ ð
 $˜eØØVðñ ô €Hˆh�sŒmð ð ñ ð
 ð
ð 
ð 
ñ „Xð
ð €Yˆu˜$¨DÐ1Ñ1Ô1Øð% ð %¨
ð %ð %ð %ñ „[ñ 2Ô1ð%ð %ð %r3   rQ   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
<   dS )ÚRivaCommonConfigMixinz%A collection of common Riva settings.z!The encoding on the audio stream.)ÚdefaultrR   Ú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/   r0   r1   r   r5   r9   rn   rj   ro   rN   rp   r_   r2   r3   r*   rl   rl   Ž   s®   € € € € € € Ø/Ð/à"' %Ø!Ô,Ø7ð#ñ #ô #€HÐð ð ñ ð #˜UØÐ"Nðñ ô Ð�sð ð ñ ð ˜Øð#ðñ ô €M�3ð ð ñ ð ð r3   rl   c                   ó|   — e Zd ZU dZej        ed<   eej                 ed<   dd„Z	dd„Z
dd„Zdefd	„Zdd
„Zdd„ZdS )Ú_Eventz3A combined event that is threadsafe and async safe.Ú_eventÚ_aeventr"   Nc                 óD   — t          j        ¦   «         | _        d| _        dS )zInitialize the event.N)Ú	threadingÚEventrs   rt   ©rJ   s    r*   Ú__init__z_Event.__init__¨   s   € å”oÑ'Ô'ˆŒØˆŒˆˆr3   c                 ó|   — | j                              ¦   «          | j        �| j                             ¦   «          dS dS ©zSet the event.N)rs   Úsetrt   rx   s    r*   r|   z
_Event.set­   s>   € àŒ�ŠÑÔÐØŒ<Ð#ØŒL×ÒÑÔÐÐÐð $Ð#r3   c                 ó|   — | j                              ¦   «          | j        �| j                             ¦   «          dS dS r{   )rs   Úclearrt   rx   s    r*   r~   z_Event.clear³   s@   € àŒ×ÒÑÔÐØŒ<Ð#ØŒL×ÒÑ Ô Ð Ð Ð ð $Ð#r3   c                 ó4   — | j                              ¦   «         S )zIndicate if the event is set.)rs   Úis_setrx   s    r*   r€   z_Event.is_set¹   s   € àŒ{×!Ò!Ñ#Ô#Ð#r3   c                 ó8   — | j                              ¦   «          dS )zWait for the event to be set.N)rs   Úwaitrx   s    r*   r‚   z_Event.wait½   s   € àŒ×ÒÑÔÐÐÐr3   c              ƒ   óê   K  — | j         €Jt          j        ¦   «         | _         | j                             ¦   «         r| j                              ¦   «          | j                              ¦   «         ƒ d{V —† dS )z#Async wait for the event to be set.N)rt   Úasynciorw   rs   r€   r|   r‚   rx   s    r*   Ú
async_waitz_Event.async_waitÁ   sq   è è € àŒ<ÐÝ"œ=™?œ?ˆDŒLØŒ{×!Ò!Ñ#Ô#ð #Ø”× Ò Ñ"Ô"Ð"ØŒl×ÒÑ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!r3   ©r"   N)r.   r/   r0   r1   rv   rw   rj   r   r„   ry   r|   r~   Úboolr€   r‚   r…   r2   r3   r*   rr   rr   ¢   s¼   € € € € € € Ø=Ð=àŒOÐÐÑØ�g”mÔ$Ð$Ð$Ñ$ðð ð ð ð
ð ð ð ð!ð !ð !ð !ð$˜ð $ð $ð $ð $ðð ð ð ð"ð "ð "ð "ð "ð "r3   rr   Úoutput_directoryÚsample_ratec                 ó(  — | r�t          j        ddd| ¬¦  «        5 }|j        }ddd¦  «         n# 1 swxY w Y   t          j        |d¦  «        }|                     d¦  «         |                     d¦  «         |                     |¦  «         ||fS d	S )
zECreate a new wave file and return the wave write object and filename.Úbxz.wavF)ÚmodeÚsuffixÚdeleteÚdirNÚwbr>   r[   )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ˆMð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#õ ”9˜]¨DÑ1Ô1ˆØ×Ò˜aÑ Ô Ð Ø×Ò˜aÑ Ô Ð Ø×Ò˜kÑ*Ô*Ð*Ø˜xÐ(Ð(Øˆ<s   ›/¯3¶3rf   ÚTTSInputTypec                 óÄ   — t          | t          ¦  «        r|                      ¦   «         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.
    )rh   r   Ú	to_stringr   r_   Úcontent)rf   s    r*   Ú_coerce_stringr¡   Û   sQ   € õ
 �#•{Ñ#Ô#ð Ø�}Š}‰ŒÐÝ�#•{Ñ#Ô#ð  Ý�3”;ÑÔÐÝˆs‰8Œ8€Or3   Úinputsc              #   ó\  K  — d}| D ]œ}t          |¦  «        }t          D ]/}||v r)|                     |d¦  «        \  }}||z   |z   V — d}||v °)Œ0||z  }t          |¦  «        t          k    r7t          dt          |¦  «        t          ¦  «        D ]}|||dz   …         V — Œd}Œ�|r|V — dS dS )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Ô'AÑ$�˜uØ˜}Ñ,¨zÑ9Ð9Ð9Ð9Ø�ð  Ð%Ð%øð
 	�%‰ˆõ ˆv‰;Œ;Õ)Ò)Ð)Ý˜Q¥ F¡¤Õ-=Ñ>Ô>ð ,ð ,�Ø˜S 3¨¡7˜]Ô+Ð+Ð+Ð+Ð+ØˆFøð ð Øˆˆˆˆˆðð r3   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dS )ÚAudioStreamz%A message containing streaming audio.Ú	_put_lockÚ_queueÚoutputÚhangupÚuser_talkingÚ
user_quietÚ_workerr   Úmaxsizer"   Nc                 ó  — t          j        ¦   «         | _        t          j        |¬¦  «        | _        t          j        ¦   «         | _        t          ¦   «         | _        t          ¦   «         | _	        t          ¦   «         | _
        d| _        dS )zInitialize the queue.)r¹   N)rv   ÚLockr²   ÚqueueÚQueuer³   r´   rr   rµ   r·   r¶   r¸   )rJ   r¹   s     r*   ry   zAudioStream.__init__  s_   € å"œÑ)Ô)ˆŒÝ”k¨'Ð2Ñ2Ô2ˆŒÝ”k‘m”mˆŒÝ‘h”hˆŒÝ ™(œ(ˆŒÝ"™HœHˆÔØˆŒˆˆr3   c              #   óÌ   K  — 	 	 | j                              dt          ¦  «        }n# t          j        $ r Y Œ4w xY w|t
          k    rdS |V — | j                              ¦   «          Œb)zReturn an error.TN)r³   ÚgetÚ_QUEUE_GET_TIMEOUTr¼   ÚEmptyÚHANGUPÚ	task_done)rJ   Únext_vals     r*   Ú__iter__zAudioStream.__iter__  s€   è è € ð	$ðØœ;Ÿ?š?¨4Õ1CÑDÔD��øÝ”;ð ð ð Ø�ðøøøð �6Ò!Ð!Ø�ð ˆNˆNˆNØŒK×!Ò!Ñ#Ô#Ð#ð	$s   … & ¦8·8c                ó  K  — 	 	 t          j        ¦   «         }|                     d| j        j        dt
          ¦  «        ƒ d{V —†}n# t          j        $ r Y ŒTw xY w|t          k    rdS |W V — | j         	                    ¦   «          Œƒ)z4Iterate through all items in the queue until HANGUP.TN)
r„   Úget_running_loopÚrun_in_executorr³   r¿   rÀ   r¼   rÁ   rÂ   rÃ   )rJ   ÚlooprÄ   s      r*   Ú	__aiter__zAudioStream.__aiter__,  s½   è è € ð	$ðÝÔ/Ñ1Ô1�Ø!%×!5Ò!5Ø˜$œ+œ/¨4Õ1Cñ"ô "ð ð ð ð ð ð ��øõ ”;ð ð ð Ø�ðøøøð �6Ò!Ð!Ø�ð ˆNˆNˆNˆNØŒK×!Ò!Ñ#Ô#Ð#ð!	$s   …A A ÁAÁAc                 ó4   — | j                              ¦   «         S )z(Indicate if the audio stream has hungup.)rµ   r€   rx   s    r*   ÚhungupzAudioStream.hungup@  s   € ð Œ{×!Ò!Ñ#Ô#Ð#r3   c                 ó4   — | j                              ¦   «         S )z-Indicate in the input stream buffer is empty.)r³   Úemptyrx   s    r*   rÎ   zAudioStream.emptyE  s   € ð Œ{× Ò Ñ"Ô"Ð"r3   c                 óž   — | j         o| j        }| j        duo2| j                             ¦   «          o| j                             ¦   «         }|o|S )z;Indicate if the audio stream has hungup and been processed.N)rÌ   rÎ   r¸   Úis_aliver´   )rJ   Ú
input_doneÚoutput_dones      r*   ÚcompletezAudioStream.completeJ  s]   € ð ”[Ð/ T¤Zˆ
àŒL Ð$ð $Ø”L×)Ò)Ñ+Ô+Ð+ð$à”×!Ò!Ñ#Ô#ð 	ð
 Ð)˜kÐ)r3   c                 óF   — | j         r| j                              ¦   «         S dS )z&Indicate if the ASR stream is running.F)r¸   rÐ   rx   s    r*   ÚrunningzAudioStream.runningU  s'   € ð Œ<ð 	+Ø”<×(Ò(Ñ*Ô*Ð*Øˆur3   ÚitemÚtimeoutc                 óî   — | j         5  | j        rt          d¦  «        ‚|t          u r| j                             ¦   «          | j                             ||¬¦  «         ddd¦  «         dS # 1 swxY w Y   dS )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µ   r|   r³   Úput)rJ   rÖ   r×   s      r*   rÛ   zAudioStream.put\  sÂ   € àŒ^ð 	3ð 	3ØŒ{ð Ý"ØUñô ð ð •vˆ~ˆ~Ø”—’Ñ!Ô!Ð!ØŒK�OŠO˜D¨'ˆOÑ2Ô2Ð2ð	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð 	3ð 	3s   ˆAA*Á*A.Á1A.c              ƒ   óš   K  — t          j        ¦   «         }t          j        |                     d| j        |¦  «        |¦  «        ƒ d{V —† dS )z$Async put a new item into the queue.N)r„   rÇ   Úwait_forrÈ   rÛ   )rJ   rÖ   r×   rÉ   s       r*   ÚaputzAudioStream.aputg  sS   è è € åÔ'Ñ)Ô)ˆÝÔ˜t×3Ò3°D¸$¼(ÀDÑIÔIÈ7ÑSÔSÐSÐSÐSÐSÐSÐSÐSÐSÐSr3   c                 ó<   — |                       t          |¦  «         dS )zSend the hangup signal.N)rÛ   rÂ   ©rJ   r×   s     r*   ÚclosezAudioStream.closel  s   € à�Š•˜Ñ!Ô!Ð!Ð!Ð!r3   c              ƒ   óL   K  — |                       t          |¦  «        ƒ d{V —† dS )zAsync send the hangup signal.N)rÞ   rÂ   rà   s     r*   ÚaclosezAudioStream.aclosep  s2   è è € à�iŠi� Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r3   Ú	responseszrasr.StreamingRecognizeResponsec                 ó  ‡ ‡‡— ‰ j         rt          d¦  «        ‚t          j        dd¬¦  «        Šd
ˆˆˆ fd„}t          j        |¬¦  «        ‰ _        d	‰ j        _        ‰ j                             ¦   «          ‰                     ¦   «          dS )zIDrain the responses from the provided iterator and put them into a queue.z,An ASR instance has already been registered.r[   r¥   rÙ   r"   Nc                  óö  •— ‰                      ¦   «          ‰D ]à} | j        sŒ
| j        D ]Î}|j        sŒ
|j        rr‰j                             ¦   «          ‰j                             ¦   «          t          t          |j        d         j
        ¦  «        }‰j                             |¦  «         Œƒ‰j                             ¦   «         s2‰j                             ¦   «          ‰j                             ¦   «          ŒÏŒádS )zConsume the ASR Generator.r   N)r‚   ÚresultsÚalternativesÚis_finalr¶   r~   r·   r|   r   r_   Ú
transcriptr´   rÛ   r€   )ÚresponseÚresultrê   Úhas_startedrä   rJ   s      €€€r*   Úworkerz$AudioStream.register.<locals>.worker{  s  ø€ à×ÒÑÔÐØ%ð 0ð 0�ØÔ'ð Øà&Ô.ð 0ð 0�FØ!Ô.ð !Ø à”ð 0ØÔ)×/Ò/Ñ1Ô1Ð1Øœ×+Ò+Ñ-Ô-Ð-Ý%)­#¨vÔ/BÀ1Ô/EÔ/PÑ%QÔ%Q˜
ØœŸš¨
Ñ3Ô3Ð3Ð3à!Ô.×5Ò5Ñ7Ô7ð 0ØÔ)×-Ò-Ñ/Ô/Ð/Øœ×-Ò-Ñ/Ô/Ð/øð0ð	0ð 0r3   )ÚtargetTr†   )	rÕ   rÚ   rv   ÚBarrierÚThreadr¸   ÚdaemonÚstartr‚   )rJ   rä   rî   rí   s   `` @r*   ÚregisterzAudioStream.registert  s©   øøø€ àŒ<ð 	OÝÐMÑNÔNÐNåÔ'¨°1Ð5Ñ5Ô5ˆð	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0õ* !Ô'¨vÐ6Ñ6Ô6ˆŒØ"ˆŒÔØŒ×ÒÑÔÐØ×ÒÑÔÐÐÐr3   )r   ©N) r.   r/   r0   r1   rv   r»   rj   r¼   r½   rr   r   rñ   rN   ry   r	   ÚbytesrÅ   r   ÚStreamInputTyperÊ   rO   r‡   rÌ   rÎ   rÓ   rÕ   rÛ   rÞ   rá   rã   r
   rô   r2   r3   r*   r±   r±     sq  € € € € € € Ø/Ð/àŒ~ÐÐÑØŒKÐÐÑØŒKÐÐÑØ€N€N�NØÐÐÑØÐÐÑØ�iÔ&Ô'Ð'Ð'Ñ'ðð  ð ¨Dð ð ð ð ð$˜) E¨4°Ð$5Ô6ð $ð $ð $ð $ð"$ ¨Ô!?ð $ð $ð $ð $ð( ð$˜ð $ð $ð $ñ „Xð$ð ð#�tð #ð #ð #ñ „Xð#ð ð*˜$ð *ð *ð *ñ „Xð*ð ð˜ð ð ð ñ „Xðð	3ð 	3˜ð 	3°(¸3´-ð 	3È4ð 	3ð 	3ð 	3ð 	3ðTð T˜ð T¸À#¼ð TÐRVð Tð Tð Tð Tð
"ð "˜X cœ]ð "°dð "ð "ð "ð "ð)ð ) H¨S¤Mð )¸Tð )ð )ð )ð )ð (Ð+LÔ"Mð ÐRVð ð ð ð ð ð r3   r±   c            	       óH  — 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dS )Ú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.rR   r>   z7The number of audio channels in the input audio stream.rU   Ú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©rd   Úvaluesr"   c                 ó"   — t          ¦   «         }|S ©z4Validate the Python environment and input arguments.©r+   ©rC   rÿ   Ú_s      r*   Ú_validate_environmentzRivaASR._validate_environment¼  ó   € õ  Ñ!Ô!ˆØˆr3   ú&riva.client.StreamingRecognitionConfigc                 ó¼   — t          ¦   «         }|                     d|                     | j        | j        | j        d| j        | j        | j        ¬¦  «        ¬¦  «        S )z)Create and return the riva config object.Tr>   )rn   ro   rû   Úmax_alternativesrü   rý   rp   )Úinterim_resultsÚconfig)	r+   ÚStreamingRecognitionConfigÚRecognitionConfigrn   ro   rû   rü   rý   rp   rI   s     r*   r  zRivaASR.configÃ  sm   € õ *Ñ+Ô+ˆØ×5Ò5Ø Ø×0Ò0ØœØ"&Ô"8Ø$(Ô$<Ø!"Ø!%Ô!6Ø-1Ô-NØ"Ô0ð 1ñ ô ð 6ñ 
ô 
ð 	
r3   úriva.client.ASRServicec                 ó˜   — t          ¦   «         }	 |                     | 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+   Ú
ASRServicerc   Ú	ExceptionÚ
ValueError©rJ   rK   r)   s      r*   Ú_get_servicezRivaASR._get_serviceÔ  s_   € å)Ñ+Ô+ˆð	Ø×)Ò)¨$¬)Ñ4Ô4Ð4øÝð 	ð 	ð 	ÝØGñô àðøøøøð	øøøó   �* ª
A	´AÁA	NÚinputr  Úkwargsc                 óè  — |j         sE|                      ¦   «         }|                     || j        ¬¦  «        }|                     |¦  «         g }|j        �s|j        j        5  |j        j                             d¦  «        }ddd¦  «         n# 1 swxY w Y   |rÎ|j         	                    ¦   «         sf	 ||j         
                    ¦   «         gz  }n# t          j        $ r Y ŒIw xY w|j                             ¦   «          |j         	                    ¦   «         ¯ft                               dt!          |¦  «        ¦  «         d                     |¦  «                             ¦   «         S |j        �¯dS )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)rJ   r  r  r  Úservicerä   Úfull_responseÚreadys           r*   ÚinvokezRivaASR.invokeÞ  s¾  € ð Œ}ð 	&Ø×'Ò'Ñ)Ô)ˆGØ×<Ò<Ø"Ø!%¤ð =ñ ô ˆIð �NŠN˜9Ñ%Ô%Ð%ð $&ˆØ”.ñ 	7Ø”Ô'ð 9ð 9ØœÔ.×3Ò3°CÑ8Ô8�ð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ð ð 7Øœ,×,Ò,Ñ.Ô.ð -ð!Ø%¨%¬,×*AÒ*AÑ*CÔ*CÐ)DÑD˜˜øÝ œ;ð !ð !ð !Ø ˜ð!øøøà”L×*Ò*Ñ,Ô,Ð,ð  œ,×,Ò,Ñ.Ô.ð -õ —’Ð6½¸]Ñ8KÔ8KÑLÔLÐLØ—x’x Ñ.Ô.×4Ò4Ñ6Ô6Ð6ð ”.ñ 	7ð ˆrs$   Á# BÂBÂBÂ6C ÃC&Ã%C&)r"   r  )r"   r  rõ   )r.   r/   r0   r1   r“   r_   rj   rR   r   rû   rN   rü   r‡   rý   r   rM   r   r   r  rO   r  r  ÚASRInputTyper   r   ÚASROutputTyper(  r2   r3   r*   rù   rù   ›  s±  € € € € € € ð
 YÐXà!€Dˆ#Ð!Ð!Ñ!ð	<ð �ð ð ñ ð  %˜uØ	ÐPð ñ  ô  Ð˜ð ð ñ ð #˜UØð5ðñ ô Ð�dð ð ñ ð */¨Øð<ð*ñ *ô *Ð  $ð ð ñ ð €^˜ÐÑÔØð¨4°°S°¬>ð ¸dÀ3ÈÀ8¼nð ð ð ñ „[ñ Ôðð
 ð
ð 
ð 
ñ „Xð
ð ð ð ð ð ,0ð ð  àð ð ˜Ô(ð ð ð	 ð
 
ð ð  ð  ð  ð  ð  r3   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d
S )Ú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.rR   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).rU   Ú
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  r3   Úvc                 ó¢   — |rLt          j        |¦  «        }|                     dd¬¦  «         t          |                     ¦   «         ¦  «        S |S )NT)ÚparentsÚexist_ok)ÚpathlibÚPathÚmkdirr_   Úabsolute)rC   r0  Údirpaths      r*   Ú_output_directory_validatorz#RivaTTS._output_directory_validator.  sN   € ð ð 	+Ý”l 1‘o”oˆGØ�MŠM $°ˆMÑ6Ô6Ð6Ý�w×'Ò'Ñ)Ô)Ñ*Ô*Ð*Øˆr3   ú"riva.client.SpeechSynthesisServicec                 ó˜   — t          ¦   «         }	 |                     | j        ¦  «        S # t          $ r}t	          d¦  «        |‚d}~ww xY w)r  z5Error raised while connecting to the Riva TTS server.N)r+   ÚSpeechSynthesisServicerc   r  r  r  s      r*   r  zRivaTTS._get_service7  s_   € å)Ñ+Ô+ˆð	Ø×5Ò5°d´iÑ@Ô@Ð@øÝð 	ð 	ð 	ÝØGñô àðøøøøð	øøør  r  r  r  c                 ón   — d                      |                      t          |g¦  «        ¦  «        ¦  «        S )zDPerform TTS by taking a string and outputting the entire audio file.r3   )r#  Ú	transformÚiter)rJ   r  r  r  s       r*   r(  zRivaTTS.invokeA  s*   € ð �xŠx˜Ÿš¥t¨U¨G¡}¤}Ñ5Ô5Ñ6Ô6Ð6r3   c              +   ó  K  — |                       ¦   «         }t          | j        | j        ¦  «        \  }}t	          |¦  «        D ]Š}t
                               d|¦  «         |                     || j        | j	        | j
        j        | j        ¬¦  «        }|D ]7}	t          t          |	j        ¦  «        }
|r|                     |
¦  «         |
V — Œ8Œ‹|r1|                     ¦   «          t
                               d|¦  «         dS dS )zHPerform TTS by taking a stream of characters and streaming output bytes.zRiva TTS chunk: %s)Útextr.  rp   rn   Úsample_rate_hzzRiva TTS wrote file: %sN)r  rœ   rˆ   ro   r¯   r   r!  Úsynthesize_onliner.  rp   rn   rL   r   rö   ÚaudioÚwriteframesrawrá   )rJ   r  r  r  r%  rš   r›   r«   rä   ÚresprD  s              r*   r>  zRivaTTS.transformJ  s0  è è € ð ×#Ò#Ñ%Ô%ˆõ #0ØÔ! 4Ô#9ñ#
ô #
Ñˆ�xõ
 % UÑ+Ô+ð 	ð 	ˆEÝ�MŠMÐ.°Ñ6Ô6Ð6ð  ×1Ò1ØØœ?Ø"Ô0ØœÔ/Ø#Ô5ð 2ñ ô ˆIð "ð ð �Ý�U D¤JÑ/Ô/�Øð 3Ø×+Ò+¨EÑ2Ô2Ð2Ø����ð	ð ð 	DØ�NŠNÑÔÐÝ�MŠMÐ3°]ÑCÔCÐCÐCÐCð	Dð 	Dr3   c                óV  ‡ ‡‡	‡
‡‡‡K  — t          j        ¦   «         Št          j        ¦   «         Št          j        ¦   «         Šd	ˆˆfd„}dt          t
                   fˆfd„Š
d	ˆ
ˆˆ fd„Š	d	ˆ	ˆfd„}‰                      |¦   «         ¦  «        }‰                      |¦   «         ¦  «        }	 	 t          j        ‰                     ¦   «         d¦  «        ƒ d{V —†}n# t           j	        j
        $ r Y ŒFw xY w‰                     ¦   «          |t          u rn|W V — Œm|ƒ d{V —† |ƒ d{V —† dS )
zGIntercept async transforms and route them to the synchronous transform.r"   Nc               “   ó€   •K  — ‰2 3 d{V —†} ‰                      | ¦  «         Œ6 ‰                      t          ¦  «         dS )z#Produce input into the input queue.N)Ú
put_nowaitÚ_TRANSFORM_END)rf   r  Úinput_queues    €€r*   Ú	_producerz%RivaTTS.atransform.<locals>._producer|  se   øè è € à"ð ,ð ,ð ,ð ,ð ,ð ,ð ,�cØ×&Ò& sÑ+Ô+Ð+Ð+ð #à×"Ò"¥>Ñ2Ô2Ð2Ð2Ð2s   †#c               3   óˆ   •K  — 	 	 ‰                      d¬¦  «        } n# t          j        $ r Y Œ*w xY w| t          k    rdS | V — Œ?)zIterate over the input_queue.Tr   rÙ   N)r¿   r¼   rÁ   rJ  )rf   rK  s    €r*   Ú_input_iteratorz+RivaTTS.atransform.<locals>._input_iterator‚  sf   øè è € ððØ%Ÿ/š/°#˜/Ñ6Ô6�C�CøÝ”{ð ð ð Ø�Hðøøøà�.Ò(Ð(Ø�EØ�	�	�	ðs   † �/®/c                  ó¦   •— ‰                       ‰¦   «         ¦  «        D ]} ‰                     | ¦  «         Œ‰                     t          ¦  «         dS )z!Consume the input with transform.N)r>  rI  rJ  )rf   rN  Ú	out_queuerJ   s    €€€r*   Ú	_consumerz%RivaTTS.atransform.<locals>._consumer�  sW   ø€ à—~’~ o oÑ&7Ô&7Ñ8Ô8ð *ð *�Ø×$Ò$ SÑ)Ô)Ð)Ð)Ø× Ò ¥Ñ0Ô0Ð0Ð0Ð0r3   c               “   óD   •K  — ‰                      d‰ ¦  «        ƒ d{V —† dS )z"Coroutine that wraps the consumer.N)rÈ   )rQ  rÉ   s   €€r*   Ú_consumer_coroz*RivaTTS.atransform.<locals>._consumer_coro“  s5   øè è € à×&Ò& t¨YÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7r3   Tr   r†   )r„   rÇ   r¼   r½   r
   r�   Úcreate_taskrÝ   r¿   Ú
exceptionsÚTimeoutErrorrÃ   rJ  )rJ   r  r  r  rL  rS  ÚproducerÚconsumerrf   rQ  rN  rK  rÉ   rP  s   ``       @@@@@r*   Ú
atransformzRivaTTS.atransformq  s·  øøøøøøøè è € õ Ô'Ñ)Ô)ˆÝ#(¤;¡=¤=ˆÝ#*¤=¡?¤?ˆ	ð	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð		¥­,Ô!7ð 		ð 		ð 		ð 		ð 		ð 		ð	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð	8ð 	8ð 	8ð 	8ð 	8ð 	8ð 	8ð ×#Ò# I I¡K¤KÑ0Ô0ˆØ×#Ò# N NÑ$4Ô$4Ñ5Ô5ˆð		ðÝ#Ô,¨Y¯]ª]©_¬_¸cÑBÔBÐBÐBÐBÐBÐBÐB��øÝÔ%Ô2ð ð ð Ø�ðøøøà×ÒÑ!Ô!Ð!à•nÐ$Ð$ØØˆIˆIˆIˆIð		ð ˆˆˆˆˆˆˆØˆˆˆˆˆˆˆˆˆs   Â--C ÃC2Ã1C2)r"   r:  rõ   )r.   r/   r0   r1   r“   r_   rj   rR   r   r.  rˆ   r   r   rM   r   r   r  r   r9  r  r�   r   ÚTTSOutputTyper(  r
   r>  r   r   rY  r2   r3   r*   r,  r,    sg  € € € € € € ð
 JÐIà!€Dˆ#Ð!Ð!Ñ!ð	Eð �ð ð ñ ð �eØðaðñ ô €J�ð ð ñ ð ', eØð5ð'ñ 'ô 'Ð�h˜s”mð ð ñ ð €^˜ÐÑÔØð¨4°°S°¬>ð ¸dÀ3ÈÀ8¼nð ð ð ñ „[ñ Ôðð
 €YÐ!Ñ"Ô"Øð¨Cð °Cð ð ð ñ „[ñ #Ô"ððð ð ð ð ,0ð7ð 7àð7ð ˜Ô(ð7ð ð	7ð
 
ð7ð 7ð 7ð 7ð ,0ð%Dð %Dà˜Ô%ð%Dð ˜Ô(ð%Dð ˜3”-ð	%Dð
 
�-Ô	 ð%Dð %Dð %Dð %DðT ,0ð5ð 5à˜\Ô*ð5ð ˜Ô(ð5ð ˜3”-ð	5ð
 
˜ tÐ+Ô	,ð5ð 5ð 5ð 5ð 5ð 5r3   r,  )r"   r#   )Nr1   r„   Úloggingr4  r¼   r‘   rv   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Â   rJ  r_   r5   rQ   rl   rr   ÚfloatÚ
Wave_writerœ   r¡   r¯   rö   r÷   ÚStreamOutputTyper±   r)  r*  rù   r�   rZ  r,  ÚNVIDIARivaASRÚNVIDIARivaTTSÚNVIDIARivaStreamr2   r3   r*   ú<module>rm     s�  ðØ 0Ð 0à €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð <Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ð ;Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ Iðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 2ØÐÐÐØ1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1à
ˆ'Ô
˜HÑ
%Ô
%€ØÐ ØÐ Ø9Ð ð
ð 
ð 
ð 
ð"ð "ð "ð "ð "ñ "ô "ð "ð 
ˆ‰Œ€Ø�‘”€ð$8ð $8ð $8ð $8ð $8˜˜Tñ $8ô $8ð $8ðN%ð %ð %ð %ð %�Iñ %ô %ð %ðBð ð ð ð ˜Iñ ô ð ð(%"ð %"ð %"ð %"ð %"ñ %"ô %"ð %"ðPØ˜s”mðØ27ðà
ˆ8�CŒ=˜( 4¤?Ô3Ð3Ô4ðð ð ð ð"	˜ð 	¨3ð 	ð 	ð 	ð 	ð˜H ^Ô4ð ¸À3ÈÈdÀ?Ô9Sð ð ð ð ð6 ˜˜yÐ(Ô)€ØÐ ðMð Mð Mð Mð Mñ Mô Mð Mðb €Ø€ðcð cð cð cð cØØØ˜ }Ð4Ô5ñcô cð cðP �S˜* kÐ1Ô2€Ø€ð_ð _ð _ð _ð _ØØØ˜ }Ð4Ô5ñ_ô _ð _ðF €Ø€ØÐ Ð Ð r3   