Medium-MCP-Agent / elevenlabs_voices.py
Nikhil Pravin Pise
Medium Agent 2.0
07671e1
Raw
History Blame Contribute Delete
5 kB
"""
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",
}