diff --git a/src/pipecat/services/elevenlabs/tts.py b/src/pipecat/services/elevenlabs/tts.py index d3a0668820..4f5d56ea96 100644 --- a/src/pipecat/services/elevenlabs/tts.py +++ b/src/pipecat/services/elevenlabs/tts.py @@ -462,6 +462,10 @@ class InputParams(BaseModel): style: Optional[float] = None use_speaker_boost: Optional[bool] = None speed: Optional[float] = None + context: Optional[List[dict]] = None + """Optionally provide a context for previous_text parameter for "context-aware" TTS resulting in more consistant TTS output""" + context_max_previous_text: int = 3 + """The max number of previous assistant messages that will be used for the previous_text parameter""" def __init__( self, @@ -529,6 +533,22 @@ async def run_tts(self, text: str) -> AsyncGenerator[Frame, None]: if self._voice_settings: payload["voice_settings"] = self._voice_settings + if self._params.context: + # Get the previous assistant messages + previous_assistant_messages = [] + if self._params.context is not None: + previous_assistant_messages = [ + msg.get("content") + for msg in self._params.context + if msg.get("role") == "assistant" and isinstance(msg.get("content"), str) + ] + previous_assistant_messages = previous_assistant_messages[ + -self._params.context_max_previous_text : + ] + + if len(previous_assistant_messages) > 0: + payload["previous_text"] = " ".join(previous_assistant_messages) + language = self._settings["language"] if self._model_name in ELEVENLABS_MULTILINGUAL_MODELS and language: payload["language_code"] = language