CosyVoice3

Fun-CosyVoice3-0.5B — это потоковая модель синтеза речи с поддержкой 9 языков. Она использует пайплайн из трёх этапов — генерация токенов LLM, DiT flow matching и вокодинг HiFi-GAN — чтобы получать естественную речь 24 кГц из входного текста. Модель — также пишется как CosyVoice 3 — является новейшей в семействе CosyVoice от FunAudioLLM.

Поддерживаемые языки

ЯзыкКод
Китайскийchinese
Английскийenglish
Японскийjapanese
Корейскийkorean
Немецкийgerman
Испанскийspanish
Французскийfrench
Итальянскийitalian
Русскийrussian

Пайплайн

CosyVoice3 синтезирует речь в три этапа:

  1. LLM — Qwen2.5-0.5B в качестве основы генерирует FSQ-токены речи (Finite Scalar Quantization) из текста
  2. DiT Flow Matching — 22-слойный Diffusion Transformer преобразует речевые токены в мел-спектрограммы через интегрирование Euler ODE
  3. HiFi-GAN — вокодер Neural Source Filter превращает мел-спектрограммы в сигнал 24 кГц

Архитектура

LLM (Qwen2.5-0.5B)

Языковая модель авторегрессивно генерирует дискретные речевые токены. Среда исполнения поставляется в четырёх квантизационных вариантах — 4-битный, 8-битный, 8-bit-full (int8 LLM + int8 DiT) и bf16 (без квантизации) — выбираемых через --cosyvoice-variant.

ПараметрЗначение
Слои24
Скрытая размерность896
Query-головы14
Key/Value-головы2 (GQA)
FSQ-словарь6561
Квантизация4-bit

DiT Flow Matching

Diffusion Transformer уточняет речевые токены до мел-спектрограмм с помощью условного flow matching и classifier-free guidance.

ПараметрЗначение
Слои22
Размерность1024
Головы внимания16
КондиционированиеAdaLN (Adaptive Layer Norm)
ODE-решательEuler, 10 шагов
Коэффициент CFG0.7

Вокодер HiFi-GAN

Вокодер Neural Source Filter (NSF), преобразующий мел-спектрограммы в сигнал.

ПараметрЗначение
Гармоники8
Коэффициент апсемпла480× (8 × 5 × 3 × ISTFT 4)
ISTFTn_fft=16, hop=4
Частота дискретизации на выходе24 кГц

Веса модели

ВариантLLMDiTРазмерHuggingFace
4bit (по умолчанию)int4, group=64bf16~1.2 ГБaufklarer/CosyVoice3-0.5B-MLX-4bit
8bitint8, group=64bf16~1.4 ГБaufklarer/CosyVoice3-0.5B-MLX-8bit
8bit-fullint8, group=64int8, group=64~1.6 ГБaufklarer/CosyVoice3-0.5B-MLX-8bit-full
bf16bf16bf16~2.1 ГБaufklarer/CosyVoice3-0.5B-MLX-bf16

Каждый бандл включает LLM, DiT-декодер flow matching, вокодер HiFi-GAN и эталонный энкодер S3-Tokenizer, нужный для zero-shot клонирования голоса. Меньшие бандлы — меньше загрузка и диск; выбирайте bf16, когда квантизационный шум LLM/DiT становится проблемой (длинная форма, верность клонирования).

Использование CLI

.build/release/speech speak "Hallo Welt" --engine cosyvoice --language german -o output.wav

Примеры

# Английский
.build/release/speech speak "Hello, how are you?" --engine cosyvoice -o hello_en.wav

# Китайский
.build/release/speech speak "你好世界" --engine cosyvoice --language chinese -o hello_cn.wav

# Испанский
.build/release/speech speak "Hola, buenos días" --engine cosyvoice --language spanish -o hello_es.wav

# Французский
.build/release/speech speak "Bonjour le monde" --engine cosyvoice --language french -o hello_fr.wav

Клонирование голоса

Клонируйте любой голос из короткого референсного аудиофрагмента с помощью флага --voice-sample. CosyVoice3 использует эмбеддер диктора CAM++, чтобы извлечь 192-мерный вектор, который кондиционирует DiT-модель потока.

# Клонирование голоса
.build/release/speech speak "Hello in your voice" --engine cosyvoice --voice-sample reference.wav -o cloned.wav

# Кросс-языковой режим: клонировать голос, говорить по-немецки
.build/release/speech speak "Guten Tag" --engine cosyvoice --voice-sample reference.wav --language german -o german.wav

Как это работает

  1. Эмбеддер диктора CAM++ извлекает 192-мерный вектор из референсного аудио через CoreML (Neural Engine)
  2. Аффинная проекция (192 → 80) кондиционирует декодер DiT flow matching на целевом голосе
  3. Вокодер HiFi-GAN преобразует кондиционированную на дикторе мел-спектрограмму в аудио 24 кГц

Эмбеддер диктора

СвойствоЗначение
МодельCAM++ (Context-Aware Masking++)
Эмбеддинг192 измерения
БэкендCoreML (Neural Engine, FP16)
Размер~14 МБ
HuggingFaceaufklarer/CamPlusPlus-Speaker-CoreML

Модель CAM++ скачивается автоматически при первом использовании --voice-sample. Рекомендации по референсному аудио и Swift API см. в руководстве Клонирование голоса.

Многоголосый диалог

Синтезируйте диалог между несколькими дикторами, используя инлайновые теги спикеров. Каждому спикеру назначается голос из референсного аудио через флаг --speakers.

