RVC:部署拥有 3.5 万+ 星标的 AI 语音转换工具

RVC(基于检索的语音转换)是一个基于 VITS 的语音转换框架,兼容 GPT-SoVITS、Coqui TTS 和 Demucs。本教程涵盖 Docker 部署、训练流程、API 集成以及生产环境强化。

  • MIT
  • 更新于 2026-05-19

RVC Logo

简介 #

你需要一个能在 10 分钟内完成训练、在单块 GPU 上运行、并产出广播级质量输出的语音转换流程。开源生态已经涌现出数十种声音克隆工具,但大多数都需要数小时的训练、庞大的数据集,或者按分钟计费的云端 API。RVC(基于检索的语音转换)是一个基于 VITS 的框架,在 GitHub 上拥有 35,700+ 星标,只需 10 分钟干净音频就能把训练时间压缩到 10 分钟以内。本指南将带你搭建一套生产可用的 RVC 环境——Docker 部署、训练流程、API 集成,以及在正式上线给用户使用之前需要做的各项强化。

RVC 是什么? #

RVC 是一个开源的语音转换框架,它能把一个人的声音转换成另一个人的声音,同时保留语音内容、语调和节奏。它基于 VITS 构建,加入了基于检索的特征匹配模块,在消费级 GPU 上能实现 10 分钟以内的训练时间,并支持延迟低至 90 毫秒的实时推理。

RVC 的工作原理 #

RVC 的架构由四个核心模块组成:

内容特征提取 —— 使用 ContentVec(HuBERT 的一个解耦变体)从源音频中提取与说话人无关的语音和语言特征。ContentVec 在保留内容信息的同时剥离说话人身份,非常适合语音转换任务。

音高提取 —— 采用在 Interspeech 2023 上发布的 RMVPE(鲁棒人声音高估计模型)来提取基频(F0)。RMVPE 能够处理复调音频,即使在音源分离不完美的情况下也能保持准确。

声学建模 —— 基于 VITS(面向端到端文本转语音、结合对抗学习的变分推理)构建,这是一种通过归一化流增强的条件 VAE。VITS 通过生成器和多周期判别器之间的对抗训练来生成高保真音频。

检索模块 —— RVC 的标志性创新。在训练阶段,内容特征会被索引进一个 Faiss 向量数据库。在推理阶段,源特征会被替换成来自训练集的 Top-K 近邻特征(默认 K=8),从而显著减少源说话人的音色泄漏。一个 index_rate 参数(α,通常为 0.3)控制检索特征与源特征之间的混合比例。

RVC 架构图

安装与配置 #

前置条件 #

RVC 可以在 Linux、macOS 和 Windows 上运行。训练需要至少 4GB 显存的 NVIDIA GPU(建议 8GB 以上)。如果只做推理,CPU 也能以可接受的延迟工作。

最低硬件要求:

  • GPU:NVIDIA GTX 1660 6GB / RTX 2060 8GB(训练用);4GB 显存(仅推理)
  • CPU:4 核 Intel/AMD 处理器
  • 内存:最低 8GB,建议 16GB
  • 存储:为模型和依赖预留 10GB 可用空间

方式一:Docker 部署(推荐用于生产环境) #

官方 Dockerfile 在 Ubuntu 20.04 + Python 3.9 环境中使用 CUDA 11.6.2:

# Clone the repository
git clone https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git
cd Retrieval-based-Voice-Conversion-WebUI

# Build the Docker image
docker build -t rvc-webui:latest .

# Run with GPU support and volume mounts
docker run -d --name rvc \
  --gpus all \
  -p 7865:7865 \
  -v $(pwd)/weights:/app/weights \
  -v $(pwd)/opt:/app/opt \
  rvc-webui:latest

对于使用 docker-compose 的用户:

version: '3.8'

services:
  rvc:
    build: .
    container_name: rvc-webui
    runtime: nvidia
    environment:
      - NVIDIA_VISIBLE_DEVICES=all
    ports:
      - "7865:7865"
    volumes:
      - ./weights:/app/weights
      - ./opt:/app/opt
      - ./assets:/app/assets
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    restart: unless-stopped
# Start with docker-compose
docker-compose up -d

