
    qi]                        d 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m	Z	m
Z
 ddlZddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ dd	lmZmZm Z m!Z! dd
l"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* 	 ddl+m,Z- ddl.m/Z/ de'de
e4   fdZ5e G d de             Z6 G d de#      Z7 G d de%      Z8y# e0$ r7Z1 ejd                  de1         ejd                  d        e3de1       dZ1[1ww xY w)zNeuphonic text-to-speech service implementations.

This module provides WebSocket and HTTP-based integrations with Neuphonic's
text-to-speech API for real-time audio synthesis.
    N)	dataclassfield)AnyAsyncGeneratorOptional)logger)	BaseModel)
BotStoppedSpeakingFrameCancelFrameEndFrame
ErrorFrameFrameLLMFullResponseEndFrame
StartFrameTTSAudioRawFrameTTSSpeakFrameTTSStoppedFrame)FrameDirection)	NOT_GIVENTTSSettings	_NotGiven_warn_deprecated_param)InterruptibleTTSServiceTextAggregationMode
TTSService)Languageresolve_language)
traced_tts)connect)StatezException: zKIn order to use Neuphonic, you need to `pip install pipecat-ai[neuphonic]`.zMissing module: languagereturnc                 b   t         j                  dt         j                  dt         j                  dt         j                  dt         j
                  dt         j                  dt         j                  dt         j                  dt         j                  d	t         j                  d
i
}t        | |d      S )zConvert a Language enum to Neuphonic language code.

    Args:
        language: The Language enum value to convert.

    Returns:
        The corresponding Neuphonic language code, or None if not supported.
    deenesnlarfrptruHIzhT)use_base_code)r   DEENESNLARFRPTRUr,   ZHr   )r!   LANGUAGE_MAPs     P/opt/pipecat/venv/lib/python3.12/site-packages/pipecat/services/neuphonic/tts.pylanguage_to_neuphonic_lang_coder:   2   sv     	TTTTTTTTTTL Hl$GG    c                   6    e Zd ZU dZ ed       Zeez  ed<   y)NeuphonicTTSSettingszSettings for NeuphonicTTSService and NeuphonicHttpTTSService.

    Parameters:
        speed: Speech speed multiplier. Defaults to 1.0.
    c                      t         S N)r    r;   r9   <lambda>zNeuphonicTTSSettings.<lambda>S   s    Y r;   )default_factoryspeedN)	__name__
