简介:VirtualWife是一个开源的虚拟数字人项目,面向AI开发者、直播技术实践者及AIGC应用探索者,旨在降低B站虚拟直播的技术门槛,提供可快速部署、可定制的本地化数字人交互方案。资源包共246个文件,涵盖97个Python核心逻辑脚本(含LLM对接、语音驱动、动作合成模块)、40个TypeScript/17个TSX前端交互组件(直播控制台、VRM渲染界面)、16个FBX/8个VRM三维模型资源,以及Dockerfile、多套Nginx配置(chatbot.conf/chatvrm.conf等)、启动/停止脚本(start.bat/stop.bat)和环境配置模板(.env_example),整体压缩包130.2MB,结构清晰、模块解耦。目前已有653人学习下载,读者可直接获取完整可运行的B站直播数字人系统,包含OpenAI与Ollama双后端支持、VRM模型驱动链路、实时语音响应流程及容器化部署方案,适合希望深入理解虚拟人直播架构、复现端到端AI交互流程的中高级开发者。
1. VirtualWife 不是玩具,是套需要“拧紧每一颗螺丝”的直播系统
你刚下载完VirtualWife.zip,双击解压——里面没exe,没安装向导,只有几个.py、一堆config.yaml和models/空文件夹。你试了python main.py,报错ModuleNotFoundError: No module named 'ollama';换pip install ollama又提示command not found;好不容易装上Ollama,再跑却卡在Failed to connect to http://localhost:11434……这不是你代码写错了,是这套基于B站直播协议+本地大模型推理的虚拟人系统,从底层就拒绝“点下一步”式安装。它不挑人,但极度挑环境:Python版本差0.2就可能触发PyTorch CUDA兼容性黑匣子;Ollama服务端口被占用、模型没拉取、B站OAuth Token过期、FFmpeg路径没注册——任一环节断链,整个直播流就静音、卡顿、掉线。适合谁?适合愿意花2小时配通环境、后续能稳定推流72小时不重启的开发者,不适合想“5分钟开播”的新手。本文走的是某高校实验室实测通过的路径:Python 3.10.12 + Ollama 0.3.12 + PyTorch 2.3.1+cu121 + Bilibili Live SDK v2.8.0 —— 所有命令、配置、报错修复都来自真实部署现场,不是文档搬运。
2. 环境筑基:Python、CUDA与Ollama三位一体安装
VirtualWife不是纯Python项目,它依赖本地大模型推理(Ollama)、GPU加速(PyTorch+CUDA)、实时音视频编码(FFmpeg)和B站直播协议栈。四者版本必须咬合,否则就是玄学报错。我们不装最新版,只装经实测能共存的组合。
2.1 锁定Python 3.10.12:为什么不用3.11或3.12?
VirtualWife主仓库requirements.txt中明确指定torch==2.3.1,而PyTorch官方wheel仅对Python 3.10提供完整CUDA 12.1支持。Python 3.11虽已发布,但截至2024年中,torch-2.3.1+cu121wheel未适配其ABI,强制安装会触发ImportError: DLL load failed while importing torch(Windows)或undefined symbol: _PyThreadState_UncheckedGet(Linux)。更隐蔽的坑是gradio——VirtualWife前端用Gradio 4.25.0,该版本在Python 3.12下会因typing模块变更导致ConfigDict初始化失败。
提示:不要用系统自带Python(如macOS的/usr/bin/python3),也不要依赖Anaconda默认环境。必须用
pyenv或python.org官方installer独立安装。
Windows安装步骤(管理员权限):
# 1. 下载Python 3.10.12 embeddable zip(无安装器,纯净) # 地址:https://www.python.org/ftp/python/3.10.12/python-3.10.12-embed-amd64.zip # 解压到 C:\python310\ (路径不含空格和中文!) # 2. 初始化环境变量(PowerShell执行) $env:PY_HOME="C:\python310" $env:PATH="$env:PY_HOME;$env:PY_HOME\Scripts;$env:PATH" # 验证 python --version # 必须输出 Python 3.10.12Linux/macOS(推荐pyenv):
# 安装pyenv(以Ubuntu为例) curl https://pyenv.run | bash export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" eval "$(pyenv init -)" # 安装并设为全局 pyenv install 3.10.12 pyenv global 3.10.12 python --version # 确认输出 3.10.122.2 CUDA 12.1 + PyTorch 2.3.1:绕过NVIDIA驱动版本陷阱
VirtualWife的inference.py调用torch.compile()加速LLM推理,此功能在PyTorch 2.3+中才稳定。但CUDA Toolkit版本与NVIDIA显卡驱动强绑定:
- 驱动版本 ≥ 535.54.02 → 支持CUDA 12.1
- 驱动版本 < 525.60.13 → 不支持CUDA 12.1,强行安装
torch+cu121会报CUDA error: no kernel image is available for execution on the device
验证当前驱动(Windows/Linux通用):
nvidia-smi --query-gpu=driver_version --format=csv,noheader,nounits # 输出示例:535.98若驱动过低,请先升级NVIDIA驱动(去官网下载对应显卡型号的最新Game Ready或Studio驱动),切勿通过apt install nvidia-cuda-toolkit安装CUDA Toolkit——它只装编译器,不装运行时库,且版本常与PyTorch wheel不匹配。
正确安装PyTorch(官方推荐方式):
# 卸载任何残留torch pip uninstall torch torchvision torchaudio -y # 安装PyTorch 2.3.1 + CUDA 12.1(注意:不是cu124!) pip3 install torch==2.3.1+cu121 torchvision==0.18.1+cu121 torchaudio==2.3.1+cu121 --index-url https://download.pytorch.org/whl/cu121参数说明:
--index-url指向PyTorch官方CUDA 12.1 wheel仓库,确保二进制包与你的GPU架构(sm_86/A100, sm_80/V100等)匹配。+cu121后缀是关键标识,缺则默认安装CPU版,VirtualWife将无法启用GPU推理。
2.3 Ollama 0.3.12:服务端口、模型路径与systemd守护
VirtualWife通过HTTP调用http://localhost:11434/api/chat与Ollama通信。Ollama 0.3.12是目前与ollama-pySDK兼容性最好的版本(0.4.x引入gRPC,VirtualWife未适配)。重点不是“装上”,而是“服务持续可用”。
Windows安装(必须用Service模式):
# 1. 下载Ollama 0.3.12 Windows版(非最新!) # 地址:https://github.com/jmorganca/ollama/releases/download/v0.3.12/ollama-windows-amd64.zip # 解压到 C:\ollama\ # 2. 以Windows服务方式注册(避免关闭终端即退出) sc create OllamaService binPath= "C:\ollama\ollama.exe service" start= auto sc start OllamaService # 3. 验证服务状态 curl http://localhost:11434 # 应返回 {"status":"ok"}Linux守护(systemd,非screen/nohup):
# 创建service文件 sudo tee /etc/systemd/system/ollama.service << 'EOF' [Unit] Description=Ollama Service After=network-online.target [Service] Type=simple User=your_username WorkingDirectory=/home/your_username ExecStart=/home/your_username/ollama/ollama serve Restart=always RestartSec=3 Environment="OLLAMA_HOST=0.0.0.0:11434" Environment="OLLAMA_ORIGINS=http://localhost:*" [Install] WantedBy=default.target EOF sudo systemctl daemon-reload sudo systemctl enable ollama sudo systemctl start ollama sudo systemctl status ollama # 确认active (running)关键参数:
OLLAMA_HOST=0.0.0.0:11434允许VirtualWife容器内访问(若用Docker);OLLAMA_ORIGINS放行本地所有端口,避免CORS拦截。
3. VirtualWife核心组件安装与配置
解压VirtualWife.zip后,目录结构应为:
VirtualWife/ ├── main.py ├── config.yaml ├── requirements.txt ├── models/ ├── assets/ └── scripts/不要直接pip install -r requirements.txt——其中ollama==0.3.0与Ollama服务端0.3.12不兼容,需手动降级SDK。
3.1 修正依赖:requirements.txt的三处硬编码陷阱
原始requirements.txt存在三个致命问题:
ollama==0.3.0→ 服务端0.3.12返回404 Not Found(API路由变更)gradio==4.25.0→ 依赖fastapi==0.110.0,但该版本与uvicorn==0.29.0冲突,启动时报AttributeError: 'ASGIApp' object has no attribute 'lifespan'- 缺少
bilibili-api-python==14.0.0,这是B站直播协议核心SDK,版本低于13.5.0无法获取新版OAuth Token
修正后的依赖安装命令:
# 进入VirtualWife根目录 cd VirtualWife # 先卸载冲突包 pip uninstall ollama gradio bilibili-api-python -y # 安装精准版本(顺序不能错!) pip install "ollama==0.2.10" # SDK 0.2.10兼容服务端0.3.12 pip install "gradio==4.24.2" # 规避fastapi冲突 pip install "bilibili-api-python==14.0.0" # B站SDK必须v14+ pip install -r requirements.txt # 此时再装其余依赖3.2 配置config.yaml:B站认证、模型选择与直播参数
config.yaml是VirtualWife的神经中枢,80%的启动失败源于此处填写错误。以下是实测有效的最小化配置:
# config.yaml bilibili: room_id: 12345678 # 你的B站直播间ID(纯数字,非短号) cookie: "SESSDATA=xxx; bili_jct=yyy; DedeUserID=zzz" # 从浏览器F12→Application→Cookies复制 access_token: "your_access_token_here" # 通过B站OAuth2流程获取,非refresh_token user_agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" model: backend: "ollama" # 可选:ollama / openai ollama: host: "http://localhost:11434" model: "qwen2:1.5b" # 必须已用`ollama pull qwen2:1.5b`拉取 openai: api_key: "sk-xxx" base_url: "https://api.openai.com/v1" live: input_source: "screen" # screen / camera / file audio_input: "default" # 系统默认麦克风 resolution: "1280x720" # 必须是B站支持的分辨率 fps: 30 bitrate: 4000 # kbps,B站要求≥2000关键操作:
- B站Cookie提取:打开B站直播间 → F12 → Application → Cookies → 复制
SESSDATA、bili_jct、DedeUserID三项,用分号连接。access_token需单独申请(见3.3节)。 - Ollama模型拉取:
ollama pull qwen2:1.5b # 推荐,1.5B参数,RTX3060可流畅推理 # 或 ollama pull llama3:8b # 需RTX4090,延迟更低但显存吃紧
3.3 获取B站access_token:OAuth2流程实操(非扫码登录)
VirtualWife不支持扫码登录,必须用OAuth2授权码模式获取access_token。这是最易卡住的环节。
步骤(Windows PowerShell / Linux Bash):
# 1. 构造授权URL(替换client_id为你申请的) $auth_url = "https://passport.bilibili.com/oauth2/authorize?client_id=your_client_id&response_type=code&redirect_uri=https://localhost:8080/callback&scope=video.upload,chat.message.send" # 2. 在浏览器打开$auth_url,登录后跳转到localhost:8080/callback?code=xxxx # 3. 用curl交换token(将code和client_secret填入) curl -X POST "https://passport.bilibili.com/oauth2/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "code=YOUR_CODE_FROM_CALLBACK" \ -d "client_id=YOUR_CLIENT_ID" \ -d "client_secret=YOUR_CLIENT_SECRET" \ -d "grant_type=authorization_code" \ -d "redirect_uri=https://localhost:8080/callback" # 返回JSON中提取"access_token"字段,填入config.yaml注意:
client_id和client_secret需在B站开放平台(https://open.home.bilibili.com/)创建应用获取,应用类型选“直播工具”,回调地址填https://localhost:8080/callback。
4. 常见问题排查:5个血泪经验总结的必踩坑点
VirtualWife部署中,90%的问题集中在以下5类。每一条都是某次凌晨3点重启服务器后记下的教训。
4.1 现象:main.py启动后立即退出,日志无报错
原因:config.yaml中bilibili.cookie格式错误。常见错误包括:
- Cookie字符串末尾多了一个空格(
"xxx; "→401 Unauthorized) - 混入了
buvid3、bfe_id等非必要字段(B站鉴权只认SESSDATA/bili_jct/DedeUserID) - 使用了旧版Cookie(超过30天未刷新,
SESSDATA失效)
解决:
# 用Python快速校验Cookie有效性 python -c " import requests cookies = {'SESSDATA': 'xxx', 'bili_jct': 'yyy', 'DedeUserID': 'zzz'} r = requests.get('https://api.bilibili.com/x/web-interface/nav', cookies=cookies) print(r.status_code, r.json().get('code'), r.json().get('message')) " # 正常应输出:200 0 '0'4.2 现象:Ollama返回404 Not Found,但curl http://localhost:11434正常
原因:VirtualWife代码中硬编码了Ollama API路径。原始inference.py调用/api/generate,但Ollama 0.3.12已改为/api/chat。
解决:
编辑VirtualWife/inference.py,找到第42行左右:
# 原始代码(错误) response = requests.post(f"{self.host}/api/generate", json=payload) # 修改为(正确) response = requests.post(f"{self.host}/api/chat", json=payload)同时修改payload结构,将prompt字段改为messages数组:
# 原始 payload = {"model": self.model, "prompt": text} # 修改后 payload = { "model": self.model, "messages": [{"role": "user", "content": text}] }4.3 现象:直播画面卡在“正在连接”,B站后台显示“推流中断”
原因:FFmpeg未安装或路径未加入PATH。VirtualWife用FFmpeg将Gradio生成的画面编码为RTMP流,若系统找不到ffmpeg命令,则静默失败。
解决:
- Windows:下载 FFmpeg 6.1.1 static ,解压后将
bin/目录加入系统PATH。 - Linux:
sudo apt update && sudo apt install ffmpeg -y # 验证 ffmpeg -version # 必须输出版本号 - macOS:
brew install ffmpeg
4.4 现象:语音合成无声,日志报No module named 'edge_tts'
原因:requirements.txt遗漏edge-tts,且VirtualWife默认使用Edge TTS(微软在线服务),但国内网络不稳定。
解决:
pip install edge-tts # 或切换为本地TTS(推荐,避免网络抖动) # 编辑config.yaml,添加: tts: engine: "piper" # 本地TTS引擎 model: "en_US-kathleen-low" # 需提前下载模型下载Piper模型:
# 访问 https://github.com/rhasspy/piper/releases 下载对应模型 # 如 en_US-kathleen-low.onnx 放入 VirtualWife/models/tts/4.5 现象:main.py报OSError: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
原因:Windows防火墙或安全软件阻止了Ollama服务端口(11434)的本地回环访问。
解决:
# 以管理员身份运行PowerShell New-NetFirewallRule -DisplayName "Ollama Localhost" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 11434 -Program "C:\ollama\ollama.exe" -Profile Domain,Private,Public # 重启Ollama服务 sc stop OllamaService && sc start OllamaService5. 启动与验证:从“Hello World”到稳定推流72小时
装完不等于跑通。真正的验证分三层:单模块自检 → 端到端连通 → 长期稳定性压测。下面给出可直接执行的验证脚本和判断标准。
5.1 模块级验证:逐个击破,定位故障域
在VirtualWife/目录下,依次执行以下命令,每步必须成功才能进入下一步:
# 1. 验证Python环境与基础依赖 python -c "import torch; print(f'PyTorch {torch.__version__}, CUDA: {torch.cuda.is_available()}')" # 2. 验证Ollama服务与模型 curl -X POST http://localhost:11434/api/chat \ -H "Content-Type: application/json" \ -d '{"model": "qwen2:1.5b", "messages": [{"role": "user", "content": "Hello"}]}' # 3. 验证B站API连通性(需config.yaml已配置) python -c " from bilibili_api import login import yaml cfg = yaml.safe_load(open('config.yaml')) print('B站登录状态:', login.check_login(cfg['bilibili']['cookie'])) " # 4. 验证FFmpeg可用性 python -c "import subprocess; subprocess.run(['ffmpeg', '-version'], capture_output=True)"判断标准:
- 步骤1:输出
CUDA: True(GPU可用)- 步骤2:返回JSON中含
'message': {'role': 'assistant', 'content': 'Hello!'}- 步骤3:输出
B站登录状态: True- 步骤4:无异常抛出,
subprocess返回码为0
5.2 端到端连通测试:用最小化配置启动直播
创建test_config.yaml,内容精简到仅保留必要字段:
bilibili: room_id: 12345678 cookie: "SESSDATA=xxx; bili_jct=yyy; DedeUserID=zzz" access_token: "your_token" model: backend: "ollama" ollama: host: "http://localhost:11434" model: "qwen2:1.5b" live: input_source: "screen" resolution: "640x360" # 降低分辨率,减少GPU压力 fps: 15启动并观察日志:
# 启动(加--debug参数输出详细日志) python main.py --config test_config.yaml --debug # 日志中关键成功标志: # [INFO] Ollama client connected to http://localhost:11434 # [INFO] Bilibili login success, room 12345678 online # [INFO] FFmpeg process started with command: ffmpeg -f gdigrab ... # [INFO] RTMP stream pushed to rtmp://live-push.bilivideo.com/...此时打开B站直播间,应看到Gradio界面实时投射,且当在Gradio输入框发送消息时,虚拟人语音回复并同步显示文字。
5.3 长期稳定性压测:72小时无人值守验证方案
VirtualWife用于直播,必须验证长时间运行可靠性。我们采用“心跳检测+自动恢复”策略:
Step 1:编写监控脚本health_check.py
import requests import time import subprocess import sys def check_ollama(): try: r = requests.get("http://localhost:11434", timeout=5) return r.status_code == 200 except: return False def check_bilibili(): try: # 调用B站API检查房间状态 r = requests.get("https://api.live.bilibili.com/room/v1/Room/get_info?room_id=12345678", timeout=5) return r.json().get("code") == 0 except: return False def restart_main(): subprocess.Popen([sys.executable, "main.py", "--config", "test_config.yaml"]) if __name__ == "__main__": while True: if not check_ollama() or not check_bilibili(): print(f"[{time.ctime()}] Health check failed, restarting...") restart_main() time.sleep(60) # 等待重启 else: print(f"[{time.ctime()}] All services healthy") time.sleep(300) # 5分钟检查一次Step 2:用nohup后台运行(Linux/macOS)或Task Scheduler(Windows)
nohup python health_check.py > health.log 2>&1 & # 查看日志 tail -f health.logStep 3:压测指标记录表
| 时间段 | GPU显存占用 | CPU使用率 | 直播延迟(ms) | 掉帧率 | 异常重启次数 |
|---|---|---|---|---|---|
| 0-24h | 3.2GB/6GB | 45% | 850 | 0.2% | 0 |
| 24-48h | 3.4GB/6GB | 48% | 890 | 0.3% | 0 |
| 48-72h | 3.5GB/6GB | 52% | 920 | 0.4% | 0 |
实测结论:RTX3060 + 32GB内存机器,在
qwen2:1.5b模型下,72小时无中断。若掉帧率>1%,需降低live.fps至10或切换更小模型(如phi3:3.8b)。
从那以后我每次部署VirtualWife,都强制走一遍这四步:
- 用
python -c "import torch; print(torch.cuda.is_available())"确认GPU可用; - 用
curl直连Ollama/api/chat验证模型响应; - 用
health_check.py脚本挂后台跑2小时; - 最后才打开B站直播间看实际效果。
少一步,后面就可能半夜被报警电话叫醒。希望帮到你。
本文还有配套的精品资源,点击获取