# Диалог на двух спикеров с клонированием голоса
.build/release/speech speak "[S1] Hello there! [S2] Hey, how are you?" \
    --engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o dialogue.wav

# Три спикера
.build/release/speech speak "[A] Welcome. [B] Thanks! [C] Glad to be here." \
    --engine cosyvoice --speakers a=host.wav,b=guest1.wav,c=guest2.wav -o panel.wav

Имена спикеров в тегах не чувствительны к регистру и сопоставляются с ключами маппинга. Между репликами вставляется настраиваемая пауза (по умолчанию 0.2 с).

ОпцияПо умолчаниюОписание
--speakersМаппинг спикеров: s1=file.wav,s2=file.wav
--turn-gap0.2Пауза между репликами (в секундах)
--crossfade0.0Кроссфейд-перекрытие между репликами (в секундах)

Теги эмоций и стиля

Управляйте стилем речи для каждого сегмента через инлайновые теги эмоций. CosyVoice3 использует текстовый префикс перед токеном <|endofprompt|> как инструкцию стиля — теги эмоций маппятся в инструкции на естественном языке, которые заменяют этот префикс.

# Теги эмоций
.build/release/speech speak "(excited) Wow, amazing! (sad) But I have to go..." \
    --engine cosyvoice -o emotion.wav

# Вместе со спикерами
.build/release/speech speak "[S1] (happy) Great news! [S2] (surprised) Really?" \
    --engine cosyvoice --speakers s1=alice.wav,s2=bob.wav -o combined.wav

# Произвольная инструкция в виде тега
.build/release/speech speak "(Speak like a pirate) Ahoy matey!" \
    --engine cosyvoice -o pirate.wav

# Глобальная инструкция (применяется ко всем сегментам без эмо-тегов)
.build/release/speech speak "Hello world" \
    --engine cosyvoice --cosy-instruct "Speak cheerfully" -o cheerful.wav

Встроенные теги эмоций

ТегИнструкция
happy / excitedSpeak happily and with excitement.
sadSpeak sadly with a melancholic tone.
angrySpeak with anger and intensity.
whispers / whisperingSpeak in a soft, gentle whisper.
laughs / laughingSpeak while laughing.
calmSpeak calmly and peacefully.
surprisedSpeak with surprise and amazement.
seriousSpeak in a serious, formal tone.

Неизвестные теги передаются как произвольные инструкции, поэтому (Speak in a slow, dramatic voice) работает как есть.

Управляющие токены модели (токены fl_)

Внутри LLM CosyVoice3 использует специальные управляющие токены — с префиксом fl_ — для переключения между режимами (нулевое клонирование, синтез по инструкции, сохранение говорящего и т. д.). Эти токены являются частью вышестоящего токенизатора FunAudioLLM; среда выполнения Soniqo автоматически выпускает нужный токен в зависимости от используемого вами флага CLI или вызова Swift API, поэтому вы никогда не пишете их вручную.

Управляющий токенРежимКак вызвать из Soniqo
<|fl_speaker_clone|>Нулевое клонирование голоса из эталонной аудиозаписиПередайте --voice-sample reference.wav в CLI или установите voiceSample: в Swift API.
<|fl_speaker_instruct|>Синтез с условием на инструкцию или стиль на голосе по умолчаниюПередайте --cosy-instruct "Speak cheerfully" или используйте встроенный тег (happy) без --voice-sample.
<|fl_speaker_instruct2|>Синтез по инструкции в сочетании с клонированным эталонным голосомВ одном вызове объедините --voice-sample reference.wav с --cosy-instruct "..." (или встроенным эмоциональным тегом).
<|fl_save_speaker|>Сохраняет эмбеддинг говорящего для повторного использования без перекодирования эталонного аудио при каждом вызовеНе экспонируется напрямую в Soniqo CLI — эмбеддинги вычисляются на каждый вызов. Для кеширования извлеките 192-мерный вектор CAM++ самостоятельно через модуль Эмбеддинги говорящего и передавайте его далее.
<|fl_speaker_clone_zh|>, <|fl_speaker_clone_en|>, …Языко-специфичные подсказки нулевого клонирования, используемые вышестоящим токенизаторомОбъедините --voice-sample с --language german|spanish|chinese|.... Soniqo выбирает правильную языковую подсказку из флага --language.
Если вы переносите код из FunAudioLLM/CosyVoice

Таблица выше сопоставляет каждый вышестоящий управляющий токен fl_ с его эквивалентом в Soniqo. Вам никогда не нужно вставлять токены fl_ в ваш промпт самостоятельно — передавайте высокоуровневые флаги CLI или аргументы Swift API, и среда выполнения выпустит правильную последовательность: clone → instruct → instruct2 → save_speaker.

Сэмплирование

Этап LLM использует следующую конфигурацию сэмплирования:

ПараметрЗначение
Top-k25
Top-p0.8
Repetition Aware SamplingВключено (window=10, tau_r=0.1)

Repetition Aware Sampling (RAS) из VALL-E 2 штрафует токены, которые встречались в последних 10 сгенерированных токенах. Это предотвращает повторяющиеся аудиоартефакты и повышает стабильность вывода.

Производительность

На M2 Max CosyVoice3 показывает RTF около 0.5 — быстрее реального времени.

ЭтапЗадержка
LLM (скомпилированный)~13 мс/токен
DiT Flow Matching370 – 520 мс
HiFi-GAN50 – 170 мс
Компиляция

Этап LLM использует compile(shapeless: true) для авторегрессивного цикла, что исключает накладные расходы на перекомпиляцию при переменной длине последовательности. Batch-doubled CFG уменьшает число прямых проходов DiT с 20 до 10.