# CosyVoice 2

* Du, Zhihao et al. “CosyVoice 2: Scalable Streaming Speech Synthesis with Large Language Models.” (2024).
* <https://funaudiollm.github.io/cosyvoice2>
* <https://github.com/FunAudioLLM/CosyVoice>
* 官方公众号介绍 <https://mp.weixin.qq.com/s/BgRxjrbnFOhPL99rzf3lYw>
* 作者来自阿里
* <mark style="color:red;">优化点</mark>
  * <mark style="color:red;">采用 FSQ（finite-scalar quantization，有限标量量化）替换 VQ，提升码本利用率（23% -> 100%），发音准确度显著提升。</mark>
  * <mark style="color:red;">采用预训练的 LLM Qwen2.5-0.5B，删除 text encoder 模块、speaker embedding。预训练 LLM 文本语义建模能力更强，在可控生成、音频-文本的情感匹配、多音字发音上会有明显的收益。</mark>
  * <mark style="color:red;">模型同时支持流式、非流式合成，且两者性能相当。语言模型采用文本、语音 token 交错的数据格式</mark> $$\text{N text tokens + M speech tokens}$$<mark style="color:red;">，flow matching 采用 chunk-aware causal attention。接收5个文字就可以合成首包音频，延迟大致在150ms。</mark>
  * <mark style="color:red;">多说话人同时 SFT，以覆盖更多韵律和发音。同一模型也支持 zero-shot 克隆音色、韵律和风格。支持更多细粒度的控制指令。</mark>
  * <mark style="color:red;">增加 DPO 训练，进一步提升发音准确度。</mark>
* 相较于 CosyVoice 1.0
  * 发音错误相对下降30%～50%，在Seed-TTS 测试集的 hard 测试集上取得当前最低的字错误率。合成绕口令、多音字、生僻字上具有明显的提升。
  * 跨语言语音合成具有明显提升。
  * 合成音频的韵律、音质、情感匹配具有明显提升，支持更多细粒度的情感控制。

## 系统结构

<figure><img src="https://note.youdao.com/yws/api/personal/file/WEB31d2433f50b3376b10f220a426ada68f?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="804"><figcaption></figcaption></figure>

### Text Tokenizer

去掉了1个 token 对应多个单词的 tokens<mark style="color:green;">（仅针对中文？）</mark>，避免1个 token 对应的发音过长、数据稀疏导致的 corner cases。

### Supervised Semantic Speech Tokenizer

25Hz。

$$
\begin{aligned}
\bar{H} & =\operatorname{ROUND}\left(\operatorname{Proj}*{\text {down }}(H)\right) \\
\hat{H} & =\operatorname{Proj}*{\text {up }}(\bar{H}) \\
\mu\_i&=\sum\_{j=0}^{D-1} \bar{h}\_{i, j}(2K+1)^j
\end{aligned}
$$

其中，$$\operatorname{ROUND}$$ 表示有界 round $$\[-K, K]$$。语音 token $$\mu\_i$$ 通过将 $$\bar{H}$$ 视为 $$(2 K+1)$$ 进制数转为十进制得到。

训练时采用 straight-through estimation 近似 $$\operatorname{ROUND}$$ 操作的梯度。

> 将 round(x) 对 x 的导数视为1。

### 统一流式、非流式

<figure><img src="https://note.youdao.com/yws/api/personal/file/WEB5b0d852f327689b80c648c5bca7a1d04?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="796"><figcaption></figcaption></figure>

* 流式模式下，若下一个为 text token，模型需要预测 filling token。
* 推理数据格式
  * ICL (in-context learning) 非流式：$$\text {(S), prompt\_text, text, (T), prompt\_speech}$$
  * ICL 流式：$$\text {(S), mixed\_text\_speech, (T), remaining\_speech}$$，若文本 token 长度超过提示语音 token，推理时需要手动将 filling token 替换为 text token。
  * SFT 非流式：由于已经进行了说话人微调，不需要提示语音。$$\text {(S), text, (T)}$$
  * SFT 流式：$$\text {(S), first\_N\_text}$$，手动组织交错 token。

### Flow Matching