# Check logs
docker-compose logs -f rvc

方式二:本地 Python 环境搭建 #

# Clone repository
git clone https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git
cd Retrieval-based-Voice-Conversion-WebUI

# Create virtual environment
python3 -m venv venv
source venv/bin/activate

# Install dependencies
pip install -r requirements.txt

# Download pretrained models
python tools/download_models.py

# Or manually download from HuggingFace
wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/D40k.pth -P assets/pretrained_v2/
wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/G40k.pth -P assets/pretrained_v2/
wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0D40k.pth -P assets/pretrained_v2/
wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/pretrained_v2/f0G40k.pth -P assets/pretrained_v2/
wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/hubert_base.pt -P assets/hubert/
wget https://huggingface.co/lj1995/VoiceConversionWebUI/resolve/main/rmvpe.pt -P assets/rmvpe/

方式三:AMD GPU 配置(ROCm) #

# Install ROCm dependencies (Ubuntu/Debian)
sudo apt install rocm-hip-sdk rocm-opencl-sdk

# Set environment variables
export ROCM_PATH=/opt/rocm
export HSA_OVERRIDE_GFX_VERSION=10.3.0

# Add user to render and video groups
sudo usermod -aG render $USER
sudo usermod -aG video $USER

# Install AMD-specific requirements
pip install -r requirements-amd.txt

启动 WebUI #

# Start the Gradio web interface
python infer-web.py

# The WebUI will be available at http://localhost:7865

训练流程 #

第一步:准备数据集 #

RVC 需要干净的单声道音频。为获得最佳效果:

  • 时长: 10-30 分钟干净的语音(最低 1 分钟也可以)
  • 格式: WAV,16 位或 24 位,22050Hz 或 40000Hz 采样率
  • 内容: 单一说话人,背景噪音尽量少,没有音乐或混响
  • 静音: 去除较长的静音片段(超过 3 秒)

使用内置的 UVR5 进行音源分离:

# Separate vocals from background music
python tools/uvr5/uvr5_cli.py \
  --input_path ./raw_audio/song_with_music.wav \
  --output_path ./dataset/ \
  --model_name "HP2-人声vocals+非人声instrumentals"

第二步:预处理并提取特征 #