__module____qualname____doc__r   rC   floatr   __annotations__r@   r;   r9   r=   r=   K   s      %5FGE59Gr;   r=   c                       e Zd ZU dZeZeed<    G d de      Zddddddddd	d
e	de
e	   de	de
e   de	de
e   de
e   de
e   de
e   f fdZdefdZdede
e	   fdZdedee	ef   f fdZdef fdZdef fdZdef fdZd-de
e	   fdZej<                  fded ef fd!Z ded ef fd"Z! fd#Z" fd$Z#d% Z$d& Z%d' Z&d( Z'd) Z(d*e	fd+Z)e*d*e	de	de+edf   fd,       Z, xZ-S ).NeuphonicTTSServicea!  Neuphonic real-time text-to-speech service using WebSocket streaming.

    Provides real-time text-to-speech synthesis using Neuphonic's WebSocket API.
    Supports interruption handling, keepalive connections, and configurable voice
    parameters for high-quality speech generation.
    	_settingsc                   N    e Zd ZU dZej
                  Zee   ed<   dZ	ee
   ed<   y)NeuphonicTTSService.InputParamsa0  Input parameters for Neuphonic TTS configuration.

        .. deprecated:: 0.0.105
            Use ``settings=NeuphonicTTSSettings(...)`` instead.

        Parameters:
            language: Language for synthesis. Defaults to English.
            speed: Speech speed multiplier. Defaults to 1.0.
        r!         ?rC   NrD   rE   rF   rG   r   r0   r!   r   rI   rC   rH   r@   r;   r9   InputParamsrN   a   *    	 (0{{(8$2!$x$r;   rQ   Nzwss://api.neuphonic.com"V  
pcm_linear)voice_idurlsample_rateencodingparamssettingsaggregate_sentencestext_aggregation_modeapi_keyrU   rV   rW   rX   rY   rZ   r[   r\   c       	            t        dd| j                  t        j                        d      }|t	        dt         d       ||_        |[t	        dt                |sI|j                   | j                  |j                        |_        |j                  |j                  |_        ||j                  |       t        | (  d
||	ddd||d	|
 || _        || _        d| _        d| _        || _        || _        y)a  Initialize the Neuphonic TTS service.

        Args:
            api_key: Neuphonic API key for authentication.
            voice_id: ID of the voice to use for synthesis.

                .. deprecated:: 0.0.105
                    Use ``settings=NeuphonicTTSSettings(voice=...)`` instead.

            url: WebSocket URL for the Neuphonic API.
            sample_rate: Audio sample rate in Hz. Defaults to 22050.
            encoding: Audio encoding format. Defaults to "pcm_linear".
            params: Additional input parameters for TTS configuration.

                .. deprecated:: 0.0.105
                    Use ``settings=NeuphonicTTSSettings(...)`` instead.

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            aggregate_sentences: Deprecated. Use text_aggregation_mode instead.

                .. deprecated:: 0.0.104
                    Use ``text_aggregation_mode`` instead.

            text_aggregation_mode: How to aggregate text before synthesis.
            **kwargs: Additional arguments passed to parent InterruptibleTTSService.
        NrO   modelvoicer!   rC   rU   ra   rY   Tg       @)r[   r\   push_stop_framespush_start_framestop_frame_timeout_srW   rZ   r@   )r=   language_to_service_languager   r0   r   ra   r!   rC   apply_updatesuper__init___api_key_url_receive_task_keepalive_task	_encoding_sampling_rate)selfr]   rU   rV   rW   rX   rY   rZ   r[   r\   kwargsdefault_settings	__class__s               r9   rh   zNeuphonicTTSService.__init__o   s   T 066x{{C	
 ":/CWM%-" "8-AB??.040Q0QRXRaRa0b$-<<+-3\\$* ))(3 		
 3"7!!!$#%		
 		
  	!#!)r;   r"   c                      y)zCheck if this service can generate processing metrics.

        Returns:
            True, as Neuphonic service supports metrics generation.
        Tr@   ro   s    r9   can_generate_metricsz(NeuphonicTTSService.can_generate_metrics        r;   r!   c                     t        |      S zConvert a Language enum to Neuphonic service language format.

        Args:
            language: The language to convert.

        Returns:
            The Neuphonic-specific language code, or None if not supported.
        r:   ro   r!   s     r9   re   z0NeuphonicTTSService.language_to_service_language        /x88r;   deltac                    K   t         |   |       d{   }|rS| j                          d{    | j                          d{    t	        j
                  d| j                   d       |S 7 [7 C7 -w)z<Apply a settings delta and reconnect with new configuration.NzSwitching TTS to settings: [])rg   _update_settings_disconnect_connectr   inforL   )ro   r|   changedrr   s      r9   r   z$NeuphonicTTSService._update_settings   sj     077""$$$--/!!KK6t~~6FaHI 8$!s1   A8A2A8A4A8A6	*A84A86A8framec                 t   K   t         |   |       d{    | j                          d{    y7 7 w)zStart the Neuphonic TTS service.

        Args:
            frame: The start frame containing initialization parameters.
        N)rg   startr   ro   r   rr   s     r9   r   zNeuphonicTTSService.start   s3      gmE"""mmo 	#   848688c                 t   K   t         |   |       d{    | j                          d{    y7 7 w)zYStop the Neuphonic TTS service.

        Args:
            frame: The end frame.
        N)rg   stopr   r   s     r9   r   zNeuphonicTTSService.stop   s6      gl5!!!    	" r   c                 t   K   t         |   |       d{    | j                          d{    y7 7 w)z^Cancel the Neuphonic TTS service.

        Args:
            frame: The cancel frame.
        N)rg   cancelr   r   s     r9   r   zNeuphonicTTSService.cancel   s6      gnU###    	$ r   
context_idc                    K   | j                   r;ddi}| j                   j                  t        j                  |             d{    yy7 w)z:Flush any pending audio synthesis by sending stop command.textz<STOP>N
_websocketsendjsondumps)ro   r   msgs      r9   flush_audiozNeuphonicTTSService.flush_audio   s?     ??8$C//&&tzz#777 7   AAAA	directionc                 B   K   t         |   ||       d{    y7 w)zPush a frame downstream with special handling for stop conditions.

        Args:
            frame: The frame to push.
            direction: The direction to push the frame.
        N)rg   
push_framero   r   r   rr   s      r9   r   zNeuphonicTTSService.push_frame  s      g 	222s   c                 D  K   t         |   ||       d{    t        |t              r| j	                          d{    yt        |t
              r| j	                          d{    yt        |t              r| j                          d{    yy7 7 Z7 37 w)zProcess frames with special handling for speech control.

        Args:
            frame: The frame to process.
            direction: The direction of frame processing.
        N)rg   process_frame
isinstancer   pause_processing_framesr   r
   resume_processing_framesr   s      r9   r   z!NeuphonicTTSService.process_frame
  s      g#E9555
 e]+..00067..00067//111 8 	6 101sD   B B'B B (B (B)(B BB B B B c                 |  K   t         |           d{    | j                          d{    | j                  r;| j                  s/| j                  | j                  | j                              | _        | j                  r2| j                  s%| j                  | j                               | _        yyy7 7 w)z:Connect to Neuphonic WebSocket and start background tasks.N)
rg   r   _connect_websocketr   rk   create_task_receive_task_handler_report_errorrl   _keepalive_task_handlerro   rr   s    r9   r   zNeuphonicTTSService._connect  s     g   %%'''??4#5#5!%!1!1$2L2LTM_M_2`!aD??4#7#7#'#3#3D4P4P4R#SD  $8? 	!'s    B<B8B<B:BB<:B<c                 R  K   t         |           d{    | j                  r*| j                  | j                         d{    d| _        | j                  r*| j                  | j                         d{    d| _        | j                          d{    y7 7 \7 (7 w)z7Disconnect from Neuphonic WebSocket and clean up tasks.N)rg   r   rk   cancel_taskrl   _disconnect_websocketr   s    r9   r   zNeuphonicTTSService._disconnect)  s     g!###""4#5#5666!%D""4#7#7888#'D ((*** 	$ 7 9 	+sE   B'B.B'B!5B':B#;B'B%B'!B'#B'%B'c                 j  K   	 | j                   r'| j                   j                  t        j                  u ryt	        j
                  d       | j                  j                  | j                  j                  | j                  | j                  | j                  j                  d}g }|j                         D ]  \  }}|	|j                  | d|          | j                   d| j                  j                   }|r|ddj                  |       z  }d| j                   i}t#        ||	       d{   | _         | j%                  d
       d{    y7 #7 # t&        $ rL}| j)                  d| |       d{  7   d| _         | j%                  d|        d{  7   Y d}~yd}~ww xY ww)z0Establish WebSocket connection to Neuphonic API.NzConnecting to Neuphonic)	lang_coderC   rX   sampling_raterU   =z/speak/?&z	x-api-key)additional_headerson_connectedUnknown error occurred: 	error_msg	exceptionon_connection_error)r   stater    OPENr   debugrL   r!   rC   rm   rn   ra   itemsappendrj   joinri   websocket_connect_call_event_handler	Exception
push_error)ro   
tts_configquery_paramskeyvaluerV   headerses           r9   r   z&NeuphonicTTSService._connect_websocket7  s    	J4??#8#8EJJ#FLL23 "^^44-- NN!%!4!4 NN00J L(..0 :
U$ ''3%q(89: YYKwt~~'>'>&?@C388L1233"DMM2G$5cg$VVDO**>::: W: 	J//.Fqc,JVW/XXX"DO**+@QCIII	Js|   F32E F3BE ?A4E 3E4E EE F3E E 	F0$F+=F >"F+ F#!F+&F3+F00F3c                   K   	 | j                          d{    | j                  r7t        j                  d       | j                  j	                          d{    d| _        | j                  d       d{    y7 h7 '# t
        $ r)}| j                  d| |       d{  7   Y d}~Rd}~ww xY w7 ># d| _        | j                  d       d{  7   w xY ww)z.Close WebSocket connection and clean up state.NzDisconnecting from Neuphonicr   r   on_disconnected)stop_all_metricsr   r   r   closer   r   r   )ro   r   s     r9   r   z)NeuphonicTTSService._disconnect_websocketZ  s     
	>'')));<oo++--- #DO**+<=== * . 	Y//.Fqc,JVW/XXX	Y > #DO**+<===s   C!B B AB BB C!:B9;C! B B 	B6B1&B)'B1,B; 1B66B; 9C!;CCCC!c                   K   | j                   2 3 d{   }t        |t              st        j                  |      }|j                  d      sA|d   j                  d      sV| j                          d{    t        j                  |d   d         }t        || j                  d| j                               }| j                  |       d{    7 7 b7 	6 yw)z6Receive and process messages from Neuphonic WebSocket.Ndataaudio   r   )r   r   strr   loadsgetstop_ttfb_metricsbase64	b64decoder   rW   get_active_audio_context_idr   )ro   messager   r   r   s        r9   _receive_messagesz%NeuphonicTTSService._receive_messagesh  s     !__ 
	1 
	1''3'jj)776?s6{w'?00222",,S[-ABE,t//t?_?_?aE //%000
	1 3 1 -s[   C!CCCC!&C!C!%C!8C9AC!CC!CC!C!C!c                    K   d}	 t        j                  |       d{    | j                          d{    67 7 w)z;Handle keepalive messages to maintain WebSocket connection.
   N)asynciosleep_send_keepalive)ro   KEEPALIVE_SLEEPs     r9   r   z+NeuphonicTTSService._keepalive_task_handlerv  s>     --000&&((( 0(s   A <A >A A c                    K   | j                   r;ddi}| j                   j                  t        j                  |             d{    yy7 w)z.Send keepalive message to maintain connection.r    Nr   )ro   r   s     r9   r   z#NeuphonicTTSService._send_keepalive}  s@     ??2,C//&&tzz#777  8r   r   c                    K   | j                   rVd| di}t        j                  d|        | j                   j                  t	        j
                  |             d{    yy7 w)z/Send text to Neuphonic WebSocket for synthesis.r   z <STOP>zSending text to websocket: N)r   r   r   r   r   r   )ro   r   r   s      r9   
_send_textzNeuphonicTTSService._send_text  s\     ??dV7+,CLL6se<=//&&tzz#777  8s   AA(A& A(c                r  K   t        j                  d| d       	 | j                  r&| j                  j                  t        j
                  u r| j                          d{    	 | j                  |       d{    | j                  |       d{    d y7 =7 %7 # t        $ r]}t        d|        t        |       | j                          d{  7   | j                          d{  7   Y d}~yd}~ww xY w# t        $ r}t        d|        Y d}~yd}~ww xY ww)a  Generate speech from text using Neuphonic's streaming API.

        Args:
            text: The text to synthesize into speech.
            context_id: Unique identifier for this TTS context.

        Yields:
            Frame: Audio frames containing the synthesized speech.
        Generating TTS: [r~   Nr   errorr   )r   r   r   r   r    CLOSEDr   r   start_tts_usage_metricsr   r   r   r   )ro   r   r   r   s       r9   run_ttszNeuphonicTTSService.run_tts  s
     	(a01	C??doo&;&;u||&Kmmo%%ood+++224888 J & ,8  )A!'EFF%<<&&(((mmo%%  	C%=aS#ABBB	Cs   D7AD "B #D (B& <B"=B& B$B& D D7 D "B& $B& &	D/4D#C&$D<C?=DD D7DD 	D4D/*D7/D44D7r?   ).rD   rE   rF   rG   r=   SettingsrI   r	   rQ   r   r   intboolr   rh   ru   r   re   r   dictr   r   r   r   r   r   r   r   r   r   
DOWNSTREAMr   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__rr   s   @r9   rK   rK   V   s    $H##%i %$ #',%*$(,37.2?CS* S* 3-	S*
 S* c]S* S* %S* /0S* &d^S*  ((;<S*jd 	9X 	9(3- 	9K DcN  ! !!+ !8HSM 8 JXIbIb 3e 3 32 2> 2&
T+!JF>1)88S 8 C# C3 C>%QU+;V C Cr;   rK   c                   0    e Zd ZU dZeZeed<    G d de      Zddddddd	d
e	de
e	   dej                  de	de
e   de
e	   de
e   de
e   f fdZdefdZdede
e	   fdZdef fdZdde
e	   fdZde	dedz  fdZede	de	deedf   fd       Z xZS ) NeuphonicHttpTTSServicea  Neuphonic text-to-speech service using HTTP streaming.

    Provides text-to-speech synthesis using Neuphonic's HTTP API with server-sent
    events for streaming audio delivery. Suitable for applications that prefer
    HTTP-based communication over WebSocket connections.
    rL   c                   N    e Zd ZU dZej
                  Zee   ed<   dZ	ee
   ed<   y)#NeuphonicHttpTTSService.InputParamsa5  Input parameters for Neuphonic HTTP TTS configuration.

        .. deprecated:: 0.0.105
            Use ``settings=NeuphonicTTSSettings(...)`` instead.

        Parameters:
            language: Language for synthesis. Defaults to English.
            speed: Speech speed multiplier. Defaults to 1.0.
        r!   rO   rC   NrP   r@   r;   r9   rQ   r     rR   r;   rQ   Nzhttps://api.neuphonic.comrS   rT   )rU   rV   rW   rX   rY   rZ   r]   rU   aiohttp_sessionrV   rW   rX   rY   rZ   c                   t        dd| j                  t        j                        d      }
|t	        dt         d       ||
_        |[t	        dt                |sI|j                   | j                  |j                        |
_        |j                  |j                  |
_        ||
j                  |       t        | (  d
|dd|
d|	 || _        || _        |j                  d	      | _        || _        y)a  Initialize the Neuphonic HTTP TTS service.

        Args:
            api_key: Neuphonic API key for authentication.
            voice_id: ID of the voice to use for synthesis.

                .. deprecated:: 0.0.105
                    Use ``settings=NeuphonicTTSSettings(voice=...)`` instead.

            aiohttp_session: Shared aiohttp session for HTTP requests.
            url: Base URL for the Neuphonic HTTP API.
            sample_rate: Audio sample rate in Hz. Defaults to 22050.
            encoding: Audio encoding format. Defaults to "pcm_linear".
            params: Additional input parameters for TTS configuration.

                .. deprecated:: 0.0.105
                    Use ``settings=NeuphonicTTSSettings(...)`` instead.

            settings: Runtime-updatable settings. When provided alongside deprecated
                parameters, ``settings`` values take precedence.
            **kwargs: Additional arguments passed to parent TTSService.
        NrO   r_   rU   ra   rY   T)rW   rb   rc   rZ   /r@   )r=   re   r   r0   r   ra   r!   rC   rf   rg   rh   ri   _sessionrstrip	_base_urlrm   )ro   r]   rU   r   rV   rW   rX   rY   rZ   rp   rq   rr   s              r9   rh   z NeuphonicHttpTTSService.__init__  s    H 066x{{C	
 ":/CWM%-" "8-AB??.040Q0QRXRaRa0b$-<<+-3\\$* ))(3 	
#!!%		

 	
  'C!r;   r"   c                      y)zCheck if this service can generate processing metrics.

        Returns:
            True, as Neuphonic HTTP service supports metrics generation.
        Tr@   rt   s    r9   ru   z,NeuphonicHttpTTSService.can_generate_metrics  rv   r;   r!   c                     t        |      S rx   ry   rz   s     r9   re   z4NeuphonicHttpTTSService.language_to_service_language  r{   r;   r   c                 @   K   t         |   |       d{    y7 w)zStart the Neuphonic HTTP TTS service.

        Args:
            frame: The start frame containing initialization parameters.
        N)rg   r   r   s     r9   r   zNeuphonicHttpTTSService.start   s      gmE"""s   r   c                    K   yw)z|Flush any pending audio synthesis.

        Note:
            HTTP-based service doesn't require explicit flushing.
        Nr@   )ro   r   s     r9   r   z#NeuphonicHttpTTSService.flush_audio(  s      	s   r   c                    |j                         }|rd|vry	 |j                  dd      \  }}|r|dk(  ryt        j                  |      }|j	                  d      $t        d|j	                  dd	       d|d          |S # t        t        j                  f$ r"}t        j                  d
|        Y d}~yd}~ww xY w)zParse a Server-Sent Event message.

        Args:
            message: The SSE message to parse.

        Returns:
            Parsed message dictionary or None if not a data message.
        r   Nz: r   z[DONE]errorszNeuphonic API error status_codeunknownzFailed to parse SSE message: )
