""" ElevenLabs Voice Mappings Voice IDs for default/premade voices from ElevenLabs. """ # Default/premade voices from ElevenLabs ELEVENLABS_VOICES = { # === Narration - Deep, authoritative === "george": "JBFqnCBsd6RMkjVDRZzb", # British, warm (DEFAULT) "adam": "pNInz6obpgDQGcFmaJgB", # American, deep narrator "brian": "nPczCjzI2devNBz1zQrb", # American, narrator "bill": "pqHfZKP75CvOlQylNhV4", # American, trustworthy "arnold": "VR6AewLTigWG4xSOukaG", # Crisp, deep "daniel": "onwK4e9ZLuTAKqWW03F9", # British, authoritative "joseph": "Zlb1dXrM653N07WRdFW3", # British, narrative "michael": "flq6f7yk4E4fJM5XTYuZ", # Old American, orator # === Conversational - Warm, friendly === "rachel": "21m00Tcm4TlvDq8ikWAM", # American, calm female "alice": "Xb7hH8MSUJpSbSDYk0k2", # British, confident female "sarah": "EXAVITQu4vr4xnSDxMaL", # American, news "emily": "LcfcDJNUP1GQjkzn1xUU", # American, soft female "drew": "29vD33N1CtxCmqQRPOHJ", # Well-rounded, confident "dave": "CYw3kZ02Hs0563khs1Fj", # Essex accent, conversational "charlie": "IKne3meq5aSn9XLyUdCD", # Australian, natural "chris": "iP95p4xoKVk53GoZ742B", # American, casual # === Young voices === "josh": "TxGEqnHWrfWFTfGW9XjX", # American, young "liam": "TX3LPaxmHKxFdv7VOQHJ", # Articulate, young "harry": "SOYHLrjzK2X1ezoPC6cr", # Anxious, young "elli": "MF3mGyEYCl7XYWbV9V6O", # Young, emotional "freya": "jsCqWAovK2LkecY7zXl4", # Young, American female # === British voices === "dorothy": "ThT5KcBeYPX3keUQqHPh", # British, pleasant "lily": "pFZP5JQG7iQjIQuC4Bku", # British, warm # === Australian voices === "james": "ZQe5CZNOzWyzPSCn5a3c", # Australian, calm "matilda": "XrExE9yKIg1WjnnlVkGX", # Australian, warm female # === Special/Character voices === "thomas": "GBv7mTt0atIp3Br8iCZE", # Meditation, calm "nicole": "piTKgcLEGmPE4e6mEKli", # ASMR, whispery "clyde": "2EiwWnXFnvU5JabPnv8n", # War veteran, intense "callum": "N2lVS1w4EtoT3dr4eOWO", # Transatlantic, intense "grace": "oWAxZDx7w5VEj9dCyTzz", # Southern American "serena": "pMsXgVXv3BLzUgSXRplE", # Calm, pleasant "antoni": "ErXwobaYiN019PkySvjV", # Well-rounded, calm "fin": "D38z5RcWu1voky8WS1ja", # Irish "paul": "5Q0t7uMcjvnagumLfvZi", # Ground reporter "domi": "AZnzlk1XvdvUeBnXmlld", # Strong, assertive "jessie": "t0jbNlBVZ17f02VDIeMI", # Raspy, American "ethan": "g5CIjZEefAph4nQFvHAz", # ASMR, young "gigi": "jBpfuIE2acCO8z3wKNLl", # Childish, American "charlotte": "XB0fDUnXU5powFXDhCwa", # Swedish "mimi": "zrHiDhphv9ZnVXBqCLjz", # Swedish, childish "giovanni": "zcAOhNBS3c14rBihAFp1", # Italian "glinda": "z9fAnlkpzviPz146aGWa", # Theatrical "patrick": "ODq5zmih8GrVes37Dizd", # Video game } # Voice categories for easy selection VOICE_CATEGORIES = { "narration": ["george", "adam", "brian", "bill", "arnold", "daniel", "joseph", "michael"], "conversational": ["rachel", "alice", "sarah", "emily", "drew", "dave", "charlie", "chris"], "young": ["josh", "liam", "harry", "elli", "freya"], "british": ["george", "alice", "daniel", "dorothy", "lily", "joseph"], "australian": ["charlie", "james", "matilda"], "calm": ["rachel", "thomas", "emily", "serena", "nicole", "antoni"], "special": ["nicole", "thomas", "clyde", "glinda", "giovanni"], } # Recommended voices for different use cases RECOMMENDED_VOICES = { "podcast": "george", # Warm British narrator "news": "sarah", # Professional news style "story": "adam", # Deep American narrator "tutorial": "alice", # Clear British female "meditation": "thomas", # Ultra calm "asmr": "nicole", # Whispery } def get_voice_id(voice_name: str) -> str: """ Get voice ID from name. Accepts either a voice name or voice ID directly. Args: voice_name: Voice name (e.g., "george") or voice ID Returns: ElevenLabs voice ID """ # If it's already a voice ID (21 chars), return as-is if len(voice_name) == 21 and voice_name not in ELEVENLABS_VOICES: return voice_name # Look up by name (case-insensitive) return ELEVENLABS_VOICES.get(voice_name.lower(), ELEVENLABS_VOICES["george"]) def get_voices_info() -> dict: """Get structured information about available voices.""" return { "recommended": { name: {"id": ELEVENLABS_VOICES[name], "use_case": use_case} for use_case, name in RECOMMENDED_VOICES.items() }, "categories": VOICE_CATEGORIES, "all_voices": list(ELEVENLABS_VOICES.keys()), "default": "george", }