From a34d16dabefba348851d10045ba3c4fa1bad57c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleix=20Conchillo=20Flaqu=C3=A9?= Date: Wed, 11 Dec 2024 13:59:09 -0800 Subject: [PATCH] tts: support more languages in playht and elevenlabs --- CHANGELOG.md | 8 +++++++ src/pipecat/services/elevenlabs.py | 4 ++++ src/pipecat/services/playht.py | 37 ++++++++++++++++++++++-------- 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f4691396..6925f6223 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to **Pipecat** will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased] + +### Added + +- Add support for more languages to ElevenLabs (Arabic, Croatian, Filipino, + Tamil) and PlayHT (Afrikans, Albanian, Amharic, Arabic, Bengali, Croatian, + Galician, Hebrew, Mandarin, Serbian, Tagalog, Urdu, Xhosa). + ## [0.0.50] - 2024-12-11 ### Added diff --git a/src/pipecat/services/elevenlabs.py b/src/pipecat/services/elevenlabs.py index 87d48b4fa..b829f4945 100644 --- a/src/pipecat/services/elevenlabs.py +++ b/src/pipecat/services/elevenlabs.py @@ -44,6 +44,7 @@ ElevenLabsOutputFormat = Literal["pcm_16000", "pcm_22050", "pcm_24000", "pcm_441 def language_to_elevenlabs_language(language: Language) -> str | None: BASE_LANGUAGES = { + Language.AR: "ar", Language.BG: "bg", Language.CS: "cs", Language.DA: "da", @@ -52,8 +53,10 @@ def language_to_elevenlabs_language(language: Language) -> str | None: Language.EN: "en", Language.ES: "es", Language.FI: "fi", + Language.FIL: "fil", Language.FR: "fr", Language.HI: "hi", + Language.HR: "hr", Language.HU: "hu", Language.ID: "id", Language.IT: "it", @@ -68,6 +71,7 @@ def language_to_elevenlabs_language(language: Language) -> str | None: Language.RU: "ru", Language.SK: "sk", Language.SV: "sv", + Language.TA: "ta", Language.TR: "tr", Language.UK: "uk", Language.VI: "vi", diff --git a/src/pipecat/services/playht.py b/src/pipecat/services/playht.py index 78be924af..00c5d4d34 100644 --- a/src/pipecat/services/playht.py +++ b/src/pipecat/services/playht.py @@ -47,23 +47,24 @@ except ModuleNotFoundError as e: def language_to_playht_language(language: Language) -> str | None: - language_map = { + BASE_LANGUAGES = { + Language.AF: "afrikans", + Language.AM: "amharic", + Language.AR: "arabic", + Language.BN: "bengali", Language.BG: "bulgarian", Language.CA: "catalan", Language.CS: "czech", Language.DA: "danish", Language.DE: "german", + Language.EL: "greek", Language.EN: "english", - Language.EN_US: "english", - Language.EN_GB: "english", - Language.EN_AU: "english", - Language.EN_NZ: "english", - Language.EN_IN: "english", Language.ES: "spanish", Language.FR: "french", - Language.FR_CA: "french", - Language.EL: "greek", + Language.GL: "galician", + Language.HE: "hebrew", Language.HI: "hindi", + Language.HR: "croatian", Language.HU: "hungarian", Language.ID: "indonesian", Language.IT: "italian", @@ -73,14 +74,30 @@ def language_to_playht_language(language: Language) -> str | None: Language.NL: "dutch", Language.PL: "polish", Language.PT: "portuguese", - Language.PT_BR: "portuguese", Language.RU: "russian", + Language.SQ: "albanian", + Language.SR: "serbian", Language.SV: "swedish", Language.TH: "thai", + Language.TL: "tagalog", Language.TR: "turkish", Language.UK: "ukrainian", + Language.UR: "urdu", + Language.XH: "xhosa", + Language.ZH: "mandarin", } - return language_map.get(language) + + result = BASE_LANGUAGES.get(language) + + # If not found in base languages, try to find the base language from a variant + if not result: + # Convert enum value to string and get the base language part (e.g. es-ES -> es) + lang_str = str(language.value) + base_code = lang_str.split("-")[0].lower() + # Look up the base code in our supported languages + result = base_code if base_code in BASE_LANGUAGES.values() else None + + return result class PlayHTTTSService(TTSService):