Open-LLM-VTuber v1.2.1 部署实测:M5 Pro 本地语音对话
在 Apple Silicon M5 Pro 上部署 Open-LLM-VTuber v1.2.1,使用 Ollama、SenseVoiceSmall、Edge TTS 和默认 Live2D 角色跑通真实麦克风语音对话,并记录性能与排障过程。
这次不只验证“服务能启动”,而是把 Open-LLM-VTuber 的整条语音链路都跑了一遍:实体麦克风收音、SenseVoiceSmall 识别、Ollama 本地大模型回复、Edge TTS 合成中文语音,最后由 Live2D 角色同步播报。
实测机器是 48 GB 内存的 Apple M5 Pro MacBook Pro。最终默认 Mao 角色可以正常显示、说话和做表情,文字聊天、实体麦克风语音聊天与打断也都通过。
这套 Open-LLM-VTuber M5 Pro 配置最终跑通了吗?
跑通了。Chrome 能连接本地服务,默认 Live2D 角色正常加载;说出“我们来测试一下语音聊天”后,语音依次经过 ASR、LLM 和 TTS,角色用中文语音回复并回到空闲状态。
本次实测配置如下:
| 项目 | 实测值 |
|---|---|
| 实测日期 | 2026-08-28 |
| macOS | 26.6(Build 25G72) |
| 架构 | arm64,原生 Apple Silicon |
| 芯片 / 内存 | Apple M5 Pro,18 核 CPU / 20 核 GPU,48 GB 内存 |
| Open-LLM-VTuber | v1.2.1 |
| Git commit | 3afa41014b4548a0842e9ee2f576f4b164b48886 |
| Python | CPython 3.10.20,由 uv 管理 |
| uv | 0.11.32,aarch64 |
| FFmpeg | 9.0.1 |
| Ollama | 0.33.0 |
| LLM | qwen2.5:latest,下载体积约 4.7 GB,运行占用约 5.7 GB |
| ASR | sherpa-onnx SenseVoiceSmall,CPU 推理 |
| TTS | Edge TTS 7.2.8,zh-CN-XiaoxiaoNeural |
| Live2D | 项目自带 mao_pro |
| Translator | 关闭 |
在 M5 Pro 上部署前需要准备什么?
先确认机器架构和已有工具,缺什么再安装什么:
sw_vers
uname -m
sysctl -n machdep.cpu.brand_string 2>/dev/null || true
git --version
brew --version
python3 --version
uv --version
ffmpeg -version
ollama --version
uname -m 应返回 arm64。这套方案不需要 Rosetta、CUDA、NVIDIA 依赖、Conda、Docker,也不需要重新构建前端。
如果缺少 FFmpeg 或 Ollama,可以通过 Homebrew 安装:
brew install ffmpeg ollama
brew services start ollama
如果 Ollama 已经作为服务正常运行,就不用重复启动。
如何获取 Open-LLM-VTuber v1.2.1 稳定版?
新目录建议递归克隆指定 tag,因为前端通过 Git submodule 集成:
git clone --recursive --branch v1.2.1 \
https://github.com/Open-LLM-VTuber/Open-LLM-VTuber.git
cd Open-LLM-VTuber
git status
git submodule status
本机实际工作目录是:
/Users/oyjq/Documents/ChatGPT/open-llm-vtuber
如果目录已经存在,先执行 git status。不要直接删除目录、覆盖文件或 reset,避免丢掉已有配置和用户修改。
如何用 uv 安装项目的 Python 环境?
v1.2.1 的 .python-version 指定 Python 3.10,直接让 uv 管理兼容解释器和虚拟环境:
uv sync
uv run python --version
本次得到原生 arm64 CPython 3.10.20,虚拟环境位于项目的 .venv。首次同步还会下载并安装项目依赖,网络较慢时要多等一会儿。
如何准备 Ollama 和 qwen2.5 模型?
先检查本机模型列表和 Ollama API:
ollama list
curl http://localhost:11434/api/tags
没有可用模型时,拉取官方 Quick Start 使用的模型:
ollama pull qwen2.5:latest
本次下载体积约 4.7 GB。在这台 M5 Pro 上,Ollama 显示模型以 100% GPU 方式运行,context 为 32768。第一次正式对话前可以先发一条短请求预热,但不是必需步骤。
Open-LLM-VTuber 的中文配置怎么写?
不要凭记忆重写整份 YAML,直接复制项目自带的中文模板:
cp config_templates/conf.ZH.default.yaml conf.yaml
本次 conf.yaml 与 v1.2.1 中文模板逐字节一致。与首次验证有关的关键配置是:
character_config:
live2d_model_name: 'mao_pro'
agent_config:
conversation_agent_choice: 'basic_memory_agent'
agent_settings:
basic_memory_agent:
llm_provider: 'ollama_llm'
llm_configs:
ollama_llm:
base_url: 'http://localhost:11434/v1'
model: 'qwen2.5:latest'
asr_config:
asr_model: 'sherpa_onnx_asr'
tts_config:
tts_model: 'edge_tts'
edge_tts:
voice: zh-CN-XiaoxiaoNeural
SenseVoiceSmall 会下载到:
models/sherpa-onnx-sense-voice-zh-en-ja-ko-yue-2024-07-17
本次模型目录约 1.1 GB。ASR 使用 CPU provider,不要在 Apple Silicon 上照抄 CUDA 配置。
Edge TTS 返回 403 怎么解决?
v1.2.1 原锁文件中的 Edge TTS 7.0.0 在本次验证时返回 HTTP 403。上游也有相同现象的 edge-tts issue #463。
只升级这个包,再同步虚拟环境:
uv lock --upgrade-package edge-tts
uv sync
本次升级到 Edge TTS 7.2.8 后恢复正常。升级会修改 uv.lock,并移除旧的 srt 依赖,但不需要改 Open-LLM-VTuber 源码。
为什么本地 Ollama 会被系统代理转发?
本机的 macOS HTTP/HTTPS 代理位于 127.0.0.1:1082。Python HTTP 客户端没有自动采用 macOS 的代理例外列表,访问本地 Ollama 时因此得到 503。
启动服务时显式让 localhost 直连:
NO_PROXY=localhost,127.0.0.1,::1 \
no_proxy=localhost,127.0.0.1,::1 \
uv run run_server.py
这是本机网络环境所需的启动参数,不是项目源码修改。看到服务监听 http://localhost:12393 后,用 Chrome 打开:
http://localhost:12393/
第一次使用时,允许 Chrome 获取麦克风权限。官方文档也特别提醒:如果代理开启后本地 Ollama 无法访问,应确保代理绕过 localhost。
如何验证麦克风到 Live2D 的完整链路?
只看到网页打开还不够,建议按下面的顺序逐层验证,这样出错时更容易定位。
1. 检查页面和 Live2D
- 页面状态显示“已连接”。
- 默认 Mao 角色、背景、动作和表情正常加载。
- moc3、贴图、物理、姿态、8 个表情和 7 个动作资源均返回 200。
- 没有阻塞使用的 500 或关键资源加载失败。
2. 先测试文字聊天
输入:
你好,请用一句话介绍一下你自己。
确认左侧出现用户消息和 AI 回复,右侧能看到字幕与角色说话动作。文字聊天正常,说明浏览器、后端和 Ollama 基本连通。
3. 单独确认 TTS
需要同时确认:
- 中文语音能够播放;
- 多个音频分段按顺序播放,没有重复;
- 角色说话时有动作和口型音量数据;
- 播放结束后状态回到“空闲”。
4. 使用实体麦克风
点击左下角麦克风按钮,按钮变绿后说:
你好,今天我们来测试一下语音聊天。
本次 Chrome 识别到核心语句“我们来测试一下语音聊天”,AI 随后返回中文语音,Live2D 同步说话并回到空闲。句首问候被 VAD 截掉,但完整链路已经通过;另一次“听得到吗”被准确识别。
5. 验证打断
在 AI 第一段音频开始后发送新语音。后端日志应记录上一条 conversation 被中断,并启动新的 conversation。已有一小段在途音频可能继续到达,随后会切换到新回复。
M5 Pro 上的实际性能怎么样?
这套默认配置以实时响应为优先。短时测试期间,48 GB 内存没有出现 Swap,也没有观察到持续高 CPU、明显发热或降频。
| 指标 | 实测值 |
|---|---|
| 空闲服务 RSS | 约 6.7 GiB 合计 |
| Python 后端 | 约 1.10 GiB RSS |
| Ollama runner | 约 5.54 GiB RSS |
| Ollama serve | 约 59 MiB RSS |
| 短语音测试首次可播放音频 | 约 2.9 秒 |
| 短语音测试后端完成 | 约 3.8 秒 |
| Chrome 实体麦克风本轮完整回复 | 约 13 秒,回复包含多句话 |
| Python 对话期 CPU | 平均约 2.9%,峰值约 9.4% |
| Ollama runner 对话期 CPU | 平均约 28.9%,峰值约 112.1%,约等于 1.1 个 CPU 核 |
| Ollama 处理器 | 100% GPU |
| Swap | 0 |
| 内存压力 | 正常,约 83% 可用 |
这组数据只代表本机、当时版本和一次短时对话链路,不应当作跨机器基准。对首次验证来说,当前 4.7 GB 的 qwen2.5 模型响应更轻,不必一开始就换成体积大得多的模型。
实测中还有哪些不阻塞使用的问题?
- 前端首次初始化会短暂请求
/undefined/undefined.model3.json并返回 404,之后仍会加载正确的mao_pro资源,角色可以正常出现。 - 页面重载或自动化截图切换焦点时,Console 偶尔出现
Canvas is null, skipping resize和 Live2D 旧实例释放警告。正常交互没有崩溃;如果角色暂时未绘制,点击角色画布或刷新一次即可恢复。 - 个别模型回复会把
[smirk]一类表情标签显示在聊天文本里,但不影响 TTS、字幕、动作和完整语音链路。 - 实体麦克风测试中,VAD 截掉了测试句开头。可以在按下麦克风后稍等半秒、靠近麦克风或提高音量,再考虑微调 VAD 阈值。
这些现象都没有阻塞本次“麦克风 → ASR → LLM → TTS → Live2D”的成功标准,因此没有为它们修改上游源码。
以后再次启动需要执行哪些命令?
如果 Ollama 已经作为 Homebrew 服务运行,只需要:
cd /Users/oyjq/Documents/ChatGPT/open-llm-vtuber
NO_PROXY=localhost,127.0.0.1,::1 \
no_proxy=localhost,127.0.0.1,::1 \
uv run run_server.py
然后在 Chrome 打开 http://localhost:12393/。
如果 Ollama 没有运行,先执行:
brew services start ollama
curl http://localhost:11434/api/tags
停止 Open-LLM-VTuber 时,在服务器终端按 Control-C。Ollama 可以继续作为后台服务运行。
本次部署修改和下载了什么?
conf.yaml:从config_templates/conf.ZH.default.yaml复制,内容没有自行改写。uv.lock:Edge TTS 从 7.0.0 升级到 7.2.8,并移除srt依赖。- 项目源码:未修改。
- Live2D:使用项目自带默认模型,没有添加第三方角色。
- Ollama:下载
qwen2.5:latest,约 4.7 GB。 - ASR:下载 SenseVoiceSmall,约 1.1 GB。
- 系统软件:通过 Homebrew 安装 FFmpeg 9.0.1 和 Ollama 0.33.0。
- 没有安装 CUDA、NVIDIA 包、Conda 或 Docker。
Open-LLM-VTuber 在 Apple Silicon 上的常见问题
Apple Silicon 必须安装 Rosetta 吗?
这次不需要。Git、uv、CPython、FFmpeg 和 Ollama 都以 arm64 原生方式运行,uname -m 返回 arm64。
M5 Pro 可以完全离线运行吗?
当前组合不能完全离线。Ollama 和 SenseVoiceSmall 在本机运行,但 Edge TTS 需要联网。若要离线,需要把 TTS 也替换为本地方案,并重新验证延迟和音质。
为什么 Ollama API 正常,Open-LLM-VTuber 仍然返回 503?
优先检查系统代理。先用 curl http://localhost:11434/api/tags 验证 Ollama,再用 NO_PROXY 和 no_proxy 明确绕过 localhost、127.0.0.1 与 ::1。
麦克风句首总被截掉怎么办?
先在按钮变绿后等半秒再开口,并靠近麦克风、提高说话音量。如果仍然稳定丢失句首,再小幅调整 VAD 阈值,每次只改一个变量后复测。
这次 Open-LLM-VTuber M5 Pro 部署实测说明了什么?
Open-LLM-VTuber v1.2.1 可以在 Apple Silicon M5 Pro 上用原生 arm64 环境完成真实语音对话。默认的 Ollama、SenseVoiceSmall、Edge TTS 和 mao_pro 组合已经足够验证完整链路,48 GB 内存也有充足余量。
真正影响首次跑通的不是算力,而是依赖和网络细节:Edge TTS 7.0.0 的 403 需要定向升级,系统代理则要显式绕过 localhost。先固定这套可工作的基线,再逐步调整人设、TTS、原创 Live2D、OBS 和弹幕互动,比一次同时替换所有模块更容易定位问题。
参考资料
相关文章
ai-coding
ChatGPT Pro 隐藏用法:不用一直守着 Codex,也能远程操作电脑开发
通过 ChatGPT 插件、GitHub 和 Remote Desktop Commander 远程连接开发机,在普通聊天中读取代码、执行命令、修改项目并运行测试,附安装步骤、适用场景与安全提醒。
ai-coding
windows10安装trae提示不支持安装
windows10安装trae提示不支持安装 解决办法 缺少工具集 powershell 参考地址:
tools
震惊,项目编码竟然可以被996指数化
大家好,最近逛 Github 发现一开源项目,可以分析出我们的真实编码强度,看看我们是真的996还是摸鱼的。简介code996 是一个代码分析工具,它将 Git 项目中的 commit 时间分布进行了可视化的展示,进而可以轻松的看出编码工作的实际强度。使用linux 环境在 Git
这篇文章有帮助吗?
感谢反馈。