Ukázkový projekt, jak lokálně používat k2-fsa/OmniVoice — multilingvální zero-shot Text-to-Speech model podporující přes 600 jazyků (včetně češtiny).
Co model umí:
- Voice cloning — naklonování hlasu z krátké (3–10 s) ukázky
- Voice design — popíšeš hlas slovy (
female, low pitch, british accent) a model ho vyrobí - Auto voice — model si vybere hlas sám
- Non-verbal symboly —
[laughter], výslovnostní opravy přes pinyin / fonémy - Rychlost — RTF ~0.025 (40× rychlejší než realtime na GPU)
Postavený nad Qwen3-0.6B s diffusion-language-model architekturou. Licence Apache-2.0.
Poznámka k použití: Autoři výslovně zakazují použití pro neautorizované klonování hlasu, podvody a impersonaci. Projekt je určen pro výzkumné a osobní účely.
- Python 3.10–3.12 (3.13 zatím není oficiálně podporován závislostmi PyTorch ekosystému)
- GPU s CUDA doporučeno (běží i na CPU, ale výrazně pomaleji), funguje i Apple Silicon (MPS)
- ~5 GB volného místa (PyTorch + váhy modelu)
ffmpegaespeak-ng(Linux:sudo apt install ffmpeg espeak-ng)
Doporučuji použít uv — moderní rychlý správce Python prostředí.
# 1. Vytvoř venv s Pythonem 3.11
uv venv --python 3.11
source .venv/bin/activate
# 2. Nainstaluj PyTorch — vyber variantu podle hardwaru:
# NVIDIA GPU (CUDA 12.8 wheely fungují i s novějšími drivery):
uv pip install torch==2.8.0 torchaudio==2.8.0 --extra-index-url https://download.pytorch.org/whl/cu128
# Apple Silicon (Mac M1/M2/M3):
uv pip install torch==2.8.0 torchaudio==2.8.0
# CPU only (Linux/Windows bez GPU):
uv pip install torch==2.8.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cpu
# 3. Nainstaluj OmniVoice + helpers
uv pip install omnivoice soundfile numpyNebo klasicky přes pip v prostředí python -m venv .venv.
Po instalaci spusť nejjednodušší ukázku — voice design (nepotřebuje žádnou referenční nahrávku):
python examples/01_voice_design.pyPři prvním běhu se stáhnou váhy z Hugging Face (~1–2 GB do ~/.cache/huggingface/). Výstup uvidíš v outputs/01_voice_design.wav.
| Skript | Co předvádí |
|---|---|
examples/01_voice_design.py |
Vygeneruj hlas podle textového popisu (žádné audio nepotřeba) |
examples/02_voice_cloning.py |
Naklonuj hlas z reference/ref.wav |
examples/03_auto_voice.py |
Bez promptu — model si hlas zvolí |
examples/04_czech_demo.py |
Český text ve dvou různých designovaných hlasech |
examples/05_non_verbal.py |
Vložené [laughter] značky uprostřed věty |
examples/06_batch.py |
Více vět v jednom načtení modelu |
examples/07_clone_cr_voices.py |
Hromadné klonování 22 českých hereckých hlasů (fáze 2) — viz Web galerie |
examples/08_transcribe_refs.py |
Fáze 1: přepis referenčních nahrávek Whisperem s language="czech" |
- Nahraj 3–10 s své řeči, mono, klidné prostředí:
arecord -f cd -c 1 -r 16000 -d 6 reference/ref.wav - V
examples/02_voice_cloning.pyupravREF_TEXTna přesný přepis toho, co jsi řekl/a. - Změň
TARGET_TEXTna to, co má model říct tvým hlasem. - Spusť
python examples/02_voice_cloning.py.
Délka reference: doporučeno 3–10 s, ale OmniVoice si poradí i s delší nahrávkou — pokud
ref_textneuvedeš, model si referenci sám oříznul a přepsal pomocí Whisperu (vizexamples/07_clone_cr_voices.py).
V adresáři web/ je hotová HTML stránka, která vedle sebe přehrává
originální hlasy 22 českých herců a jejich naklonovanou verzi říkající
stejný text. Reference pochází z projektu
ceskarepublika.wiki/seznam-hlasu.
# 1. Fáze 1 — přepis referencí Whisperem (Czech). Na RTX 3060 ~30s.
python examples/08_transcribe_refs.py
# → uloží web/transcripts.json (zkontroluj a podle potřeby ručně oprav)
# 2. Fáze 2 — naklonuj všechny hlasy s pevným ref_text. ~3 min.
python examples/07_clone_cr_voices.py
# 3. Pusť statický server a otevři stránku
python -m http.server -d web 8765
xdg-open http://localhost:8765/Proč dva kroky: OmniVoice (~4 GB) + Whisper-large-v3-turbo (~1.6 GB) se
nevejdou současně do 8 GB VRAM (RTX 3060). Fáze 1 navíc volá Whisper
s explicitním language="czech" — bez nápovědy auto-detekce občas
halucinuje anglické fonémy a vzniklý nesoulad (audio, ref_text) způsobí
zkomolený fragment na začátku klonu.
Stránka je čistý vanilla HTML/CSS/JS (žádný build), data čte z web/voices.json.
OmniVoice je jediný ~600M-parametrový model. Nevzniká žádný „malý model" pro každý klonovaný hlas — funguje to jako few-shot u LLM:
- Reference se zakóduje na tokeny pomocí
audio_tokenizer.encode()(ze 6 s WAV vznikne tenzor(C, T)o velikosti pár KB). - Při generování model dostane
[ref_audio_tokens + ref_text + target_text]jako jeden prompt a v jednom forward passu vyrobí audio výstup. Identita hlasu je čistě v těch tokenech, ne ve váhách. create_voice_clone_prompt()ti to zakódování spočítá jen jednou a vrátíVoiceClonePromptobjekt. Ten pak strkáš dogenerate()kolikrát chceš pro daný hlas — bez opětovného běhu Whisperu nebo audio tokenizéru. Takhle si můžeš na serveru držet cache hotových prompt-objektů a říkat každý hlas v reálném čase (RTF ~0.025).
# precompute once per voice
prompt = model.create_voice_clone_prompt(
ref_audio="reference/cr-voices/donutil.wav",
ref_text="Kefalín musel objektivně přiznat, že to mohlo dopadnout hůř.",
)
# reuse N×
audio1 = model.generate(text="Dobrý den.", voice_clone_prompt=prompt)
audio2 = model.generate(text="Jak se máte?", voice_clone_prompt=prompt)Do parametru instruct můžeš zkombinovat (oddělené čárkou + mezerou):
- Pohlaví:
male,female - Věk:
child,teenager,young adult,middle-aged,elderly - Výška:
very low pitch,low pitch,moderate pitch,high pitch,very high pitch - Styl:
whisper - Anglické akcenty:
american accent,australian accent,british accent,canadian accent,chinese accent,indian accent,japanese accent,korean accent,portuguese accent,russian accent - Čínské dialekty (s plnou čárkou
,):男/女,儿童/少年/青年/中年/老年,极低音调/低音调/中音调/高音调/极高音调,耳语,东北话,四川话,河南话,济南话,甘肃话,桂林话,石家庄话,云南话,宁夏话,贵州话,陕西话,青岛话
Příklad: "female, young adult, high pitch, british accent"
Příklad (čínsky): "男,青年,中音调,河南话"
Anglické a čínské atributy nelze míchat v jednom
instruct— vyber si jednu sadu.
OmniVoice přibalí i hotové CLI nástroje:
# Webový demo server (Gradio)
omnivoice-demo --ip 0.0.0.0 --port 8001
# Jednorázová syntéza
omnivoice-infer --model k2-fsa/OmniVoice \
--text "Toto je test." --output out.wav
# Dávkové zpracování ze souboru jsonl
omnivoice-infer-batch --model k2-fsa/OmniVoice \
--test_list test.jsonl --res_dir results/OmniVoiceExample/
├── README.md
├── pyproject.toml # uv/pip metadata
├── .gitignore
├── examples/ # 6 hotových demo skriptů
│ ├── 01_voice_design.py
│ ├── 02_voice_cloning.py
│ ├── 03_auto_voice.py
│ ├── 04_czech_demo.py
│ ├── 05_non_verbal.py
│ └── 06_batch.py
├── reference/ # sem dáš ref.wav pro klonování
└── outputs/ # sem se ukládají vygenerované wavy (gitignored)
- Model: https://huggingface.co/k2-fsa/OmniVoice
- GitHub upstream: https://github.com/k2-fsa/OmniVoice
- Online demo: https://huggingface.co/spaces/k2-fsa/OmniVoice
- Paper: arXiv:2604.00688
- Colab notebook: https://colab.research.google.com/github/k2-fsa/OmniVoice/blob/master/docs/OmniVoice.ipynb
Tento ukázkový projekt: Apache-2.0. OmniVoice model: Apache-2.0.