From 598936bc539856290a7743d3c16aff68bda774fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Wed, 2 Oct 2024 13:30:01 -0700 Subject: [PATCH] services: apply service language code before using service --- src/pipecat/services/aws.py | 9 ++++----- src/pipecat/services/azure.py | 6 ++++-- src/pipecat/services/cartesia.py | 8 ++++---- src/pipecat/services/elevenlabs.py | 20 +++++++++----------- src/pipecat/services/gladia.py | 4 ++-- src/pipecat/services/google.py | 12 ++++++------ src/pipecat/services/lmnt.py | 2 +- src/pipecat/services/xtts.py | 6 ++++-- 8 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/pipecat/services/aws.py b/src/pipecat/services/aws.py index 4a2eceab6..0ae72b968 100644 --- a/src/pipecat/services/aws.py +++ b/src/pipecat/services/aws.py @@ -121,7 +121,7 @@ class AWSTTSService(TTSService): self._settings = { "sample_rate": sample_rate, "engine": params.engine, - "language": language_to_aws_language(params.language) if params.language else "en-US", + "language": params.language if params.language else Language.EN, "pitch": params.pitch, "rate": params.rate, "volume": params.volume, @@ -135,8 +135,8 @@ class AWSTTSService(TTSService): def _construct_ssml(self, text: str) -> str: ssml = "" - if self._settings["language"]: - ssml += f"" + language = language_to_aws_language(self._settings["language"]) + ssml += f"" prosody_attrs = [] # Prosody tags are only supported for standard and neural engines @@ -158,8 +158,7 @@ class AWSTTSService(TTSService): if prosody_attrs: ssml += "" - if self._settings["language"]: - ssml += "" + ssml += "" ssml += "" diff --git a/src/pipecat/services/azure.py b/src/pipecat/services/azure.py index eff5d333f..190a297a0 100644 --- a/src/pipecat/services/azure.py +++ b/src/pipecat/services/azure.py @@ -27,6 +27,7 @@ from pipecat.frames.frames import ( ) from pipecat.services.ai_services import ImageGenService, STTService, TTSService from pipecat.services.openai import BaseOpenAILLMService +from pipecat.transcriptions import language from pipecat.transcriptions.language import Language from pipecat.utils.time import time_now_iso8601 @@ -191,7 +192,7 @@ class AzureTTSService(TTSService): self._settings = { "sample_rate": sample_rate, "emphasis": params.emphasis, - "language": language_to_azure_language(params.language) if params.language else "en-US", + "language": params.language if params.language else Language.EN, "pitch": params.pitch, "rate": params.rate, "role": params.role, @@ -206,8 +207,9 @@ class AzureTTSService(TTSService): return True def _construct_ssml(self, text: str) -> str: + language = language_to_azure_language(self._settings["language"]) ssml = ( - f"" f"" diff --git a/src/pipecat/services/cartesia.py b/src/pipecat/services/cartesia.py index 464c2d979..b8aab1161 100644 --- a/src/pipecat/services/cartesia.py +++ b/src/pipecat/services/cartesia.py @@ -106,7 +106,7 @@ class CartesiaTTSService(WordTTSService): "encoding": params.encoding, "sample_rate": params.sample_rate, }, - "language": language_to_cartesia_language(params.language) if params.language else "en", + "language": params.language if params.language else Language.EN, "speed": params.speed, "emotion": params.emotion, } @@ -146,7 +146,7 @@ class CartesiaTTSService(WordTTSService): "model_id": self.model_name, "voice": voice_config, "output_format": self._settings["output_format"], - "language": self._settings["language"], + "language": language_to_cartesia_language(self._settings["language"]), "add_timestamps": add_timestamps, } return json.dumps(msg) @@ -303,7 +303,7 @@ class CartesiaHttpTTSService(TTSService): "encoding": params.encoding, "sample_rate": params.sample_rate, }, - "language": language_to_cartesia_language(params.language) if params.language else None, + "language": params.language if params.language else Language.EN, "speed": params.speed, "emotion": params.emotion, } @@ -343,7 +343,7 @@ class CartesiaHttpTTSService(TTSService): transcript=text, voice_id=self._voice_id, output_format=self._settings["output_format"], - language=self._settings["language"], + language=language_to_cartesia_language(self._settings["language"]), stream=False, _experimental_voice_controls=voice_controls, ) diff --git a/src/pipecat/services/elevenlabs.py b/src/pipecat/services/elevenlabs.py index 723e2f854..95ac5c1f1 100644 --- a/src/pipecat/services/elevenlabs.py +++ b/src/pipecat/services/elevenlabs.py @@ -198,9 +198,7 @@ class ElevenLabsTTSService(WordTTSService): self._url = url self._settings = { "sample_rate": sample_rate_from_output_format(params.output_format), - "language": language_to_elevenlabs_language(params.language) - if params.language - else "en", + "language": params.language if params.language else Language.EN, "output_format": params.output_format, "optimize_streaming_latency": params.optimize_streaming_latency, "stability": params.stability, @@ -294,14 +292,14 @@ class ElevenLabsTTSService(WordTTSService): if self._settings["optimize_streaming_latency"]: url += f"&optimize_streaming_latency={self._settings['optimize_streaming_latency']}" - # language can only be used with the 'eleven_turbo_v2_5' model - if self._settings["language"]: - if model == "eleven_turbo_v2_5": - url += f"&language_code={self._settings['language']}" - else: - logger.debug( - f"Language code [{self._settings['language']}] not applied. Language codes can only be used with the 'eleven_turbo_v2_5' model." - ) + # Language can only be used with the 'eleven_turbo_v2_5' model + language = language_to_elevenlabs_language(self._settings["language"]) + if model == "eleven_turbo_v2_5": + url += f"&language_code={language}" + else: + logger.debug( + f"Language code [{language}] not applied. Language codes can only be used with the 'eleven_turbo_v2_5' model." + ) self._websocket = await websockets.connect(url) self._receive_task = self.get_event_loop().create_task(self._receive_task_handler()) diff --git a/src/pipecat/services/gladia.py b/src/pipecat/services/gladia.py index 8f270195b..e95329040 100644 --- a/src/pipecat/services/gladia.py +++ b/src/pipecat/services/gladia.py @@ -135,7 +135,7 @@ class GladiaSTTService(STTService): self._url = url self._settings = { "sample_rate": params.sample_rate, - "language": language_to_gladia_language(params.language) if params.language else "en", + "language": params.language if params.language else Language.EN, "transcription_hint": params.transcription_hint, "endpointing": params.endpointing, "prosody": params.prosody, @@ -169,7 +169,7 @@ class GladiaSTTService(STTService): "model_type": "fast", "language_behaviour": "manual", "sample_rate": self._settings["sample_rate"], - "language": self._settings["language"], + "language": language_to_gladia_language(self._settings["language"]), "transcription_hint": self._settings["transcription_hint"], "endpointing": self._settings["endpointing"], "prosody": self._settings["prosody"], diff --git a/src/pipecat/services/google.py b/src/pipecat/services/google.py index a8187366a..93c2f2d62 100644 --- a/src/pipecat/services/google.py +++ b/src/pipecat/services/google.py @@ -40,7 +40,7 @@ try: except ModuleNotFoundError as e: logger.error(f"Exception: {e}") logger.error( - "In order to use Google AI, you need to `pip install pipecat-ai[google]`. Also, set `GOOGLE_APPLICATION_CREDENTIALS` environment variable." + "In order to use Google AI, you need to `pip install pipecat-ai[google]`. Also, set the environment variable GOOGLE_API_KEY for the GoogleLLMService and GOOGLE_APPLICATION_CREDENTIALS for the GoogleTTSService`." ) raise Exception(f"Missing module: {e}") @@ -261,9 +261,7 @@ class GoogleTTSService(TTSService): "rate": params.rate, "volume": params.volume, "emphasis": params.emphasis, - "language": language_to_google_language(params.language) - if params.language - else "en-US", + "language": params.language if params.language else Language.EN, "gender": params.gender, "google_style": params.google_style, } @@ -298,8 +296,10 @@ class GoogleTTSService(TTSService): # Voice tag voice_attrs = [f"name='{self._voice_id}'"] - if self._settings["language"]: - voice_attrs.append(f"language='{self._settings['language']}'") + + language = language_to_google_language(self._settings["language"]) + voice_attrs.append(f"language='{language}'") + if self._settings["gender"]: voice_attrs.append(f"gender='{self._settings['gender']}'") ssml += f"" diff --git a/src/pipecat/services/lmnt.py b/src/pipecat/services/lmnt.py index eea4fd9db..8f7fe6528 100644 --- a/src/pipecat/services/lmnt.py +++ b/src/pipecat/services/lmnt.py @@ -82,7 +82,7 @@ class LmntTTSService(TTSService): "encoding": "pcm_s16le", "sample_rate": sample_rate, }, - "language": language_to_lmnt_language(language) if language else "en", + "language": language, } self.set_voice(voice_id) diff --git a/src/pipecat/services/xtts.py b/src/pipecat/services/xtts.py index d3cea254a..2f842c896 100644 --- a/src/pipecat/services/xtts.py +++ b/src/pipecat/services/xtts.py @@ -94,7 +94,7 @@ class XTTSService(TTSService): super().__init__(**kwargs) self._settings = { - "language": language_to_xtts_language(language) if language else "en", + "language": language, "base_url": base_url, } self.set_voice(voice_id) @@ -131,9 +131,11 @@ class XTTSService(TTSService): url = self._settings["base_url"] + "/tts_stream" + language = language_to_xtts_language(self._settings["language"]) + payload = { "text": text.replace(".", "").replace("*", ""), - "language": self._settings["language"], + "language": language, "speaker_embedding": embeddings["speaker_embedding"], "gpt_cond_latent": embeddings["gpt_cond_latent"], "add_wav_header": False,