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 синтезирует речь в три этапа:
- LLM — Qwen2.5-0.5B в качестве основы генерирует FSQ-токены речи (Finite Scalar Quantization) из текста
- DiT Flow Matching — 22-слойный Diffusion Transformer преобразует речевые токены в мел-спектрограммы через интегрирование Euler ODE
- 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 шагов |
| Коэффициент CFG | 0.7 |
Вокодер HiFi-GAN
Вокодер Neural Source Filter (NSF), преобразующий мел-спектрограммы в сигнал.
| Параметр | Значение |
|---|---|
| Гармоники | 8 |
| Коэффициент апсемпла | 480× (8 × 5 × 3 × ISTFT 4) |
| ISTFT | n_fft=16, hop=4 |
| Частота дискретизации на выходе | 24 кГц |
Веса модели
| Вариант | LLM | DiT | Размер | HuggingFace |
|---|---|---|---|---|
4bit (по умолчанию) | int4, group=64 | bf16 | ~1.2 ГБ | aufklarer/CosyVoice3-0.5B-MLX-4bit |
8bit | int8, group=64 | bf16 | ~1.4 ГБ | aufklarer/CosyVoice3-0.5B-MLX-8bit |
8bit-full | int8, group=64 | int8, group=64 | ~1.6 ГБ | aufklarer/CosyVoice3-0.5B-MLX-8bit-full |
bf16 | bf16 | bf16 | ~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
Как это работает
- Эмбеддер диктора CAM++ извлекает 192-мерный вектор из референсного аудио через CoreML (Neural Engine)
- Аффинная проекция (192 → 80) кондиционирует декодер DiT flow matching на целевом голосе
- Вокодер HiFi-GAN преобразует кондиционированную на дикторе мел-спектрограмму в аудио 24 кГц
Эмбеддер диктора
| Свойство | Значение |
|---|---|
| Модель | CAM++ (Context-Aware Masking++) |
| Эмбеддинг | 192 измерения |
| Бэкенд | CoreML (Neural Engine, FP16) |
| Размер | ~14 МБ |
| HuggingFace | aufklarer/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-gap | 0.2 | Пауза между репликами (в секундах) |
--crossfade | 0.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 / excited | Speak happily and with excitement. |
sad | Speak sadly with a melancholic tone. |
angry | Speak with anger and intensity. |
whispers / whispering | Speak in a soft, gentle whisper. |
laughs / laughing | Speak while laughing. |
calm | Speak calmly and peacefully. |
surprised | Speak with surprise and amazement. |
serious | Speak 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. |
Таблица выше сопоставляет каждый вышестоящий управляющий токен fl_ с его эквивалентом в Soniqo. Вам никогда не нужно вставлять токены fl_ в ваш промпт самостоятельно — передавайте высокоуровневые флаги CLI или аргументы Swift API, и среда выполнения выпустит правильную последовательность: clone → instruct → instruct2 → save_speaker.
Сэмплирование
Этап LLM использует следующую конфигурацию сэмплирования:
| Параметр | Значение |
|---|---|
| Top-k | 25 |
| Top-p | 0.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 Matching | 370 – 520 мс |
| HiFi-GAN | 50 – 170 мс |
Этап LLM использует compile(shapeless: true) для авторегрессивного цикла, что исключает накладные расходы на перекомпиляцию при переменной длине последовательности. Batch-doubled CFG уменьшает число прямых проходов DiT с 20 до 10.