From d7555609fd752e27ea34879356613d50d4055e8b Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Fri, 27 Sep 2024 11:57:50 -0400 Subject: [PATCH] Add TTS update settings options --- src/pipecat/frames/frames.py | 12 +++++- src/pipecat/services/ai_services.py | 62 ++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/pipecat/frames/frames.py b/src/pipecat/frames/frames.py index 1b31b9c88..8059b904b 100644 --- a/src/pipecat/frames/frames.py +++ b/src/pipecat/frames/frames.py @@ -5,7 +5,7 @@ # from dataclasses import dataclass, field -from typing import Any, List, Optional, Tuple +from typing import Any, List, Optional, Tuple, Union from pipecat.clocks.base_clock import BaseClock from pipecat.metrics.metrics import MetricsData @@ -548,6 +548,16 @@ class TTSUpdateSettingsFrame(ControlFrame): model: Optional[str] = None voice: Optional[str] = None language: Optional[Language] = None + speed: Optional[Union[str, float]] = None + emotion: Optional[List[str]] = None + engine: Optional[str] = None + pitch: Optional[str] = None + rate: Optional[str] = None + volume: Optional[str] = None + emphasis: Optional[str] = None + style: Optional[str] = None + style_degree: Optional[str] = None + role: Optional[str] = None @dataclass diff --git a/src/pipecat/services/ai_services.py b/src/pipecat/services/ai_services.py index 79e52531d..1cb91d6a2 100644 --- a/src/pipecat/services/ai_services.py +++ b/src/pipecat/services/ai_services.py @@ -8,7 +8,7 @@ import asyncio import io import wave from abc import abstractmethod -from typing import AsyncGenerator, List, Optional, Tuple +from typing import AsyncGenerator, List, Optional, Tuple, Union from loguru import logger @@ -170,6 +170,46 @@ class TTSService(AIService): async def set_language(self, language: Language): pass + @abstractmethod + async def set_speed(self, speed: Union[str, float]): + pass + + @abstractmethod + async def set_emotion(self, emotion: List[str]): + pass + + @abstractmethod + async def set_engine(self, engine: str): + pass + + @abstractmethod + async def set_pitch(self, pitch: str): + pass + + @abstractmethod + async def set_rate(self, rate: str): + pass + + @abstractmethod + async def set_volume(self, volume: str): + pass + + @abstractmethod + async def set_emphasis(self, emphasis: str): + pass + + @abstractmethod + async def set_style(self, style: str): + pass + + @abstractmethod + async def set_style_degree(self, style_degree: str): + pass + + @abstractmethod + async def set_role(self, role: str): + pass + # Converts the text to audio. @abstractmethod async def run_tts(self, text: str) -> AsyncGenerator[Frame, None]: @@ -233,6 +273,26 @@ class TTSService(AIService): await self.set_voice(frame.voice) if frame.language is not None: await self.set_language(frame.language) + if frame.speed is not None: + await self.set_speed(frame.speed) + if frame.emotion is not None: + await self.set_emotion(frame.emotion) + if frame.engine is not None: + await self.set_engine(frame.engine) + if frame.pitch is not None: + await self.set_pitch(frame.pitch) + if frame.rate is not None: + await self.set_rate(frame.rate) + if frame.volume is not None: + await self.set_volume(frame.volume) + if frame.emphasis is not None: + await self.set_emphasis(frame.emphasis) + if frame.style is not None: + await self.set_style(frame.style) + if frame.style_degree is not None: + await self.set_style_degree(frame.style_degree) + if frame.role is not None: + await self.set_role(frame.role) else: await self.push_frame(frame, direction)