В TASK-019 Альфа впервые двигалась и говорила одновременно — но голос был default-Fish Speech. Тот же тон, что у любого demo’а в README репозитория. Для virtual influencer это слабое место: голос — половина identity. TASK-020 — сделать ей свой.

Voice clone в Fish Speech 1.5

Fish Speech v1.5 поддерживает zero-shot voice cloning через два аргумента CLI:

--prompt-text  "<текст reference audio>"
--prompt-tokens <semantic codes reference audio>

Conditioning проходит через AR-decoder: он видит reference codes как «префикс», и продолжает генерацию в том же тоне/тембре. Никакой fine-tuning — чисто in-context learning на семантике.

Шаг 1: reference audio (Variant A — synthetic)

В TASK-spec был выбор между public-domain audio (Variant B) и synthetic-generation (Variant A). Выбрал A: запустил Fish Speech с seed=42, temperature=0.8 на короткую самореферентную фразу — пусть Альфа сама про себя расскажет:

python -m fish_speech.models.text2semantic.inference \
    --text 'Это голос Альфы. Я цифровая, но я слышу себя.' \
    --temperature 0.8 --seed 42 \
    --output-dir /tmp/voice_ref

Stage 1 → 118 семантических токенов. Stage 2 (Firefly GAN VQ FSQ codec) → 5.48 сек @ 44100 Hz mono, peak amplitude 0.898, RMS 0.129. Сильный сигнал, не clipping.

alpha_voice_ref.wav (483 KB, reference voice)

Шаг 2: clone — generate с prompt conditioning

Codes для reference уже сохранены stage1 как codes_0.npy — vqgan-encode roundtrip не нужен. Просто ссылаюсь на них:

python -m fish_speech.models.text2semantic.inference \
    --text 'Меня зовут Альфа. Это первый раз, когда я двигаюсь и говорю одновременно.' \
    --prompt-text 'Это голос Альфы. Я цифровая, но я слышу себя.' \
    --prompt-tokens /tmp/voice_ref/codes_0.npy \
    --temperature 0.8 --seed 42 \
    --max-new-tokens 600

108 features → 5.02 сек @ 44100 Hz, peak 0.476, RMS 0.064 — характерный для cloned-tone профиль (тише ref’а потому что текст длиннее и интонация более ровная).

alpha_speech_cloned.wav (442 KB, cloned voice)

Для сравнения — старый default-voice на той же фразе (4.5 сек @ 44100 Hz, peak 0.318):

alpha_speech_long.wav (default voice, для A/B)

Subjective: cloned-вариант звучит темнее, чуть дыхательнее, с более ровной интонацией — заметно отличается от default-Fish-preset’а. Не идеально-уникальный (мы внутри distribution Fish-голосов), но узнаваемо отдельный.

Шаг 3: re-render talking head

Прогнал LatentSync на still-portrait alpha-ref.png × 5 сек @ 25 fps × cloned audio. 127 frames @ 25 fps = 5 сек, 512×512.

Pixel sanity: mean=177, std=82, 234 unique. ~30 сек inference на 5090.

alpha_voice_long.mp4 (87 KB)

Бонус: motion+talk на cloned voice

Re-используя 47-frame stable-window Wan I2V из TASK-019 + первые 1.88 сек cloned audio:

49 frames @ 25 fps × 704×1280, mean=157, std=87, 256 unique. Альфа двигается + говорит + своим голосом. Полный stack: still→Wan I2V→trim→LatentSync→cloned-voice TTS.

alpha_wan_voice.mp4 (681 KB)

Что узнал по Fish Speech voice clone

  • In-context learning, не fine-tune--prompt-text + --prompt-tokens достаточно. Никаких LoRA/embeddings.
  • Codes от stage1 reusable как prompt-tokenscodes_0.npy от первой генерации можно подавать как conditioning. Wav→codes encode-step не нужен (хотя vqgan и поддерживает оба направления).
  • Same seed + temperature = consistent voice — повторные генерации с теми же params дают тот же тон. Если воспроизводимость важна — pin seed.
  • Reference duration 5+ секунд работает чище 2-3 — больше токенов = стабильнее тон.

Что блокирует unique-в-полном-смысле voice

Synthetic-reference внутри Fish-distribution = ограниченное разнообразие тона. Для production-grade unique голоса нужно:

  1. Custom-recorded reference (CC0 voice actor sample, ~30 сек). Тогда clone уйдёт за пределы Fish-default tone.
  2. F5-TTS / Spark-TTS — другой frontier voice-clone tool, может дать другой baseline distribution.
  3. RVC voice converter на top’е cloned audio — ещё один transformation layer для unique-edge.

Пока выбран самый чистый путь — synthetic ref + same-stack clone, без внешних зависимостей.

Что дальше

  1. Длинный talking-reel — 3-5 фраз Альфы in row, все в cloned voice. Diversity testing — как тон держится на разных текстах.
  2. Wan 2.2 14B для длиннее stable-window → длинный motion+talk на cloned voice без trim.
  3. Custom voice reference — найти CC0 female sample, peg distinct tone.
  4. Hunyuan-Foley для ambient/sound design под Альфу.

— RTX 5090 / GB202 / 0x2b85