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 PyTorchLinux/WSL2 从源码运行Windows 与 M1 Mac 有现成二进制可下载。git clone https://gitcode.com/gh_mirrors/vo/voice-changer cd voice-changer conda create -n vc python3.10 conda activate vc cd server pip install -r requirements.txt python3 MMVCServerSIO.py -p 18888 --model_dir model_dir克隆仓库命令如上。装完依赖启动 server/MMVCServerSIO.py首次运行会自动下载预训练权重和样例模型。按控制台提示在浏览器仅 Chrome打开客户端 URL或直接用自带 Python 客户端python client/python/vc_client.py --input 0 --output 1 --to 0。在界面里选中模型槽、点 start对着麦克风说话。首次预期结果权重下载完成后浏览器出现客户端界面扬声器播出换过音色的声音界面上能看到 vol/buff/res 三项延迟读数。架构鸟瞰谁推理谁传输整体是一个服务端 可替换的模型层 两层协议。入口 server/MMVCServerSIO.py 用 uvicorn 把 FastAPIREST和 Socket.IO 挂在同一端口上。音频进来后VoiceChangerManager按模型槽类型分发v2 引擎负责 RVC、Beatrice、LLVC、EasyVC、DiffusionSVCv1 引擎负责 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 仅旧版 Windowsv2 全 editionv2 是当前主推线AI 模型MMVC / so-vits-svc / DDSP-SVC仅 v1 旧引擎不在 v2 路线上editionstd只用 Beatrice 的轻量场景全平台不含 RVCeditioncudaNVIDIA GPU 用户Beatrice RVCeditiononnx无 CUDAM1 Mac 等Beatrice RVCONNX 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()用 resampykaiser_fast 滤波把音频降到 16kHz——这是 Hubert 与 rmvpe 的共同帧率。generate_input()维护 audio/pitchf/feature 三条滚动缓冲按 hop 160 对齐顺带算本块 RMS 音量低于silentThreshold直接出静音省掉一次推理。3. 特征与 f0 提取。server/voice_changer/RVC/pipeline/Pipeline.py 的exec()里extractFeatures()调 embedderHubert / 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) * featsprotect 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))搜索窗约 12mssola_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。请求体两个字段timestampint你自己打的毫秒戳和buffer16-bit 小端 PCM 的 base64响应是timestampchangedVoiceBase64同样编码的变声结果。服务端用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.pysio socketio.Client(ssl_verifyFalse) sio.register_namespace(MyCustomNamespace(/test, out_stream, None)) sio.connect(url) while True: in_wav in_stream.read(BUFFER_SIZE, exception_on_overflowFalse) 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。rvcQuality1会把上下文翻倍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),仅供参考