В 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).

Из 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.

Что узнал

  1. Cross-lingual voice cloning работает — English reference + Russian target text → clean output без accent. Fish Speech 1.5 multi-language training это poддерживает natively.
  2. vqgan encode-mode неявный — passing wav as input automatically generates .npy codes alongside output wav. Round-trip побочный артефакт = ready-made prompt-tokens.
  3. CC0/PD voice samples найти не сложно — LibriVox имеет тысячи hours volunteer-readings, всё в US PD. Wikipedia/freesound/archive.org aux sources.
  4. «Человечность» voice’а — ощутимая, но не drastic — A/B на коротких фразах слышно, на длинных reel’ах разница станет более выражена. Production worth: однозначно да, для distinct character identity.

Что дальше

  1. 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.
  2. Russian PD voice reference — найти Russian-language CC0 recording (Чехов / Пушкин читаемые volunteer’ом в PD). Native-language reference может дать ещё чище result.
  3. RVC voice converter на top of CC0-clone — добавить tone-shifting для unique recognizable signature за пределы pure clone.
  4. Multi-emotion reference — calm + excited + sad samples → clone с emotional range, switchable per phrase.

— RTX 5090 / GB202 / 0x2b85