diff --git a/sijapi/__init__.py b/sijapi/__init__.py index a6bba26..5278cf7 100644 --- a/sijapi/__init__.py +++ b/sijapi/__init__.py @@ -29,6 +29,7 @@ News = Configuration.load('news', 'secrets') Archivist = Configuration.load('archivist') Scrape = Configuration.load('scrape', 'secrets', Dir) Serve = Configuration.load('serve') +Tts = Configuration.load('tts') # Directories & general paths ROUTER_DIR = BASE_DIR / "routers" diff --git a/sijapi/config/tts.yaml-example b/sijapi/config/tts.yaml-example index c4e1d74..bed8591 100644 --- a/sijapi/config/tts.yaml-example +++ b/sijapi/config/tts.yaml-example @@ -1,10 +1,24 @@ default: xtts email: xtts -webclip: 11L +webclip: elevenlabs rss: xtts -podcast_dir: '{{ DIR.HOME }}/Library/Mobile Documents/iCloud~co~supertop~castro/Documents/Sideloads' + xtts: - voice: joanne + default: joanne + elevenlabs: - voice: luna - api_key: '{{ SECRET.ELEVENLABS_API_KEY }}' \ No newline at end of file + default: Victoria + voices: + alloy: "E3A1KVbKoWSIKSZwSUsW" + echo: "b42GBisbu9r5m5n6pHF7" + fable: "KAX2Y6tTs0oDWq7zZXW7" + onyx: "clQb8NxY08xZ6mX6wCPE" + nova: "6TayTBKLMOsghG7jYuMX" + shimmer: "E7soeOyjpmuZFurvoxZ2" + Luna: "6TayTBKLMOsghG7jYuMX" + Sangye: "E7soeOyjpmuZFurvoxZ2" + Herzog: "KAX2Y6tTs0oDWq7zZXW7" + Attenborough: "b42GBisbu9r5m5n6pHF7" + Victoria: "7UBkHqZOtFRLq6cSMQQg" + + api_key: "{{ SECRET.ELEVENLABS_API_KEY }}" diff --git a/sijapi/routers/tts.py b/sijapi/routers/tts.py index 301c630..83ca8ef 100644 --- a/sijapi/routers/tts.py +++ b/sijapi/routers/tts.py @@ -27,7 +27,7 @@ import tempfile import random import re import os -from sijapi import L, Dir, DEFAULT_VOICE, TTS_SEGMENTS_DIR, VOICE_DIR, PODCAST_DIR, TTS_OUTPUT_DIR, ELEVENLABS_API_KEY +from sijapi import L, Dir, Tts, DEFAULT_VOICE, TTS_SEGMENTS_DIR, VOICE_DIR, PODCAST_DIR, TTS_OUTPUT_DIR, ELEVENLABS_API_KEY from sijapi.utilities import sanitize_filename ### INITIALIZATIONS ### @@ -40,7 +40,6 @@ def err(text: str): logger.error(text) def crit(text: str): logger.critical(text) DEVICE = torch.device('cpu') -MODEL_NAME = "tts_models/multilingual/multi-dataset/xtts_v2" @tts.get("/tts/local_voices", response_model=List[str]) async def list_wav_files(): @@ -211,7 +210,7 @@ async def determine_voice_id(voice_name: str) -> str: "Victoria": "7UBkHqZOtFRLq6cSMQQg" } - if voice_name in hardcoded_voices: + if voice_name in Tts.elevenlabs.voices: voice_id = hardcoded_voices[voice_name] debug(f"Found voice ID - {voice_id}") return voice_id @@ -232,7 +231,7 @@ async def determine_voice_id(voice_name: str) -> str: except Exception as e: err(f"Error determining voice ID: {str(e)}") - # as a last fallback, rely on David Attenborough + # as a last fallback, rely on David Attenborough; move this to tts.yaml return "b42GBisbu9r5m5n6pHF7" @@ -339,7 +338,7 @@ async def local_tts( voice_file_path = await get_voice_file_path(voice, voice_file) # Initialize TTS model in a separate thread - XTTS = await asyncio.to_thread(TTS, model_name=MODEL_NAME) + XTTS = await asyncio.to_thread(TTS, model_name=Tts.xtts.model) await asyncio.to_thread(XTTS.to, DEVICE) segments = split_text(text_content) @@ -397,7 +396,7 @@ async def stream_tts(text_content: str, speed: float, voice: str, voice_file) -> async def generate_tts(text: str, speed: float, voice_file_path: str) -> str: output_dir = tempfile.mktemp(suffix=".wav", dir=tempfile.gettempdir()) - XTTS = TTS(model_name=MODEL_NAME).to(DEVICE) + XTTS = TTS(model_name=Tts.xtts.model).to(DEVICE) XTTS.tts_to_file(text=text, speed=speed, file_path=output_dir, speaker_wav=[voice_file_path], language="en") return output_dir