infra/modules/kubernetes/ebook2audiobook/audiblez-web/backend/services/voices.py
Viktor Barzin bcad200a23 chore: add untracked stacks, scripts, and agent configs
- New stacks: beads-server, hermes-agent
- Terragrunt tiers.tf for infra, phpipam, status-page
- Secrets symlinks for vault, phpipam, hermes-agent
- Scripts: cluster_manager, image_pull, containerd pullthrough setup
- Frigate config, audiblez-web app source, n8n workflows dir
- Claude agent: service-upgrade, reference: upgrade-config.json
- Removed: claudeception skill, excalidraw empty submodule, temp listings

[ci skip]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 09:33:06 +00:00

97 lines
5.7 KiB
Python

from models.schemas import Voice
# Voice catalog from Kokoro-82M (used by audiblez)
# https://huggingface.co/hexgrad/Kokoro-82M/blob/main/VOICES.md
VOICE_CATALOG = {
# American English
"af_heart": Voice(id="af_heart", name="Heart", language="American English", gender="F"),
"af_alloy": Voice(id="af_alloy", name="Alloy", language="American English", gender="F"),
"af_aoede": Voice(id="af_aoede", name="Aoede", language="American English", gender="F"),
"af_bella": Voice(id="af_bella", name="Bella", language="American English", gender="F"),
"af_jessica": Voice(id="af_jessica", name="Jessica", language="American English", gender="F"),
"af_kore": Voice(id="af_kore", name="Kore", language="American English", gender="F"),
"af_nicole": Voice(id="af_nicole", name="Nicole", language="American English", gender="F"),
"af_nova": Voice(id="af_nova", name="Nova", language="American English", gender="F"),
"af_river": Voice(id="af_river", name="River", language="American English", gender="F"),
"af_sarah": Voice(id="af_sarah", name="Sarah", language="American English", gender="F"),
"af_sky": Voice(id="af_sky", name="Sky", language="American English", gender="F"),
"am_adam": Voice(id="am_adam", name="Adam", language="American English", gender="M"),
"am_echo": Voice(id="am_echo", name="Echo", language="American English", gender="M"),
"am_eric": Voice(id="am_eric", name="Eric", language="American English", gender="M"),
"am_fenrir": Voice(id="am_fenrir", name="Fenrir", language="American English", gender="M"),
"am_liam": Voice(id="am_liam", name="Liam", language="American English", gender="M"),
"am_michael": Voice(id="am_michael", name="Michael", language="American English", gender="M"),
"am_onyx": Voice(id="am_onyx", name="Onyx", language="American English", gender="M"),
"am_puck": Voice(id="am_puck", name="Puck", language="American English", gender="M"),
"am_santa": Voice(id="am_santa", name="Santa", language="American English", gender="M"),
# British English
"bf_alice": Voice(id="bf_alice", name="Alice", language="British English", gender="F"),
"bf_emma": Voice(id="bf_emma", name="Emma", language="British English", gender="F"),
"bf_isabella": Voice(id="bf_isabella", name="Isabella", language="British English", gender="F"),
"bf_lily": Voice(id="bf_lily", name="Lily", language="British English", gender="F"),
"bm_daniel": Voice(id="bm_daniel", name="Daniel", language="British English", gender="M"),
"bm_fable": Voice(id="bm_fable", name="Fable", language="British English", gender="M"),
"bm_george": Voice(id="bm_george", name="George", language="British English", gender="M"),
"bm_lewis": Voice(id="bm_lewis", name="Lewis", language="British English", gender="M"),
# Japanese
"jf_alpha": Voice(id="jf_alpha", name="Alpha", language="Japanese", gender="F"),
"jf_gongitsune": Voice(id="jf_gongitsune", name="Gongitsune", language="Japanese", gender="F"),
"jf_nezumi": Voice(id="jf_nezumi", name="Nezumi", language="Japanese", gender="F"),
"jf_tebukuro": Voice(id="jf_tebukuro", name="Tebukuro", language="Japanese", gender="F"),
"jm_kumo": Voice(id="jm_kumo", name="Kumo", language="Japanese", gender="M"),
# Mandarin Chinese
"zf_xiaobei": Voice(id="zf_xiaobei", name="Xiaobei", language="Mandarin Chinese", gender="F"),
"zf_xiaoni": Voice(id="zf_xiaoni", name="Xiaoni", language="Mandarin Chinese", gender="F"),
"zf_xiaoxiao": Voice(id="zf_xiaoxiao", name="Xiaoxiao", language="Mandarin Chinese", gender="F"),
"zf_xiaoyi": Voice(id="zf_xiaoyi", name="Xiaoyi", language="Mandarin Chinese", gender="F"),
"zm_yunjian": Voice(id="zm_yunjian", name="Yunjian", language="Mandarin Chinese", gender="M"),
"zm_yunxi": Voice(id="zm_yunxi", name="Yunxi", language="Mandarin Chinese", gender="M"),
"zm_yunxia": Voice(id="zm_yunxia", name="Yunxia", language="Mandarin Chinese", gender="M"),
"zm_yunyang": Voice(id="zm_yunyang", name="Yunyang", language="Mandarin Chinese", gender="M"),
# Spanish
"ef_dora": Voice(id="ef_dora", name="Dora", language="Spanish", gender="F"),
"em_alex": Voice(id="em_alex", name="Alex", language="Spanish", gender="M"),
"em_santa": Voice(id="em_santa", name="Santa", language="Spanish", gender="M"),
# French
"ff_siwis": Voice(id="ff_siwis", name="Siwis", language="French", gender="F"),
# Hindi
"hf_alpha": Voice(id="hf_alpha", name="Alpha", language="Hindi", gender="F"),
"hf_beta": Voice(id="hf_beta", name="Beta", language="Hindi", gender="F"),
"hm_omega": Voice(id="hm_omega", name="Omega", language="Hindi", gender="M"),
"hm_psi": Voice(id="hm_psi", name="Psi", language="Hindi", gender="M"),
# Italian
"if_sara": Voice(id="if_sara", name="Sara", language="Italian", gender="F"),
"im_nicola": Voice(id="im_nicola", name="Nicola", language="Italian", gender="M"),
# Brazilian Portuguese
"pf_dora": Voice(id="pf_dora", name="Dora", language="Brazilian Portuguese", gender="F"),
"pm_alex": Voice(id="pm_alex", name="Alex", language="Brazilian Portuguese", gender="M"),
"pm_santa": Voice(id="pm_santa", name="Santa", language="Brazilian Portuguese", gender="M"),
}
def get_all_voices() -> list[Voice]:
"""Get all available voices."""
return list(VOICE_CATALOG.values())
def get_voice(voice_id: str) -> Voice | None:
"""Get a specific voice by ID."""
return VOICE_CATALOG.get(voice_id)
def get_voices_by_language() -> dict[str, list[Voice]]:
"""Get voices grouped by language."""
grouped = {}
for voice in VOICE_CATALOG.values():
if voice.language not in grouped:
grouped[voice.language] = []
grouped[voice.language].append(voice)
return grouped