RVC Next

嵌入到其他程序

在你自己的 Python 程序(启动器、整合包、其他 WebUI)里启动 RVC Next 的服务端和网页界面:数据目录与配置目录分开、固定设置、路径前缀,以及挂载到已有的 FastAPI 应用。

RVC Next 可以作为一个库,在另一个 Python 程序里启动。启动后的服务端与 rvc-next webui 完全相同:同样的 API、同样的网页界面、同样的任务与实时变声。宿主程序可以决定数据放在哪里、设置文件放在哪里、哪些设置不允许用户修改,以及界面挂在哪个路径下。

同一个环境

宿主程序必须与 RVC Next 运行在同一个 Python 环境里,这个环境要满足 RVC Next 的依赖(见 安装)。不要把它装进依赖冲突的共享环境。

最小示例

from rvc_next import RvcNextServer

server = RvcNextServer(data_dir="./rvc-next-data", port=0)
url = server.start()   # 开始监听后立即返回,例如 http://127.0.0.1:54123
print(url)
...
server.stop()

start() 在后台线程里运行服务端,返回网页界面的地址;run() 则在前台运行,直到 Ctrl+C。对象也可以当作上下文管理器使用:

with RvcNextServer(data_dir="./rvc-next-data", port=0) as server:
    print(server.url)
    ...  # 离开 with 块时自动 stop()

stop() 可以重复调用,会关闭服务端、实时变声的子进程和数据库,并释放端口。import rvc_next 不会加载 torch 或 FastAPI,只有用到 RvcNextServer 时才加载服务端。

数据目录与配置目录

参数存放什么默认值
data_dir数据库、模型、实验、结果、上传文件、缓存,以及 server.jsonRVC_NEXT_DATA_DIR 或系统默认位置
config_dir设置文件 settings.toml与 data_dir 相同
settings_path直接指定设置文件的完整路径(文件名可以自定),优先于 config_dir无

宿主程序通常有自己的配置文件夹,可以把 RVC Next 的设置放进去,而数据仍放在数据目录:

server = RvcNextServer(
    data_dir="D:/MyLauncher/data/rvc-next",
    config_dir="D:/MyLauncher/config/rvc-next",   # 设置写到 D:/MyLauncher/config/rvc-next/settings.toml
)

网页界面 设置 › 关于 会显示当前使用的数据目录和设置文件。命令行同样支持:rvc-next webui --config-dir <folder>,或设置环境变量 RVC_NEXT_CONFIG_DIR(让 rvc-next config 等命令读写同一份设置时,用环境变量最方便)。

固定设置

settings 参数接收与 settings.toml 相同结构的字典。这些值叠加在设置文件和环境变量之上,不会写回文件,也不能通过网页界面或 API 修改,适合宿主程序统一管理的项目:

server = RvcNextServer(
    data_dir="./rvc-next-data",
    settings={
        "paths": {"assets_dir": "/srv/RVC/assets"},   # 复用原版 RVC 的 assets
        "compute": {"device": "cuda:0"},
    },
)

被固定的文件夹在 设置 › 存储 中标注 由嵌入 rvc-next 的应用设置。所有设置项见 配置与环境变量。

地址、端口与访问令牌

参数说明
host绑定地址,默认取设置 server.host(127.0.0.1)
port0 由系统任选空闲端口;一个数字表示从这个端口开始尝试(被占用时往后找,最多 20 个);None 使用设置 server.port
strict_port为 True 时端口被占用就直接失败
access_token可选的访问令牌;设置后每个 API 和 socket 请求都要携带(网页界面会要求输入一次)。绑定到非本机地址或设置 extra_hosts 时也不是必需的
extra_hosts除绑定地址外还接受的公网主机名,如内网穿透或反向代理的地址;见下方 内网穿透与反向代理
open_browser启动后是否打开浏览器,默认 False
log_leveluvicorn 的日志级别,默认 "warning"

host、access_token 和 open_browser 同样作为固定设置生效。远程访问的注意事项见 远程访问与安全。

内网穿透与反向代理

只监听本机时,服务器只接受 Host 为本机名称或绑定地址的请求。内网穿透(如 Gradio 共享链接)和反向代理会转发它们自己的公网主机名,需要先允许这个名称。穿透地址往往在服务器启动、端口确定之后才知道,所以 allow_host() 在启动后同样可以调用,立即生效:

server = RvcNextServer(data_dir="./rvc-next-data", port=0)
server.start()
share_url = start_tunnel(server.port)   # 例如 https://abc.gradio.live
server.allow_host(share_url)            # 接受主机名、host:port 或完整地址

任何拿到公网地址的人都能访问服务器并使用全部功能;需要时传入 access_token,或在宿主程序、代理一侧自行加上身份验证。通过这些名称到达的请求即使来自本机的穿透程序,也不会被当作本机请求,不能使用 在文件夹中显示。

路径前缀

api_prefix 把 API、socket 和网页界面整体移到一个路径下,避免与宿主程序自己的路由冲突:

server = RvcNextServer(data_dir="./rvc-next-data", port=0, api_prefix="/voice")
server.start()   # http://127.0.0.1:54123/voice

网页界面不需要重新构建:它从自身脚本的地址推算出基础路径。命令行同样支持 rvc-next webui --api-prefix /voice。

挂载到已有的 FastAPI 应用

如果宿主程序本身就是 FastAPI(或其他 ASGI)应用,也可以不另开端口,直接挂载:

from contextlib import asynccontextmanager

from fastapi import FastAPI

from rvc_next.api.app import create_app
from rvc_next.core.context import build_services

services = build_services(data_dir=..., config_dir=..., start_background=True)
child = create_app(services, bound_host="127.0.0.1", api_prefix="/voice")


@asynccontextmanager
async def lifespan(_app):
    async with child.router.lifespan_context(child):
        yield
    services.close()


app = FastAPI(lifespan=lifespan)
app.mount("/", child)   # 页面位于 /voice/

宿主程序要在自己的事件循环里进入子应用的 lifespan(它启动 socket 事件转发),并在退出时调用 services.close()。start_background=True 启动任务调度和空闲卸载;不传时排队的任务不会运行。

直接调用服务

server.services 是服务端使用的同一组服务对象,宿主程序可以不经 HTTP 直接调用,例如列出音色、提交转换任务或修改设置:

services = server.services
for voice in services.models.list_voices():
    print(voice.name)

这些方法与 API 一一对应,返回的模型与 API 的 JSON 结构相同,详见 核心服务。

本页目录