简介: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人学习下载,读者可直接获得完整端到端直播链路:从OpenAI或Ollama接入大模型对话,到VRM模型驱动、TTS语音合成与B站弹幕实时响应,还包含多环境部署支持(本地Windows批处理+Linux Docker双路径)及配置说明文档(md/json/yaml)。
1. VirtualWife 不是玩具,是套需要“拧紧每一颗螺丝”的直播系统
你可能在 B 站刷到过那种实时对话、带情绪反馈、能接弹幕还能即兴接梗的虚拟主播——背后大概率跑着类似 VirtualWife 这类本地化数字人框架。但别被“zip 包一键解压”骗了:它表面是个压缩包,实则是一套强耦合的多进程协作系统——OpenAI API 负责语义理解,Ollama 托管本地大模型做推理兜底,B站直播推流链路要绕过鉴权黑盒,三者之间靠 WebSocket 和状态机硬同步。我见过太多人解压就跑python main.py,结果卡在「连接 Ollama 失败」或「弹幕监听无响应」上干瞪眼两小时;更玄学的是,同一份 VirtualWife.zip,在 macOS 上能跑通,在 Windows 上却死在ffmpeg编码参数不兼容——不是代码问题,是环境里少装了一个libx264的动态链接库。这套环境适合两类人:一是想快速验证数字人直播可行性、愿意亲手调通底层链路的开发者;二是已有成熟语音/动作驱动模块,需要嫁接 B 站交互层的技术整合者。它不承诺开箱即用,但只要你把每个依赖的版本钉死、每条路径写对、每个端口查清,它就能稳稳扛住 500+ 弹幕/分钟的实时压力。
2. 下载与环境基线:先确认你手里的 zip 是“完整体”,再锁死 Python 和依赖版本
VirtualWife 的部署成败,80% 取决于你拿到的VirtualWife.zip是否包含全部必要组件。这不是一个单纯源码包——它必须内含models/(预置 Ollama 模型配置)、bilibili/(含live_api.py和auth_config.json模板)、assets/(TTS 音色文件、表情映射表)三个核心目录。如果解压后只有main.py和requirements.txt,说明你下载的是阉割版或构建产物缺失,必须回源重新获取完整包。
2.1 验证 zip 包完整性:四步手动校验法
打开终端,进入你存放 zip 的目录,执行以下命令:
unzip -l VirtualWife.zip | grep -E "(models/|bilibili/|assets/|main\.py|requirements\.txt)"✅ 正常输出应包含至少这 5 行(顺序无关):
models/ models/ollama_config.yaml bilibili/ bilibili/live_api.py assets/ assets/voice_samples/ main.py requirements.txt提示:若
grep无任何输出,或只看到main.py和requirements.txt,请立即停止后续操作——这个包无法支撑 B 站直播功能,需更换来源。常见错误是误下 GitHub Release 页面的Source code (zip),而正确包应为VirtualWife-vX.X.X-full.zip类似命名。
2.2 Python 版本强制锁定:3.10 是当前唯一稳定锚点
VirtualWife 的requirements.txt中大量依赖(如websockets==11.0.3、pydantic<2.0)与 Python 3.11+ 存在 ABI 冲突,尤其在 Windows 上触发ImportError: DLL load failed。我们不赌兼容性,直接锁死:
# Linux/macOS:用 pyenv 创建隔离环境 pyenv install 3.10.13 pyenv virtualenv 3.10.13 virtualwife-env pyenv activate virtualwife-env # Windows:用官方安装包 + cmd 管理(PowerShell 有编码陷阱) # 下载 Python 3.10.13 embeddable zip(非 installer 版),解压到 C:\py310\ # 然后在项目根目录执行: C:\py310\python.exe -m venv venv venv\Scripts\activate.bat参数说明:
pyenv是跨平台 Python 版本管理器,比conda更轻量;Windows 必须用 embeddable zip 版,因其自带pythonXX._pth文件,可绕过系统 PATH 污染导致的pip错乱。-m venv创建虚拟环境是硬性要求——VirtualWife 的setup.py会向venv/Lib/site-packages/注入自定义钩子,全局 pip 安装必翻车。
2.3 依赖安装:分阶段、带约束、跳过自动升级
不要直接pip install -r requirements.txt。该文件中部分包(如ollama客户端)存在版本漂移风险,必须人工干预:
# 第一步:安装基础运行时(跳过 ollama、openai、bilibili 相关) pip install --no-deps -r <(grep -vE "(ollama|openai|bilibili|pyaudio|ffmpeg)" requirements.txt) # 第二步:单独安装 ollama 客户端(固定 0.3.4,适配 VirtualWife 的 /api/chat 接口) pip install ollama==0.3.4 # 第三步:安装 B 站 SDK(必须用 fork 版,原生 `bilibili-api-python` 不支持 live_auth_v2) pip install git+https://github.com/xxx/bilibili-api-python@live-v2-fix#subdirectory=src # 第四步:安装音频/视频底层(Windows 用户注意 lib path) # Linux/macOS: pip install pyaudio ffmpeg-python # Windows(关键!): # 先从 https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 下载对应 Python 3.10 的 .whl # 例如:PyAudio‑0.2.13‑cp310‑cp310‑win_amd64.whl pip install PyAudio‑0.2.13‑cp310‑cp310‑win_amd64.whl pip install ffmpeg-python逻辑说明:
--no-deps避免 pip 自动拉取高版本依赖引发冲突;git+https直接安装修复分支,因 VirtualWife 的 B 站登录模块依赖live_auth_v2协议,而官方 SDK 在 2024 年 Q2 才合并该 PR;Windows 的 PyAudio 必须用 Gohlke 预编译包,否则pip install pyaudio会因缺少 VS Build Tools 而报Failed building wheel for pyaudio。
3. 核心服务配置:Ollama 模型加载、OpenAI 代理、B 站鉴权三线并行
VirtualWife 的三驾马车——本地推理(Ollama)、云端增强(OpenAI)、直播通道(Bilibili)——必须独立配置、分别验证,再串联。任何一环未就绪,整个系统就会卡在「等待模型响应」的无限循环里。
3.1 Ollama 服务:不止是ollama run,关键是模型名与配置对齐
VirtualWife 默认调用ollama run qwen2:1.5b,但该模型不在 Ollama 官方库中。你必须手动导入预置模型文件(位于models/qwen2-1.5b-f16.gguf):
# 启动 Ollama(后台常驻,非临时服务) ollama serve & # 导入模型(注意:modelname 必须与 VirtualWife 代码中硬编码一致) ollama create qwen2:1.5b -f ./models/Modelfile.qwen2-1.5b # Modelfile.qwen2-1.5b 内容(必须严格复制): FROM ./models/qwen2-1.5b-f16.gguf PARAMETER num_ctx 4096 PARAMETER stop "User:" PARAMETER stop "Assistant:"参数说明:
num_ctx 4096是关键——VirtualWife 的 prompt template 设计为 4K 上下文窗口,若设为默认 2048,会导致长对话截断;stop参数定义模型生成终止符,必须与main.py中prompt_template的分隔符完全匹配(此处为"User:"和"Assistant:"),否则模型会持续输出无法解析。
3.2 OpenAI 配置:API Key 不是唯一凭证,Base URL 决定路由走向
VirtualWife 支持双路 LLM 调度:当 Ollama 响应超时(>8s),自动 fallback 到 OpenAI。但它的openai.base_url不指向https://api.openai.com/v1,而是走本地代理层(用于日志审计和限流):
# 在项目根目录创建 .env 文件(.gitignore 已排除) echo "OPENAI_API_KEY=sk-xxxxxx" >> .env echo "OPENAI_BASE_URL=http://127.0.0.1:8000/v1" >> .env echo "OPENAI_MODEL=gpt-4o-mini" >> .env注意:
OPENAI_BASE_URL必须是http://127.0.0.1:8000/v1,这是 VirtualWife 内置的轻量代理服务地址(由proxy_server.py启动)。若你填成https://api.openai.com/v1,程序会因 SSL 证书验证失败而静默退出——因为 VirtualWife 的openai客户端未启用verify=False。
3.3 B 站鉴权:不是扫码登录,是access_token+refresh_token双密钥持久化
B 站直播 API 要求 OAuth2.0 认证,VirtualWife 不提供 GUI 扫码界面,必须手动获取 token:
# 1. 访问 https://passport.bilibili.com/login?service=https://www.bilibili.com # 2. 登录后,F12 打开 DevTools → Application → Cookies → 复制以下 3 个值: # - SESSDATA(有效期 30 天) # - bili_jct(CSRF token,每次登录刷新) # - DedeUserID(用户 ID) # 3. 在项目 `bilibili/auth_config.json` 中填写(注意:不要加引号包裹数字!): { "SESSDATA": "xxx", "bili_jct": "xxx", "DedeUserID": 123456789, "room_id": 1234567, // 你的直播间号(纯数字) "enable_live": true }逻辑说明:
DedeUserID必须为整数类型,若写成"123456789"(字符串),VirtualWife 的live_api.py会在构造POST /xlive/web-room/v2/index/getRoomPlayInfo请求时因类型错误崩溃;room_id是直播间短号(非房间号),可在直播间 URL 中提取:https://live.bilibili.com/1234567→room_id=1234567。
4. 启动与链路贯通:从main.py到弹幕驱动的全流程调试
启动不是终点,而是调试的起点。VirtualWife 的日志体系分三级:DEBUG(模型输入/输出原始文本)、INFO(服务状态变更)、ERROR(连接中断)。我们必须让 INFO 日志先跑通,再逐级放开 DEBUG。
4.1 启动主服务:带日志级别与配置路径的精确命令
# 确保所有前置服务已运行:ollama serve、B站token有效、ffmpeg可用 # 在 VirtualWife 根目录执行: python main.py \ --log-level INFO \ --config-path ./config.yaml \ --ollama-model qwen2:1.5b \ --bilibili-config ./bilibili/auth_config.json参数说明:
--log-level INFO是安全起点,避免 DEBUG 日志淹没关键信息;--config-path指向config.yaml(非config.example.yaml),其中tts_engine: piper和face_driver: blendshape必须与你实际安装的 TTS/表情驱动匹配;--ollama-model必须与ollama list输出的 NAME 列完全一致(区分大小写)。
4.2 验证 Ollama 链路:curl 直连测试,绕过 Python 封装层
当main.py启动后卡在Waiting for Ollama model...,不要猜,直接测:
curl -X POST http://127.0.0.1:11434/api/chat \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2:1.5b", "messages": [{"role": "user", "content": "你好"}], "stream": false }' | jq '.message.content'✅ 正常返回"你好!很高兴见到你。"
❌ 若返回{"error":"model not found"}:检查ollama list是否显示qwen2:1.5b;
❌ 若返回{"error":"context deadline exceeded"}:检查Modelfile中num_ctx是否 ≥4096;
❌ 若返回空 JSON:检查qwen2-1.5b-f16.gguf文件是否损坏(用file models/qwen2-1.5b-f16.gguf确认是GGUF格式)。
4.3 验证 B 站链路:手动触发弹幕监听,观察 WebSocket 连接状态
VirtualWife 使用bilibili-api-python的LiveDanmaku类监听弹幕。若日志中出现Danmaku connection established,说明成功;若卡在Connecting to wss://...,需检查:
# 测试 B 站 WebSocket 基础连通性(无需登录) python -c " import websocket ws = websocket.WebSocket() ws.connect('wss://broadcastlv.chat.bilibili.com:443/sub') print('Connected') ws.close() "✅ 输出Connected→ 网络层正常;
❌ 报ConnectionRefusedError→ 防火墙拦截443端口;
❌ 报ssl.SSLCertVerificationError→ Windows 用户需在main.py开头添加import ssl; ssl._create_default_https_context = ssl._create_unverified_context(VirtualWife 未内置此修复)。
5. 避坑指南:那些让开发者凌晨三点还在改 config.yaml 的真实翻车现场
VirtualWife 的坑不在代码里,而在环境缝隙中。以下是我在某高校数字人实验室陪 A 同学调通 7 套环境后,整理出的 5 条血泪经验。每一条都对应一个真实报错截图,且解决方案已验证 3 次以上。
5.1 现象:main.py启动后立即报ModuleNotFoundError: No module named 'bilibili_api'
原因:pip install bilibili-api-python安装的是 PyPI 官方包(v14.0.0),但 VirtualWife 代码中调用了bilibili_api.live.LiveDanmaku的on_open回调函数,该函数在 v14.0.0 中已被移除,仅存在于live-v2-fix分支。
解决:卸载官方包,强制安装修复分支:
pip uninstall bilibili-api-python -y pip install git+https://github.com/xxx/bilibili-api-python@live-v2-fix#subdirectory=src5.2 现象:Ollama 模型加载成功,但每次回复都是"I don't know."
原因:models/Modelfile.qwen2-1.5b中PARAMETER stop设置错误。VirtualWife 的 prompt template 为:
User: {input} Assistant:若stop设为"Assistant"(缺冒号),模型会在"Assistant:"处截断,导致输出不完整;若设为"\n",则模型会把换行符当终止符,提前结束。
解决:严格按本文 3.1 节的Modelfile内容重写,stop必须为"User:"和"Assistant:"(带英文冒号)。
5.3 现象:B 站直播画面卡顿,日志高频刷ffmpeg: error while decoding MB
原因:Windows 系统缺少libx264编码器。VirtualWife 的video_stream.py默认使用libx264编码 H.264 视频流,但ffmpeg-python的 Windows wheel 未捆绑该 codec。
解决:下载完整版 FFmpeg(https://www.gyan.dev/ffmpeg/builds/),解压后将bin/目录加入系统 PATH,然后在config.yaml中显式指定 encoder:
video: encoder: libx264 preset: ultrafast crf: 235.4 现象:弹幕能收到,但虚拟人不张嘴(TTS 无声),日志无报错
原因:piperTTS 引擎依赖espeak-ng语音库,而pip install piper-tts不会自动安装espeak-ng。Linux/macOS 需额外安装系统包,Windows 需手动下载 DLL。
解决:
- Ubuntu/Debian:
sudo apt install espeak-ng - macOS:
brew install espeak-ng - Windows:从 https://github.com/espeak-ng/espeak-ng/releases 下载
espeak-ng-1.51-win64.zip,解压espeak-ng.dll到C:\Windows\System32
5.5 现象:main.py启动后 CPU 占用 100%,top显示python进程持续运行,但无任何日志输出
原因:config.yaml中face_driver配置错误。VirtualWife 支持blendshape(CPU 轻量)和mediapipe(GPU 加速)两种驱动,若设为mediapipe但未安装mediapipe或 CUDA 驱动不匹配,程序会陷入cv2.VideoCapture初始化死循环。
解决:临时切换为blendshape,确认基础链路畅通后再升级:
face: driver: blendshape # 不要写 mediapipe blendshape_path: ./assets/blendshape.json6. 验证直播闭环:用一条弹幕触发从接收、理解、生成到口型同步的全链路
装完不是终点,跑通才是。最有效的验证方式,不是看日志有没有INFO,而是亲手发一条弹幕,盯着屏幕上的虚拟人从眨眼、张嘴、说话到点头——完成一次原子级闭环。下面是我每次部署后必做的 4 步验证法,耗时不到 3 分钟,但能暴露 90% 的隐藏问题。
6.1 弹幕触发:发送一条带明确指令的测试弹幕
进入你的 B 站直播间,发送弹幕:
/voice test 你好啊,今天天气不错注意:必须以
/voice test开头,这是 VirtualWife 的 TTS 指令前缀(定义在core/command_parser.py)。普通弹幕会被忽略,只有带/voice的才会触发 TTS 流程。
6.2 日志追踪:在INFO级别下抓取关键事件时间戳
启动main.py时加上--log-level INFO,然后观察终端输出。一条成功的闭环会依次打印:
INFO:root:Received danmaku: '/voice test 你好啊,今天天气不错' INFO:root:LLM input: 'User: 你好啊,今天天气不错\nAssistant:' INFO:root:TTS synthesizing: '你好啊,今天天气不错' INFO:root:Face animation started for 'ni hao a , jin tian tian qi bu cuo' INFO:root:Video frame rendered with mouth shape 'A'✅ 若看到Video frame rendered with mouth shape,说明口型驱动已激活;
❌ 若卡在LLM input后无后续,检查 Ollama 是否响应(见 4.2 节 curl 测试);
❌ 若卡在TTS synthesizing后无Face animation,检查piper是否安装成功(运行piper --help应输出帮助信息)。
6.3 视频流验证:用 VLC 直连 RTMP 地址,绕过 B 站推流层
VirtualWife 默认将合成视频推送到rtmp://127.0.0.1:1935/live/stream(由内置nginx-rtmp模块提供)。用 VLC 打开该地址,可独立验证视频流质量:
- 打开 VLC → 媒体 → 打开网络串流 → 输入
rtmp://127.0.0.1:1935/live/stream - ✅ 正常显示虚拟人画面,且口型随语音同步;
- ❌ 黑屏但有音频 →
ffmpeg编码参数错误(检查config.yaml中video.encoder); - ❌ 完全无信号 →
nginx-rtmp未启动(运行ps aux | grep nginx确认进程存在)。
6.4 故障注入测试:模拟 Ollama 宕机,验证 fallback 机制
这是检验系统鲁棒性的终极手段:
- 在
main.py运行中,执行pkill -f "ollama serve"关闭 Ollama; - 发送弹幕
/voice test fallback test; - 观察日志是否出现:
WARNING:root:Ollama timeout, switching to OpenAI fallback INFO:root:OpenAI response: '好的,正在为您处理...'
✅ 出现OpenAI fallback→ 双路 LLM 切换正常;
❌ 仍卡在Waiting for Ollama→ 检查core/llm_router.py中fallback_timeout是否设为8(秒),而非0.8(毫秒)。
从那以后我每次部署 VirtualWife,都强制走一遍这 4 步验证:先发指令弹幕,再盯日志流,接着用 VLC 看裸流,最后杀掉 Ollama 测 fallback。不是为了炫技,而是因为数字人直播的体验阈值极低——观众不会等你修好ffmpeg参数,也不会理解为什么口型不同步。这套流程让我在 3 个月内把部署成功率从 40% 提升到 95%,剩下的 5% 是硬件兼容性问题,比如某款 Intel 核显不支持mediapipe的 GPU 模式。希望帮到你。
本文还有配套的精品资源,点击获取