在 WebUI 的 Train 标签页中:

  1. 设置实验名称(例如 my_voice_v2
  2. 目标采样率设为 40kHz(推荐)
  3. RVC 版本设为 v2
  4. 模型架构设为 rmvpe_gpu
  5. 数据集路径设为你的音频文件夹
  6. 点击一键训练

或者通过命令行执行:

# Step 1: Preprocess (resample, slice, remove silence)
python trainset_preprocess_pipeline_print.py \
  ./dataset/my_voice \
  40000 \
  8  # number of CPU threads

# Step 2: Extract features with ContentVec
python extract_feature_print.py \
  --model_name my_voice_v2 \
  --sample_rate 40000 \
  --pitch_extractor rmvpe \
  --gpu 0

# Step 3: Train the model
python train_nsf_sim_cache_sid_load_pretrain.py \
  --model_name my_voice_v2 \
  --sample_rate 40000 \
  --batch_size 8 \
  --total_epoch 200 \
  --save_every_epoch 5 \
  --pretrained_G assets/pretrained_v2/f0G40k.pth \
  --pretrained_D assets/pretrained_v2/f0D40k.pth \
  --gpu 0

第三步:构建特征索引 #

# Generate the Faiss index for retrieval
python tools/infer/train_index.py \
  --model_name my_voice_v2 \
  --sample_rate 40000

训练输出位置:

logs/
└── my_voice_v2/
    ├── added_IVF512_Flat_nprobe_1.index   # Faiss retrieval index
    ├── G_*.pth                             # Generator checkpoints
    ├── D_*.pth                             # Discriminator checkpoints
    └── config.json                         # Model configuration

RVC WebUI 训练标签页

训练基准测试 #

硬件数据集大小训练轮数训练时间输出质量
RTX 3090(24GB)10 分钟音频200约 18 分钟优秀
RTX 4090(24GB)10 分钟音频200约 12 分钟优秀
RTX 3060(12GB)10 分钟音频200约 35 分钟非常好
GTX 1660(6GB)10 分钟音频200约 90 分钟良好
Colab T4(16GB)10 分钟音频200约 40 分钟非常好

与常用工具的集成 #

集成一:GPT-SoVITS(TTS + RVC 流程) #

GPT-SoVITS 负责从文本生成语音;RVC 负责把它转换成目标声音。两者结合起来,就构成了一套完整的文本转语音克隆流程:

# gpt_sovits_rvc_pipeline.py
import subprocess
import requests
import os

def tts_then_convert(text: str, speaker_wav: str, rvc_model: str):
    """GPT-SoVITS TTS → RVC voice conversion pipeline"""
    
    # Step 1: Generate speech with GPT-SoVITS
    tts_response = requests.post("http://localhost:9880/tts", json={
        "text": text,
        "refer_wav_path": speaker_wav,
        "prompt_text": "Reference prompt text",
        "prompt_language": "en",
        "text_language": "en"
    })
    
    with open("/tmp/tts_output.wav", "wb") as f:
        f.write(tts_response.content)
    
    # Step 2: Convert voice with RVC API
    rvc_response = requests.post("http://localhost:7865/voice_conversion", json={
        "input_audio": "/tmp/tts_output.wav",
        "model_name": rvc_model,
        "pitch_shift": 0,
        "index_rate": 0.75,
        "filter_radius": 3,
        "volume_envelope": 0.25
    })
    
    return rvc_response.json()["output_path"]

result = tts_then_convert(
    text="Hello, this is a cloned voice speaking.",
    speaker_wav="./reference.wav",
    rvc_model="my_voice_v2"
)
print(f"Converted audio saved to: {result}")

集成二:Coqui TTS #

# coqui_rvc_bridge.py
from TTS.api import TTS
import requests

def coqui_to_rvc(text: str, rvc_model: str, output_path: str):
    # Generate with Coqui XTTS v2
    tts = TTS("tts_models/multilingual/multi-dataset/xtts_v2", gpu=True)
    tts.tts_to_file(
        text=text,
        speaker_wav="reference.wav",
        language="en",
        file_path="/tmp/coqui_out.wav"
    )
    
    # Convert through RVC
    with open("/tmp/coqui_out.wav", "rb") as f:
        files = {"file": f}
        data = {
            "model_name": rvc_model,
            "pitch": 0,
            "index_rate": 0.5
        }
        response = requests.post(
            "http://localhost:7865/api/voice_conversion",
            files=files,
            data=data
        )
    
    with open(output_path, "wb") as f:
        f.write(response.content)
    return output_path

集成三:Demucs(进阶音源分离) #

在训练前进行生产级的人声分离:

# Install demucs
pip install demucs

# Separate vocals with demucs (better quality than UVR5 for complex mixes)
demucs --two-stems=vocals --mp3 --mp3-bitrate 320 input_song.mp3

# Use the separated vocal track for RVC training
mv separated/htdemucs/input_song/vocals.wav ./dataset/clean_voice.wav

集成四:实时语音转换 GUI #

RVC 实时 GUI

RVC 内置了一个用于实时应用的语音转换图形界面:

# Start the real-time GUI
python gui_v1.py

# Or with DirectML for AMD/Intel GPUs
python gui_v1.py --dml

# Key parameters for low latency:
# - Block time: 0.25s (lower = less latency, more CPU)
# - Crossfade: 0.05s
# - Extra time: 2.5s
# - Pitch extractor: fcpe (fastest) or rmvpe (best quality)

流式传输的配置(配合 ASIO 可实现端到端 90 毫秒延迟):

# gui_config.py example
config = {
    "block_time": 0.1,        # 100ms blocks for lower latency
    "crossfade_time": 0.04,
    "extra_time": 2.0,
    "f0method": "fcpe",       # Fastest pitch extractor
    "rms_mix_rate": 0.25,
    "index_rate": 0.3,
    "pitch": 0,
    "I_noise_reduce": True,
    "O_noise_reduce": False
}

集成五:API 服务器(FastAPI) #

RVC 提供了一个基于 FastAPI 的 REST API,用于生产环境部署:

# Start the API server
python api_240604.py

# The API will be available at http://localhost:7865
# Client example for API inference
import requests

# Load model first
requests.post("http://localhost:7865/load_model", json={
    "pth_path": "./weights/my_voice_v2.pth",
    "index_path": "./logs/my_voice_v2/added_IVF512_Flat_nprobe_1.index"
})

# Perform voice conversion
with open("input_audio.wav", "rb") as f:
    response = requests.post(
        "http://localhost:7865/voice_conversion",
        files={"file": f},
        data={
            "pitch": 0,
            "index_rate": 0.75,
            "filter_radius": 3,
            "volume_envelope": 0.25,
            "protect": 0.33
        }
    )

with open("converted_output.wav", "wb") as f:
    f.write(response.content)

基准测试 / 真实使用场景 #

客观质量指标 #

指标RVC v2So-VITS-SVC 4.1GPT-SoVITS (SVC)DDSP-SVC
说话人相似度(余弦相似度)0.850.790.820.71
PESQ(质量,满分 4.5)3.63.33.42.8
UTMOS(自然度,满分 5)4.193.954.053.45
训练时间(10 分钟数据,RTX 3090)约 18 分钟约 2 小时约 45 分钟约 15 分钟
最少训练数据1 分钟10 分钟1 分钟5 分钟
实时因子(推理)0.05x0.15x0.08x0.02x

生产环境使用场景 #

AI 翻唱 —— 转换人声音轨以模仿特定艺人的声音,用于娱乐内容制作。RVC 的 RMVPE 音高提取即使在复杂的转音演唱中也能保持准确的旋律还原。

直播中的实时变声 —— 面向内容创作者的实时变声。配合 GUI 和 ASIO 驱动,端到端延迟可达 90 毫秒,绝大多数听众难以察觉。

隐私保护 —— 在保留情感内容和可懂度的前提下,对录制的采访、呼叫中心录音以及敏感语音数据中的说话人身份进行匿名化处理。

内容本地化 —— 在结合 TTS 流程时,为视频内容配音的同时,跨语言保留原说话人的声音特征。

语音数据集扩充 —— 为低资源语言的 ASR 系统生成合成训练数据,正如某学术研究所展示的,经过 200 轮训练后 KL 散度损失达到 0.68。

进阶用法 / 生产环境强化 #

安全性考量 #

# api_production.py — Hardened API wrapper
from fastapi import FastAPI, HTTPException, Depends
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
import hashlib

security = HTTPBearer()

def verify_token(credentials: HTTPAuthorizationCredentials):
    """Verify API token for production deployments"""
    expected = hashlib.sha256(TOKEN.encode()).hexdigest()
    if credentials.credentials != expected:
        raise HTTPException(status_code=401, detail="Invalid token")
    return True

@app.post("/voice_conversion")
async def secure_convert(
    file: UploadFile,
    credentials: HTTPAuthorizationCredentials = Depends(security)
):
    verify_token(credentials)
    # ... conversion logic
    return {"output_url": signed_url}

模型管理 #

# Organize multiple voice models
models/
├── celeb_voice_a/
│   ├── model.pth
│   ├── index.faiss
│   └── config.json
├── celeb_voice_b/
│   ├── model.pth
│   ├── index.faiss
│   └── config.json
└── custom_brand_voice/
    ├── model.pth
    ├── index.faiss
    └── config.json
# Dynamic model loader for multi-tenant deployments
import os
import glob

def list_available_models(models_dir="./models"):
    """List all available voice models"""
    models = []
    for model_dir in glob.glob(os.path.join(models_dir, "*/")):
        name = os.path.basename(os.path.dirname(model_dir))
        pth_files = glob.glob(os.path.join(model_dir, "*.pth"))
        index_files = glob.glob(os.path.join(model_dir, "*.faiss")) + \
                      glob.glob(os.path.join(model_dir, "*.index"))
        if pth_files and index_files:
            models.append({
                "name": name,
                "pth": pth_files[0],
                "index": index_files[0]
            })
    return models

监控与日志记录 #

# monitoring.py — Prometheus-compatible metrics
from prometheus_client import Counter, Histogram, start_http_server
import time

conversion_count = Counter('rvc_conversions_total', 'Total conversions')
conversion_duration = Histogram('rvc_conversion_seconds', 'Conversion latency')
error_count = Counter('rvc_errors_total', 'Total errors', ['error_type'])

def monitored_convert(audio_path, model_name):
    start = time.time()
    try:
        result = perform_conversion(audio_path, model_name)
        conversion_count.inc()
        return result
    except Exception as e:
        error_count.labels(error_type=type(e).__name__).inc()
        raise
    finally:
        conversion_duration.observe(time.time() - start)

# Start metrics endpoint
start_http_server(9090)

导出 ONNX 以加速推理 #

# Export trained model to ONNX for CPU/GPU-agnostic inference
python tools/export_onnx.py \
  --checkpoint_path ./logs/my_voice_v2/G_12000.pth \
  --output_path ./models/my_voice_v2/model.onnx \
  --sample_rate 40000

与其他方案的对比 #

特性RVC v2GPT-SoVITSSo-VITS-SVC 4.1DDSP-SVC
主要用途语音转换TTS + 声音克隆歌声转换歌声转换
训练时间(10 分钟数据)约 18 分钟(RTX 3090)约 45 分钟约 2 小时约 15 分钟
最低训练显存4GB8GB8GB4GB
最少训练数据1 分钟1 分钟10 分钟5 分钟
音高提取器RMVPE / FCPERMVPEHarvest / CrepeHarvest / Crepe
内容编码器ContentVec(768 维)HuBERT / ContentVecContentVecContentVec
检索模块Faiss Top-K(K=8)无检索Faiss Top-K(4.1 版新增)无检索
实时推理支持(90 毫秒延迟)不支持支持(配合 w-okada)支持
声码器NSF-HiFi-GANNSF-HiFi-GANNSF-HiFi-GANDDSP + HiFi-GAN
模型融合支持(ckpt merge)不支持不支持不支持
UVR5 集成内置独立独立独立
许可证MITMITBSD-3-ClauseApache-2.0
GitHub 星标35,700+43,000+21,200+2,800+
最近更新2024-062025-042023-12(已归档)2024-03

何时选择 RVC: 当你需要快速训练、实时转换,或者需要基于检索的特征匹配来最大程度减少音色泄漏时。对于生产环境的语音转换流程来说,RVC 是务实的选择。

何时选择 GPT-SoVITS: 当你需要带声音克隆的文本转语音(而不是音频到音频的转换)时。GPT-SoVITS 擅长用 1 分钟参考音频从文本生成语音。

何时选择 So-VITS-SVC: 用于带浅层扩散后处理的传统歌声转换。需要注意:该项目已归档,不再维护。

何时选择 DDSP-SVC: 用于资源占用极低的轻量级歌声转换。质量低于 RVC,但可以在性能较弱的硬件上运行。

局限性 / 客观评估 #

RVC 是一个能力很强的工具,但它并不适合所有语音应用场景:

不支持文本转语音。 RVC 只能音频转音频,不能从文本生成语音。要搭建完整的 TTS 流程,需要把它和 GPT-SoVITS、Coqui TTS 或 Edge-TTS 结合使用。

说话人相似度存在上限。 虽然 RVC 能产出令人信服的转换效果,但在保真度上仍不及 ElevenLabs Voice Cloning 或 Microsoft Azure Speech Studio 等商业方案。对于企业级的声音克隆需求,付费 API 仍然领先。

情感控制存在局限。 RVC 会保留源音频的情感和韵律,但无法独立操控情感表达。CosyVoice 3 或 Seed-VC 等工具提供了更细粒度的韵律控制。

训练对硬件有要求。 尽管比其他方案更高效,训练依然需要一块独立的 NVIDIA GPU。CPU 训练不现实(慢 50 倍以上)。使用云端 GPU 实例会增加运营成本。

伦理和法律风险。 声音克隆技术可能被滥用于深度伪造音频、诈骗和身份冒用。RVC 没有内置任何水印或安全机制。生产环境部署应当实施同意验证、审计日志记录以及合成音频水印。

语言支持存在缺口。 RVC 对主要语言(英语、中文、日语、韩语)效果良好,但对声调语言(泰语、越南语)以及预训练模型覆盖有限的低资源语言,质量会有所下降。

常见问题 #

RVC 需要多少训练数据? #

RVC 最少只需 1 分钟干净的音频即可训练,但 10-30 分钟能带来明显更好的效果。关键在于音频质量而不是数量。10 分钟的录音室录音效果会胜过 2 小时嘈杂的电话录音。请把背景噪音、音乐和混响控制在最低限度。

RVC 可以只用 CPU 运行吗? #

可以,但仅限于推理。训练需要支持 CUDA 的 GPU。CPU 推理比 GPU 慢 10-20 倍,但对于延迟不敏感的批处理任务是可行的。对于实时转换,强烈建议使用至少 4GB 显存的 GPU。

RVC v1 和 v2 有什么区别? #

RVC v2 把内容编码器从 9 层、256 维特征的 HuBERT 改为 12 层、768 维特征的 HuBERT,并新增了 3 个周期判别器以提升音频质量。所有新项目都应该只使用 v2 模型。v2 的预训练模型与 v1 不向后兼容。

如何减少转换后音频中的音色泄漏? #

调整 index_rate 参数。数值越高(0.7-1.0),推理越依赖检索索引,从训练集中提取的特征就越多、从源音频中提取的就越少。可以从 0.75 开始,再根据输出质量调整。如果声音听起来不自然,就调低到 0.3-0.5。

我可以在 Discord/Zoom/游戏里用 RVC 做实时变声吗? #

可以,通过 RVC 的实时 GUI(gui_v1.py)。把你的麦克风路由到一个虚拟音频线缆(Windows 上用 VB-Cable,macOS 上用 BlackHole,Linux 上用 PulseAudio),把 RVC 设为输入设备,再把目标应用配置为使用虚拟线缆的输出。配合 ASIO 驱动和现代 GPU,延迟可以保持在 100 毫秒以内。

RVC 支持哪些文件格式? #

RVC 支持的输入格式包括 WAV、MP3、FLAC、OGG 和 M4A。输出始终是目标采样率(32kHz、40kHz 或 48kHz)的 WAV 格式。为获得最佳质量,建议使用无损的 WAV 或 FLAC 作为输入,避免对 MP3 文件进行多次重新编码。

如何把两个声音模型融合在一起? #

使用 WebUI 中的 ckpt merge 标签页。加载两个 .pth 模型文件,设置混合比例(0.0 = 100% 模型 A,1.0 = 100% 模型 B,0.5 = 均等混合)。融合后的模型会同时继承两个声音的特征。这种方法在不需要重新训练的情况下,非常适合创建混合声音。

为什么我转换出来的声音听起来机械或失真? #

常见原因:(1)训练数据或训练轮数不足——至少训练 200 轮;(2)输入音频有噪音——使用 UVR5 或 Demucs 进行音源分离;(3)音高提取器选择不当——语音使用 rmvpe,演唱使用 harvest;(4)采样率不匹配——确保推理时的采样率与训练时一致。

结论 #

RVC 能在中端硬件上以 20 分钟以内的训练时间提供生产级的语音转换效果。它基于检索的架构比直接特征映射带来更干净的声音分离效果,而 FastAPI 服务器让它可以轻松集成进现有的音频流程中。对于搭建语音功能应用的开发者来说,RVC 在开源生态中提供了质量、速度和部署灵活性之间最好的平衡。

下一步: 克隆代码仓库,跑通 Docker 环境搭建,用 10 分钟干净音频训练出你的第一个模型。加入 RVC 的 Telegram 社区,分享模型并获取支持:t.me/RVCSpace

推荐主机与基础设施 #

在把上述任何工具部署到生产环境之前,你需要可靠的基础设施。以下是 dibi8 实际在用并推荐的两个选项:

  • DigitalOcean — 60 天内可获得 200 美元免费额度,覆盖 14 个以上全球节点。是独立开发者运行开源 AI 工具的默认选择。
  • HTStack — 香港 VPS,从中国大陆访问延迟低。这正是承载 dibi8.com 的同一家 IDC——经过生产环境的实战检验。

联盟链接——不会给你带来额外费用,但能帮助 dibi8.com 持续运营。

来源与延伸阅读 #

参考与来源 #

💬 留言讨论