Spaces:
Sleeping
Sleeping
| """ | |
| 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", | |
| } | |