乐于分享
好东西不私藏

Persona:给AI语音助手装上一张会动的脸,通过MCP连接Codex

Persona:给AI语音助手装上一张会动的脸,通过MCP连接Codex
 🍄 原文发布于 blog.mushroom.cv

by Mycelium Protocol


AI 语音交互缺少的一件事:一张脸。

对话在进行,声音从扬声器里出来,但屏幕上什么都没有——没有眼神,没有表情,没有肢体语言。这不像在和一个存在者交流,更像在等一个返回值。

Persona(xikhar)就是为了补这个缺口,三天前发布,680 星,MIT。


它做什么

Persona 是一个 Electron 桌面应用,在你工作时悬浮在屏幕上,显示一个 VRM 3D 角色。当 Codex 或 ChatGPT 语音输出时,角色自动做嘴型同步和肢体动作;通过 MCP,AI Agent 还能主动触发命名动画——比如"思考""激动""挥手"。

架构分四层,职责很窄:

Native listeners   ← 系统音频捕获,仅计算 RMS 振幅,立即丢弃样本
Electron 主进程   ← 生命周期、托盘、MCP 服务器、URL 协议
Sandboxed preload ← 仅暴露归一化事件和狭窄设置操作
React + Three.js  ← VRM 渲染、VRMA 动画混合、表情驱动

渲染层没有文件系统、进程或原始音频访问权限。


隐私优先的音频捕获

Persona 监听的是 AI 应用的输出音频,不是麦克风。三个平台各有方案:

Linux(PipeWire): 轮询 PipeWire 图寻找 Codex/ChatGPT 播放节点,挂上 pw-record 捕获那一条流,内存中计算 RMS 振幅,每个样本计算完立即丢弃。

Windows(WASAPI loopback): 使用 PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE,仅捕获目标进程树的音频,其他应用的声音完全排除。需要 Windows 10 build 20348+。

macOS(Core Audio process tap): 为目标进程创建私有的、非静音的 Core Audio tap 和私有聚合设备,需要 macOS 14.2+ 和一次"系统音频录制"权限授权。

Persona 不捕获麦克风,不保存音频,不转录内容,不发送任何音频数据到网络。唯一用途:计算音量振幅驱动嘴型。


MCP 接口:Agent 控制角色

Persona 在 127.0.0.1:47831/mcp 运行一个 Streamable HTTP MCP 服务端。注册到 Codex:

codex mcp add persona --url http://127.0.0.1:47831/mcp

暴露四个工具:

工具用途
play_animation播放指定名称的动画(随机选一个 clip)
list_animations列出所有可用动画及其描述和触发场景
control_windowshow / hide / toggle 角色窗口
get_status读取模型就绪状态、窗口可见性、语音状态

每个自定义动画在创建时都要填写名称、描述和触发场景——这段元数据会直接暴露给连接的 Agent,让 AI 理解"什么情况下播放这个动作"。目录更新时,MCP 会立即推送工具列表变更通知给所有连接的 session。


动画系统

Persona 有两个永久动作槽:

  • **Idle**:闲置姿态
  • **Speaking**:说话时的肢体动作

每个槽都可以上传多个 .vrma 文件,Persona 在触发时随机选一个。自定义动作通过 Settings 面板创建,和 Idle/Speaking 一样可以放多个 clip。

MCP 触发的动画优先于音频驱动的肢体动作,但嘴型同步会继续——也就是说,AI Agent 可以让角色在"说话同时做波浪手"。动画播完后,自动回到当前的 idle/speaking 状态。

用户导入的 VRM/VRMA 文件存储在 Electron 的 per-user 应用数据目录,通过锁定的 persona-asset: 协议访问——渲染层不能把这个协议当成任意文件系统读取器。


URL 协议

安装包注册了 persona:// 协议,适合其他本地应用直接驱动角色状态:

open "persona://speaking?level=0.3"   # macOS
xdg-open "persona://thinking"          # Linux
start "persona://animation?name=wave1" # Windows

支持的状态:listening / thinking / speaking?level= / inactive / show / hide / toggle / animation?name=。


本地跑起来

# 环境要求:Node.js 24+
git clone https://github.com/xikhar/persona.git
cd persona
# 激活示例角色(仓库里的测试 VRM)
cp public/assets/library.json.example public/assets/library.json
cp public/assets/manifest.json.example public/assets/manifest.json
npm install
npm run demo

正式发布版的角色库是空的(版权原因),首次启动直接进 Settings,导入你自己的 .vrm 文件即可。任何符合 VRM 规范的角色都能用。


三天 680 星的原因

Persona 解决的问题不大,但击中了一个很真实的痛点:语音 AI 太"无形"了。

当你和 Codex 对话,它给你解释一段复杂代码,你希望有东西在那边"看着你"——不是一个进度条,不是一段打字动画,是一个有眼神、有表情、能感知声音的存在者。

这不是功能需求,是情感需求。Persona 用 VRM + MCP + 音频 tap 的组合,给这个需求一个具体的、可扩展的技术答案。


Mycelium Protocol — 追踪 AI 系统的底层演化


关于 Mycelium

菌丝协议。持续追踪 AI 工具、系统和实验的内容节点。


 
关于本号 · 免责声明
 
🍄 Mushroom Research Blog 是非营利、免费公开的个人科技观察博客与同名公众号,不接受商业合作、不代表任何企业或机构立场,也不谋求商业利益。我们以个人视角客观中立地记录和分析 AI、Web3 等领域的最新模型发布与技术动态,希望帮更多人获得有价值的一手科技认知,而非碎片化的信息噪音。
 
本文为作者基于公开信息的个人研究与观点整理,不代表文中提及公司/产品/模型的官方立场;文中引用的第三方商标、图片、数据等版权归原权利人所有,如有疏漏或侵权,请联系 hello@mushroom.cv,我们会尽快核实处理。内容仅为技术科普,不构成投资、法律等专业建议。
 
🍄
 
Mycelium Protocol
 
数字公共物品 · 开源免费无许可
 
   🎵 表达者    |    🎨 创造者    |    🔨 建设者  
 
   🪵 Infras    |    🦠 Protocols    |    🕸️ Networks  
 
   📍 blog.mushroom.cv · Apache 2.0  

相关学习资料