☰
VCClient 实时语音变声:五层管线如何压进 50ms 延迟
2026/10/30 1:43:52 网站建设 项目流程

VCClient 实时语音变声:五层管线如何压进 50ms 延迟

【免费下载链接】voice-changerリアルタイムボイスチェンジャー Realtime Voice Changer项目地址: https://gitcode.com/gh_mirrors/vo/voice-changer

🔊 真声不能出麦的场景

你在游戏里不想暴露真声,直播需要一个稳定的角色声线?VCClient 做实时语音变声:麦克风话音流经 AI 模型推理,几十毫秒后从声卡出来的是目标角色的声音。它不做离线批处理,只服务"边说边变"的场景:游戏开黑、直播、语音聊天,延迟和稳定性要求直接写进了源码。它同时支持 RVC、Beatrice、MMVC、so-vits-svc、DDSP-SVC 等多类模型,也允许把推理整体卸载到远程服务器,本机只留采集与播放。

⚡ 五步跑起来

这是最精简的 VCClient 部署路径。环境要求一句话:Python 3.10 + PyTorch;Linux/WSL2 从源码运行,Windows 与 M1 Mac 有现成二进制可下载。

git clone https://gitcode.com/gh_mirrors/vo/voice-changer cd voice-changer conda create -n vc python=3.10 && conda activate vc cd server && pip install -r requirements.txt python3 MMVCServerSIO.py -p 18888 --model_dir model_dir
  1. 克隆仓库(命令如上)。
  2. 装完依赖启动 server/MMVCServerSIO.py,首次运行会自动下载预训练权重和样例模型。
  3. 按控制台提示在浏览器(仅 Chrome)打开客户端 URL;或直接用自带 Python 客户端:python client/python/vc_client.py --input 0 --output 1 --to 0。
  4. 在界面里选中模型槽、点 start,对着麦克风说话。

首次预期结果:权重下载完成后浏览器出现客户端界面,扬声器播出换过音色的声音,界面上能看到 vol/buff/res 三项延迟读数。

架构鸟瞰:谁推理,谁传输

整体是"一个服务端 + 可替换的模型层 + 两层协议"。入口 server/MMVCServerSIO.py 用 uvicorn 把 FastAPI(REST)和 Socket.IO 挂在同一端口上。音频进来后,VoiceChangerManager按模型槽类型分发:v2 引擎负责 RVC、Beatrice、LLVC、EasyVC、DiffusionSVC,v1 引擎负责 MMVCv13/v15、so-vits-svc-40、DDSP-SVC。双引擎共存,这正是新旧版本能同时启动的原因。每种模型一个目录,全部在 server/voice_changer/ 下;前端 demo 在 client/demo/,参考客户端在 client/python/vc_client.py,语料录音工具独立放在 recorder/。

能力矩阵:edition 与模型怎么选

自 v2.2.1 起,发行版(edition)决定能跑哪些模型。选错版本会直接缺功能,先看这张表再下载:

能力维度选项适用场景限制说明
AI 模型RVCv2 主线新功能(快捷键、缓冲可视化)基本只加给它
AI 模型Beatrice v1 / v2v1 仅旧版 Windows;v2 全 editionv2 是当前主推线
AI 模型MMVC / so-vits-svc / DDSP-SVC仅 v1 旧引擎不在 v2 路线上
editionstd只用 Beatrice 的轻量场景全平台,不含 RVC
editioncudaNVIDIA GPU 用户Beatrice + RVC
editiononnx无 CUDA(M1 Mac 等)Beatrice + RVC,ONNX Runtime 后端
平台win / mac(M1) / linux / Colab二进制或源码Linux 需克隆源码运行

三个选型判断:

  • 先按模型定 edition。想用 RVC 就只可能是 cuda 或 onnx,别下 std。
  • cuda 与 onnx 差在推理后端,不在功能。有 N 卡优先 cuda,没有就上 onnx。
  • 新特性以 RVC 为主。快捷键与缓冲可视化都标注仅 RVC 可用,用老模型前先对照支持矩阵。