stripsplitr   r   r   r   
ValueErrorJSONDecodeErrorr   warning)ro   r   _data_contentmessage_dictr   s         r9   _parse_sse_messagez*NeuphonicHttpTTSService._parse_sse_message0  s     --/&/	%mmD!4OA|<8#;::l3L )5*<+;+;M9+U*VVXYefnYoXpq   D001 	NN:1#>?	s   B AB B=B88B=r   c                H  K   t        j                  d| d       | j                   d| j                  j                   }| j
                  dd}|| j                  j                  | j                  | j                  | j                  j                  d}| j                  j                  r| j                  j                  |d<   	 | j                  j                  |||      4 d	{   }|j                  d
k7  rc|j                          d	{   }d|j                   d| }t        |       	 d	d	d	      d	{    | j                          d	{    y	| j!                  |       d	{    |j"                  2 3 d	{   }	|	s|	j%                  dd      }
|
j'                         s0	 | j)                  |
      }|r|j+                  di       j+                  d      Q|d   d   }t-        j.                  |      }| j                          d	{    t1        || j                  d|       7 S7 /7 7 7 7 7 /# t2        $ r}t        d|        Y d	}~d	}~ww xY w6 d	d	d	      d	{  7   n# 1 d	{  7  sw Y   nxY wnP# t4        j6                  $ r t        j                  d        t2        $ r}t        d|        Y d	}~nd	}~ww xY w| j                          d	{  7   y	# | j                          d	{  7   w xY ww)a,  Generate speech from text using Neuphonic streaming API.

        Args:
            text: The text to convert to speech.
            context_id: Unique identifier for this TTS context.

        Yields:
            Frame: Audio frames containing the synthesized speech and status information.
        r   r~   z/sse/speak/zapplication/json)z	X-API-KEYzContent-Type)r   r   rX   r   rC   rU   )r   r   N   zNeuphonic API error: HTTP z - r   zutf-8ignore)r  r   r   r   r   r   zTTS generation cancelled)r   r   r   rL   r!   ri   rm   rW   rC   ra   r   poststatusr   r   r   r   contentdecoder  r  r   r   r   r   r   r   CancelledError)ro   r   r   rV   r   payloadresponse