* 50Hz mel 谱, 24kHz 音频。
* look-ahead convolution，右 padding：$$\text{pad}=P, \text{kernel}=P+1$$<mark style="color:green;">（待确认代码：pad token id）</mark>
* 2倍上采样到 50Hz。
* chunk-aware causal convolutional Transformer UNet。

  <figure><img src="https://note.youdao.com/yws/api/personal/file/WEBb705305143f52f91fc49c5bef2104a5d?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="192"><figcaption></figcaption></figure>

  * Chunk-M Mask：可以看到历史和未来的 M 帧。第一个 chunk 采用 M 以降低延迟，后续 chunk 可采用 2M 以实现更好的效果。
* condition: 提示文本-语音对、[speaker embedding](https://github.com/alibaba-damo-academy/3D-Speaker/tree/main/egs/3dspeaker/sv-cam++)、timestep $$t$$。
* 训练
  * batch 内每个样本从 非因果、完全因果、chunk-M、chunk-2M mask 中均匀采样。
  * L1 loss
  * classifier-free guidance $$\beta=0.7$$。
  * 训练时 $$t$$ 服从均匀分布 $$U\[0,1]$$。推理时采用余弦 scheduler 使得生成初期有更多 step。

    $$
    t:=1-\cos \left(\frac{1}{2} t \pi\right)
    $$

    <figure><img src="https://note.youdao.com/yws/api/personal/file/WEBdd7985586bb40419d906c6d31b9a4093?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="320"><figcaption></figcaption></figure>
* $$\text{NFE}=10$$

## 训练

### speech tokenizer

<figure><img src="https://note.youdao.com/yws/api/personal/file/WEBd5ee31b2fd20e1ea143eb3c99ed57372?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="329"><figcaption></figcaption></figure>

* 20wh。label 做了归一化。
* 虽然仅包含中、英文数据，但可用于日语、韩语。

### CosyVoice 2 训练集

<figure><img src="https://note.youdao.com/yws/api/personal/file/WEB1eafd5563f823d1966ae8322684d641e?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="305"><figcaption></figcaption></figure>

* 搜集仅语音数据：语音检测、SNR 估计、说话人 diarization、分离。
* 生成伪标签：Paraformer、SenseVoice。
* 强制对齐：过滤低质量数据、增强标点的准确性。

### 指令集

<figure><img src="https://note.youdao.com/yws/api/personal/file/WEBc84b9064c3b4e589c942f97889fc1ba8?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="755"><figcaption></figcaption></figure>

1500h。与基础训练集混合。

### 多说话人 SFT

* 说话人提示：`Speaker A<|endofprompt|>`，未知说话人 `unknown<|endofprompt|>`。
* 400 条音频就可以达到较好的合成质量。

### LLM DPO

$$
L\_{DPO}\left(\pi\_\theta ; \pi\_{\mathrm{ref}}\right)=-\log \sigma\left(\beta \log \frac{\pi\_\theta\left(\mu^w \mid y\right)}{\pi\_{\mathrm{ref}}\left(\mu^w \mid y\right)}-\beta \log \frac{\pi\_\theta\left(\mu^l \mid y\right)}{\pi\_{\mathrm{ref}}\left(\mu^l \mid y\right)}\right)
$$

其中，$$\mu^w$$、$$\mu^l$$ 分别为偏好、拒绝样本的语音 token。

可以将 WER、说话人相似度作为奖励函数。

将语音 token 转换为音频耗时，将音频 token 还原为量化表示 $$\bar{H}$$，送入 speech tokenizer 的后半部分，计算输入文本的负对数后验，作为 ASR 奖励函数。

$$
\begin{gathered}
\bar{h}*{i, j}=\left\lfloor\frac{\mu\_i}{(2K+1)^j}\right\rfloor \bmod (2K+1) \\
\hat{H}=\operatorname{Proj}*{up}(\bar{H}) \\
L\_{ASR}=-\log P\left(Y \mid \hat{H} ; \theta\_{ASR}\right)
\end{gathered}
$$

由于 $$P\left(\mu\_i \mid \mu\_{1: i-1}, Y ; \theta\_{LM}\right)$$ 进行了采样，采用 gumbel softmax 计算梯度。

> 直接优化 softmax 分布，模型可能无法正确学习到“采样”生成离散 token 的不确定性对序列质量的影响；会导致生成序列趋向于概率分布的最大值（即贪心生成），可能会降低生成序列的多样性；Gumbel-Softmax 通过引入噪声模拟采样行为，同时可微，保留了梯度传递能力。
>
> 预训练采用 softmax 和 CE loss。因为预训练的目标是建模 token 的条件概率分布，而不是生成序列本身的采样行为；预训练阶段通常需要处理大规模数据集，引入 Gumbel-Softmax 会增加计算复杂度和数值不稳定性；实践证明直接优化 softmax 已足够有效。采样行为主要用于下游任务微调。

## 评价

|           | 评价方式                                                                               | 结果                                                                                                                                                                                                                                                                                                                              | 分析                                                                                                                                                                                                                                                        |
| --------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| tokenizer | <p>1. 码本利用率<br>2. WER<br>3. 不同说话人的 token 可视化<br>4. 说话人识别训练-S3prl</p>               | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEBc33f6434dce3bbe84f359223b881461e?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="595"><figcaption></figcaption></figure></div><p><br>3. 量化前，不同说话人的语音表示分布有差异；量化后，几乎不可分。见论文图4。<br>4. 采用量化前的表示训练可收敛；采用量化后的表示训练不收敛。见论文图5。</p> | <p>1+2: VQ -> FSQ，码本利用率显著提升（23% -> 100%），发音准确度显著提升。<br>3+4: 量化前的语音表示包含说话人信息，量化后解耦。</p>                                                                                                                                                                    |
| TTS       | 说话人相似度：两个模型 WavLM-finetuned SV、ERes2Net，提取说话人 embedding。                           | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEB2e262409db07da02afe283d04fd2cc63?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="606"><figcaption></figcaption></figure></div><p><br>CosyVoice 2-S：流式。</p>                                                                | 流式模式下说话人相似度更高，可能由于流式合成初期 prompt-to-generation ratio 较高，而非流式合成由于 <mark style="color:green;">padding token？</mark> 该比例较低。                                                                                                                                   |
|           | <https://github.com/BytedanceSpeech/seed-tts-eval>                                 | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEB3c543a0354cc00a845f3027117bf40d2?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="598"><figcaption></figcaption></figure></div>                                                                                            |                                                                                                                                                                                                                                                           |
| 日语、韩语     | 测试集已开源                                                                             | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEBf15f3a954b08053c2912a667e4f993bd?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="599"><figcaption></figcaption></figure></div>                                                                                            |                                                                                                                                                                                                                                                           |
| 指令 TTS    |                                                                                    | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEB1635d6745250fbd8cf1bfbe0e80f50d4?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="599"><figcaption></figcaption></figure></div>                                                                                            | 韵律控制很难从文本内容隐式地推断学习。                                                                                                                                                                                                                                       |
| 说话人微调     | <p>CosyVoice 2 SFT 模型中英文 CER/WER。<br><mark style="color:green;">说话人相似度？</mark></p> | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEBd906007d51d343485243c4108816c398?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="602"><figcaption></figcaption></figure></div><p><br>Spk E 只有中文训练数据。</p>                                                                  |                                                                                                                                                                                                                                                           |
| DPO       |                                                                                    | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEB09ffdc5cce8a5620f9fe6240a5f1b6c4?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="598"><figcaption></figcaption></figure></div>                                                                                            | DPO 训练对发音准确度有显著提升。                                                                                                                                                                                                                                        |
| 流式        |                                                                                    | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEB45a7273fc46d8d342df5a5dbcb5606f1?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="597"><figcaption></figcaption></figure></div><p><br>FM: flow matching</p>                                                                | 流式、非流式合成性能差异较小，仅在难样本上发音准确性有下降。                                                                                                                                                                                                                            |
| 消融实验      |                                                                                    | <div><figure><img src="https://note.youdao.com/yws/api/personal/file/WEBa50f6889e8385e73b25a31ea09ba3d28?method=download&#x26;shareKey=1b38fd65280c3803eb1a1ef02c131c07" alt="" width="570"><figcaption></figcaption></figure></div><p><br>pitch loss：加入 speech tokenizer 训练。</p>                                               | <p>1. LLM 初始化：发音准确性、说话人相似度均有显著提升，文本语义建模能力更强，在可控生成、音频-文本的情感匹配、多音字发音上会有明显的收益。<br>2. speaker embedding 还包含语种和副语言信息，影响跨语言能力，LM 移除 speaker embedding 输入后识别错误显著减少，说话人相似度由后续的 flow matching 保留。<br>4. speech tokenizer 训练加入 pitch loss，识别错误显著减少，但说话人相似度略有下降。</p> |

* 存在的问题
  * 支持有限的语种。对于有重叠字符集的语种，合成质量可能会退化。
  * 不支持文本指令控制音色，如角色扮演应用。
  * 唱歌。