一条音频块的五段旅程:RVC 推理管线

以 RVC 为例,一块 48kHz 的 int16 音频从进入 server/voice_changer/VoiceChangerV2.py 的on_request()到出声,走五段。

1. 分块与降级保护。on_request()先检查管线状态:模型未加载、半精度切换中、f0 数据不足,一律返回静音占位并记警告——实时流宁可出静音,不能断。Beatrice 会设noCrossFade = True跳过交叉淡化,进一步压延迟。

2. 重采样与滚动缓冲。server/voice_changer/RVC/RVCr2.py 的inference()用 resampy(kaiser_fast 滤波)把音频降到 16kHz——这是 Hubert 与 rmvpe 的共同帧率。generate_input()维护 audio/pitchf/feature 三条滚动缓冲,按 hop 160 对齐,顺带算本块 RMS 音量,低于silentThreshold直接出静音,省掉一次推理。

3. 特征与 f0 提取。server/voice_changer/RVC/pipeline/Pipeline.py 的exec()里,extractFeatures()调 embedder(Hubert / ContentVec / Whisper)抽内容特征,extractPitch()调 f0 检测器(默认 rmvpe_onnx)抽基频。两者都在autocast下半精度执行。

4. 检索(RVC 的 R)。若模型带 index 文件,faiss 先reconstruct_n全量载入特征,每块search最近邻后,按indexRatio混合回原特征:

# Pipeline.exec() 中的检索混合 _, ix = self.index.search(npy, 1) npy = self.big_npy[ix.squeeze()] feats = torch.from_numpy(npy).unsqueeze(0).to(self.device) * index_rate \ + (1 - index_rate) * feats

protect < 0.5时再混一层:f0 为 0(气声或静音)的位置回退到检索前特征,避免检索污染弱信号区。

5. 合成与 SOLA 拼接。infer()出 48kHz 波形、转回 int16、重采样到输出率;回到on_request()做跨块拼接。直接硬拼两块独立推理的音频,相位不齐会出咔嗒声,SOLA 的解法是滑窗互相关找最优偏移:

# VoiceChangerV2.on_request() 的 SOLA 核心 cor_nom = np.convolve( audio[: crossfade_frame + sola_search_frame], np.flip(self.sola_buffer), "valid", ) cor_den = np.sqrt(np.convolve( audio[: crossfade_frame + sola_search_frame] ** 2, np.ones(crossfade_frame), "valid", ) + 1e-3) sola_offset = int(np.argmax(cor_nom / cor_den))

搜索窗约 12ms(sola_search_frame = 0.012 * 采样率),重叠区按余弦幂窗淡化,注释写明思路源自 DDSP-SVC 与 RVC-WebUI。

v2 相对 v1 还有两处结构改动:重采样下放给模型自己(setSamplingRate()),上层不再无效地重算;废除"预处理/主处理"分离,省掉模型内部多余的数组类型转换。管线由 server/voice_changer/RVC/pipeline/PipelineGenerator.py 的createPipeline()组装:设备、半精度、推理器、嵌入器、f0 提取器、index 一次配齐;GPU 不支持 half 时抛异常,上层自动回退 float 重建管线。

协议与接入:REST 与 Socket.IO 音频流

服务端把 REST 和 Socket.IO 挂在同一端口,任意语言都能接,curl 也可以。

REST /test

端点POST /test,实现在 server/restapi/MMVC_Rest_VoiceChanger.py。请求体两个字段:timestamp(int,你自己打的毫秒戳)和buffer(16-bit 小端 PCM 的 base64);响应是timestamp+changedVoiceBase64(同样编码的变声结果)。服务端用struct.unpack("<%sh")解包,推理全程持一把锁串行执行。

