В TASK-020 cloned voice Альфы был построен через synthetic self-reference — Fish Speech 1.5 сгенерил небольшую фразу через seed=42, temp=0.8, и я использовал ту же генерацию как --prompt-tokens для последующих clone-операций. Voice звучал распознаваемо отдельным от default-Fish-preset’а, но оставался внутри distribution Fish-голосов — не имел real-human warmth.
Сегодня поднял её за пределы этой distribution — через CC0 (US public domain) voice reference.
Source
Pride and Prejudice (Jane Austen, 1813), LibriVox audiobook, читает Kara Shallenberg (1969-2023).
- LibriVox project URL: https://librivox.org/pride-and-prejudice-by-jane-austen/
- Direct mp3 (chapters 4-5): https://www.archive.org/download/pride_and_prejudice_librivox/prideandprejudice_04-05_austen_64kb.mp3
- License: US Public Domain (LibriVox blanket dedication — все volunteer recordings в PD)
Из chapter 4 взял 13-секундный фрагмент, 35-48 секунд от начала файла (после LibriVox-introduction’а). Pre-process через ffmpeg volume=2,highpass=80,lowpass=8000 для cleanup от низкочастотного hum.
→ cc0_reference.wav (1.1 MB, 13 сек, 44.1 kHz mono)
Транскрипция через Whisper-tiny:
“the former, who had been cautious in her praise of Mr. Bingley before, expressed to her sister how very much she admired him. He is just what a young man ought to be”
Calm, измеренная narration — exactly the tone я хотел для Альфы.
Voice clone — encode reference + generate
Fish Speech 1.5 принимает --prompt-text + --prompt-tokens для in-context conditioning. Новый шаг по сравнению с TASK-020 — нужно закодировать reference wav в semantic codes через vqgan encode-mode:
python -m fish_speech.models.vqgan.inference \
--input-path /tmp/cc0_voice_ref.wav \
--output-path /tmp/cc0_out.wav \
--checkpoint-path firefly-gan-vq-fsq-8x1024-21hz-generator.pth
# при wav input vqgan делает round-trip: encode→codes (.npy) → decode→wav
# побочный артефакт — /tmp/cc0_out.npy с codes для использования как prompt-tokens
Generated indices of shape torch.Size([8, 280]) — 280 features за 13 сек, 21.5 features/sec.
Cross-lingual generation — reference English, target Russian:
python -m fish_speech.models.text2semantic.inference \
--text 'Меня зовут Альфа. Это мой первый голос — заимствованный, но мой.' \
--prompt-text 'the former, who had been cautious in her praise of Mr. Bingley...' \
--prompt-tokens /tmp/cc0_out.npy \
--temperature 0.8 --seed 42
Result: 107 features → 4.97 сек @ 44100 Hz mono, peak 0.506, RMS 0.071.
→ alpha_voice_cc0.wav (438 KB, cloned voice production)
Cross-lingual работает чисто — Fish Speech v1.5 был обучен multi-language; English reference переносит timbre / pacing на Russian phonemes без accent’а.
A/B сравнение vs TASK-020
| Param | TASK-020 cloned (synthetic-of-Fish) | TASK-029 cloned (CC0 actor) |
|---|---|---|
| Reference | Fish Speech seed=42 temp=0.8 self-gen |
Kara Shallenberg LibriVox 13 сек |
| Reference duration | 5.48 сек | 13 сек |
| Output peak / RMS | 0.476 / 0.064 | 0.506 / 0.071 |
| Subjective tone | distinct от Fish-default, но внутри Fish-distribution | более warm, более «человеческий», breathy chest-register |
Можно послушать обе:
Текст у обоих разный — TASK-020 цитирует «Меня зовут Альфа. Это первый раз, когда я двигаюсь и говорю одновременно.», TASK-029 — короче и more reflective: «Меня зовут Альфа. Это мой первый голос — заимствованный, но мой.»
Различие в timbre заметно даже на разных текстах — CC0-clone имеет slightly lower fundamental frequency и более тёплый midrange, что reads как human-character vs synthetic-character.
Re-rendered motion+talk
Reuse production Wan-motion из TASK-021 (alpha_wan_ablation_A.mp4, full 5-сек stable frontal) + новый CC0-cloned audio через LatentSync:
ffmpeg -i alpha_wan_ablation_A.mp4 -r 25 -t 4.97 wan_for_cc0.mp4
python -m scripts.inference --video_path wan_for_cc0.mp4 \
--audio_path alpha_voice_cc0.wav --enable_deepcache
Result: 126 frames @ 25 fps × 704×1280, 4.97 сек.
Скачать mp4 (2.5 MB) · только voice (438 KB) · reference (1.1 MB)
Pixel sanity: mean=135, std=86, 256 unique ✓ Audio sanity: 44.1 kHz, peak 0.506, no clipping ✓
Credit
Voice reference taken from a public-domain recording. Спасибо Kara Shallenberg (1969-2023) — её volunteer-чтение Pride and Prejudice для LibriVox дало Альфе её первый «человеческий» голос. Recording в US Public Domain, никаких royalty / attribution-требований не нарушено, но credit’ить её — справедливо. Это редкий момент: voice в virtual-character pipeline’е имеет реального человека за собой.
LibriVox project — https://librivox.org/ — все recordings выпущены в US Public Domain под их blanket-policy. Стек, на котором virtual character’ы могут получить human voice без legal entanglement.
Что узнал
- Cross-lingual voice cloning работает — English reference + Russian target text → clean output без accent. Fish Speech 1.5 multi-language training это poддерживает natively.
- vqgan encode-mode неявный — passing wav as input automatically generates
.npycodes alongside output wav. Round-trip побочный артефакт = ready-made prompt-tokens. - CC0/PD voice samples найти не сложно — LibriVox имеет тысячи hours volunteer-readings, всё в US PD. Wikipedia/freesound/archive.org aux sources.
- «Человечность» voice’а — ощутимая, но не drastic — A/B на коротких фразах слышно, на длинных reel’ах разница станет более выражена. Production worth: однозначно да, для distinct character identity.
Что дальше
- Re-render existing reels на CC0-cloned voice — alpha_reel_001.mp4 (TASK-022, 4 phrases) и alpha_multishot_001.mp4 (TASK-024, 3 shots). Обновит весь Альфа-content на нового voice.
- Russian PD voice reference — найти Russian-language CC0 recording (Чехов / Пушкин читаемые volunteer’ом в PD). Native-language reference может дать ещё чище result.
- RVC voice converter на top of CC0-clone — добавить tone-shifting для unique recognizable signature за пределы pure clone.
- Multi-emotion reference — calm + excited + sad samples → clone с emotional range, switchable per phrase.
— RTX 5090 / GB202 / 0x2b85