流式转换流水线
1. 职责与边界
本模块将固定时长的新音频块与会话历史状态结合,组织 VAD、窗口更新、音高处理、内容编码与检索、模型推理、RMS 混合、SOLA 拼接及输出重采样。
主要源码:realtime_vc.py。chunk_vc() 是逐块入口;模型和参考条件的准备见模型与参考音色,跨块状态的归属见会话与状态管理。
2. 输入与输出
| 项目 | 内容 |
|---|---|
| 新音频 | Buffer 提供的单声道浮点 NumPy 数组,使用 SAMPLERATE_IN |
| 会话状态 | 音频窗口、VAD 缓存及标记、音高统计、SOLA 缓冲、首块标记 |
| Worker 资源 | 模型组件、参考条件、派生长度与淡化窗口、输出重采样器 |
| 音频结果 | 原位写入 session.out_data,采样率和长度对应协议输出 |
| 调用返回 | 各处理阶段耗时组成的日志字符串;音频通过 Session 交给路由 |
3. 关键流程
3.1 每块处理顺序
flowchart LR
Input[新音频块] --> VAD[VAD]
VAD --> Window[更新音频窗口]
Window --> F0[按条件提取与调整音高]
F0 --> VC[模型转换或静音分支]
VC --> RMS[按配置混合 RMS 包络]
RMS --> SOLA[按配置执行 SOLA]
SOLA --> Output[按需重采样并写入输出块]入口按保存开关记录输入,执行上述阶段后按开关记录输出;每块重置阶段耗时记录。RMS 与 SOLA 的开关分别是 rms_mix_rate < 1 和 is_sola。
3.2 VAD 与上下文窗口
VAD 使用本次音频和 session.vad_cache 更新语音标记。检测到语音时,预处理将整个输入窗口向前移动一个块;未检测到语音时,只滚动 extra_frame_ce 之后的区域,保留此前的编码器上文。新块始终填入窗口末端。
窗口长度由编码器上文、SOLA 搜索区、SOLA 拼接区、当前块和右侧上下文共同组成。编码器上文由 extra_time_ce 控制,DiT 上文由 extra_time_dit 控制;内容编码后会裁掉二者差值对应的特征帧。
检测到语音或处理首块时执行模型推理。其余块使用会话预分配的静音区域,随后仍按配置执行后处理。语音结束的延后标记在块处理末尾应用;首块完成后清除首块标记。
3.3 音高、内容条件与模型推理
开启 is_f0 且检测到语音时,流水线从当前窗口提取 F0。源音高统计在前 total_block_for_f0 个进入该分支的块中累积,并仅取当前块区域以避免重复计入上下文。有效音高在对数域按源与参考的中位数差值调整,形成长度调节器使用的音高条件。
_vc_infer() 依次执行:
- 内容编码器提取窗口特征。
- 启用检索时,用 FAISS 查找近邻,按距离加权后通过
index_rate与原特征混合。 - 裁去编码器相对 DiT 多出的上文特征,由长度调节器对齐目标长度,并与参考条件拼接。
- DiT/CFM 按
diffusion_steps和引导率生成目标特征,移除参考 Mel 对应部分。 - 声码器生成音频,并从生成窗口中裁取供后处理使用的区域。
CFM 时间步安排和模型依赖由模型与参考音色维护。prod.yaml 当前使用 5 个扩散步,关闭音高和语义检索;不能把可选分支描述成该配置下始终执行的步骤。
3.4 输出区域、RMS 与 SOLA
在模型输出采样率下,return_frame 包含 SOLA 搜索区、拼接区与一个输出块,tail_frame 表示右侧上下文。当前推理代码通过 vc_wave[-return_frame - tail_frame : -tail_frame] 裁取后处理区域,输出不是整个生成窗口。
RMS 混合使用输入窗口中对应区域与生成音频的包络。rms_mix_rate = 0 更接近输入包络,1 保留推理包络并跳过混合;该计算用于检测到语音或首块的情形。
SOLA 在搜索范围内比较当前生成区域与上一块的拼接缓冲,选择对齐偏移后进行交叉淡化,并保存紧接输出块之后的重叠区供下一块使用。由此,相邻块的输出取决于会话历史状态。
最后按需要将后处理结果重采样到 session.ws_sr_out,取前 ws_block_frame_out 个样本写入 session.out_data。协议字节转换和发送由接入层执行。
4. 约束与关联文档
_init_realtime_parameters() 按 FRAMERATE 将上下文、块长和拼接长度换算为样本数,其中存在取整。配置检查要求输入和模型输出采样率均能被帧率整除、编码器上文大于 DiT 上文,并限制 SOLA 缓冲时长不超过 0.08 秒。
Buffer 按输入采样率与毫秒块长取样,流水线另按模型帧率对齐;修改块长、帧率或上下文时需核对两者长度与输出裁剪边界。通过配置检查不代表所有参数组合的音质和运行路径都已经验证。
右侧上下文、SOLA 搜索与拼接区域会影响输出相对新输入的位置。首块还受预填充和首次推理影响,持续播放受网络与客户端缓冲影响;这些因素不能用单次模型执行时间代替。音频格式见音频输入与缓冲,测量方法见评测指南。
当前流程以本专题及源码为准,调参时应固定输入、参考音色和其他条件,记录有效配置并验证连续性、静音恢复及输出时长。