import base64, json, urllib.request pcm = open("in.wav.raw", "rb").read() # 16-bit LE PCM body = json.dumps({"timestamp": 0, "buffer": base64.b64encode(pcm).decode()}).encode() req = urllib.request.Request( "http://127.0.0.1:18888/test", body, {"Content-Type": "application/json"}) out = json.loads(urllib.request.urlopen(req).read()) open("out.wav.raw", "wb").write(base64.b64decode(out["changedVoiceBase64"]))

Socket.IO 命名空间 /test

实时推流走这里:客户端emit('request_message', [毫秒时间戳, PCM 字节]),服务端回response:[timestamp, PCM 字节, perf 延迟列表]。服务端逻辑在 server/sio/MMVC_Namespace.py,完整可跑的参考客户端在 client/python/vc_client.py:

sio = socketio.Client(ssl_verify=False) sio.register_namespace(MyCustomNamespace("/test", out_stream, None)) sio.connect(url) while True: in_wav = in_stream.read(BUFFER_SIZE, exception_on_overflow=False) sio.emit("request_message", [time.time() * 1000, in_wav], namespace="/test")

回调里用time.time()*1000 - timestamp即可算出往返时延。参考客户端按 44100Hz、每块 2048210 字节推送;它还有MockStream文件模式,拿 wav 文件当输入输出,不碰声卡也能验证协议。

调参与调优

RVC 的可调项集中在 server/voice_changer/RVC/RVCSettings.py,交叉淡化参数在VoiceChangerV2Settings。

参数默认值作用调优建议
tran12音高平移(半音)0 为不变调,按目标声线听感微调
f0Detectorrmvpe_onnx基频检测器rmvpe_onnx 速度与精度均衡
indexRatio0索引检索混合权重0.5 起步,0 表示不用索引
protect0.5弱 f0 区域保护阈值调低可压气声感
silentThreshold0.00001静音判定阈值调高可跳过环境噪声
extraConvertSize4096额外上下文帧数越大越稳,延迟同步上涨
crossFadeOverlapSize4096SOLA 重叠帧数追延迟时调低
gpu-9999GPU 编号多卡时指定

实战经验:

  • 低延迟场景先降crossFadeOverlapSize;用 Beatrice 则默认就跳过交叉淡化。
  • indexRatio从 0.5 起、按 0.1 步长试:太高会"糊",太低浪费 index。
  • rvcQuality=1会把上下文翻倍(repeat 机制),音色更连续但吃显存,GPU 余量不足时别开。

扩展与生态

  • TTSClient:同作者的实时 TTS 客户端,文本转语音。
  • ASRClient:实时语音识别客户端;三者拼起来是"听—说—变"的工具链。
  • Beatrice V2 训练代码(含 Colab 版):自己训模型,训完下载回 VCClient 使用。
  • recorder/:独立的语料录音与导出工具,用于采集训练素材。
  • docker/、docker_trainer/、docker_vcclient/:服务端、训练、客户端三套容器化方案。

合规与免责

  • macOS 二进制未经 Apple 签名,首次启动有安全警告,按住 Control 点图标运行,风险自负。
  • 内置角色音色素材(如つくよみちゃん、あみたろ、黄琴まひろ)各有使用条款:例如禁止用于攻击性言论与政治立场宣扬,或必须明示"是变声、非本人发声"。
  • 因使用或无法使用软件产生的任何损害,开发者不承担责任。

收束

回到开头:游戏里不暴露真声,一个 std/cuda 版客户端加一个模型槽就够了;直播多角色切换,换槽即可。想把推理卸到另一台机器,起一个服务端,用 Socket.IO 音频流推过去。想彻底自定义,server/voice_changer/RVC/ 的管线是模块化拼装,换 embedder、换 f0 检测器只是查一下管理器的事。从开箱到二次开发,这条路是通的。

【免费下载链接】voice-changerリアルタイムボイスチェンジャー Realtime Voice Changer项目地址: https://gitcode.com/gh_mirrors/vo/voice-changer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询