error_texterror_messageliner   parsed_message	audio_b64audio_bytesr   s                  r9   r   zNeuphonicHttpTTSService.run_ttsR  s     	(a01 DNN,C,C+DE .
 00!--^^))
 >>"&.."6"6GJ-	+}}))#GW)M $! $!QY??c)'/}}!6J&@@QQTU_T`$aM$=99$! $!X ((***K 224888 #+"2"2 ! !$ "kk'(kCG"==? !)-)@)@)I +6 . 2 262 > B B7 K W(6v(>w(GI*0*:*:9*EK"&"8"8":::"2 +T-=-=qZ# ;$!!6$!X +K 9!$ ;
 % !(1I!/MNN !/ #3$! $! $! $! $!L %% 	LL34 	C%=aS#ABBB	C ((***$((***sQ  CL""J &H9'J *#JH<&J4J ?H? J L"IL"J1I2JI1II1
(J3A$I	I I	8J9J <J?J L"JI1I			I.I)$J)I..J2J =J >J J
JJJ L 1K'K"L "K''L *L"=L >L"LLLL"r?   )rD   rE   rF   rG   r=   r   rI   r	   rQ   r   r   aiohttpClientSessionr   rh   r   ru   r   re   r   r   r   r   r  r   r   r   r   r   r   s   @r9   r   r     s@    $H##%i %$ #'.%*".(,37H" H" 3-	H"
 !..H" H" c]H" 3-H" %H" /0H"Td 	9X 	9(3- 	9# #HSM  #  $+  D K+# K+3 K+>%QU+;V K+ K+r;   r   )9rG   r   r   r   dataclassesr   r   typingr   r   r   r  logurur   pydanticr	   pipecat.frames.framesr
   r   r   r   r   r   r   r   r   r   "pipecat.processors.frame_processorr   pipecat.services.settingsr   r   r   r   pipecat.services.tts_servicer   r   r   pipecat.transcriptions.languager   r   (pipecat.utils.tracing.service_decoratorsr   websockets.asyncio.clientr   r   websockets.protocolr    ModuleNotFoundErrorr   r   r   r   r:   r=   rK   r   r@   r;   r9   <module>r,     s       ( 0 0      > _ _ a a F ?,F)Hh H8C= H2 H; H HQC1 QCh
t+j t+}  ,FLL;qc"#FLL^_
&qc*
++,s   4B2 2C.72C))C.