PersonaPlex 7B 全双工语音模型
PersonaPlex-7B 可以同时听和说,所以你终于可以构建支持人类对话动态的语音 Agent,即附和、打断、重叠,而无需将 ASR、LLM 和 TTS 级联拼接在一起。
让我们看看该模型,如何运行实时服务器 + Web UI,角色控制如何工作(语音 + 角色提示),以及如何进行离线评估。
1、为什么全双工改变了语音 AI 的感觉
经典的语音助手通常是基于回合的。
用户说话,系统等待,然后响应。
这通常是因为 ASR > LLM > TTS 管道隐式地强制分割为说话者回合,并且它们在此过程中会产生额外的延迟并丢失非文本线索。
全双工口语对话模型将问题视为具有并行流(用户与 Agent)的语音到语音生成,因此模型可以在你说话时用“嗯哼”、“哦!”、快速澄清问题做出反应,甚至让你自然地插话。
PersonaPlex 保持了这些全双工动态,并且通过提示添加了角色控制(角色 + 语音)。
在顶层,该仓库包含:
moshi/,支持运行时(服务器 + 离线脚本)的 Python 包。client/,用于实时麦克风/扬声器交互的浏览器 UI。assets/,你可以用来测试的示例音频 + 提示文件。Dockerfile+docker-compose.yaml,容器化脚手架。
你将主要与 README 记录的两个入口点进行交互:
- 实时服务器:
python -m moshi.server ... - 离线评估:
python -m moshi.offline ...
2、架构思维模型
PersonaPlex 遵循 Moshi 的双工设置并接收三个流:
- 用户音频
- Agent 文本
- Agent 音频
音频使用神经音频编解码器 (Mimi) 转换为离散 token,然后由时间 + 深度变换器处理,并解码回波形。
PersonaPlex 是 7B 参数,并以 24 kHz 采样率运行音频。
3、混合系统提示(角色 + 语音)
PersonaPlex 引入了一个混合系统提示,它连接了:
- 一个文本提示段(角色调节),强制在 Agent 文本 通道上,同时保持 Agent 音频 静音
- 一个语音提示段(语音调节),其中在 Agent 音频 通道上提供简短的语音样本,同时填充 Agent 文本 通道
这就是实现零样本语音克隆的原因:在语音提示段之后,随后的 Agent 语音以该声音继续。
为了在系统提示期间进行稳定的调节,用户音频通道被替换为 440 Hz 正弦波,定界符标记系统提示和对话之间的边界。
4、本地运行 PersonaPlex 快速入门
Web UI 流式传输路径使用 Opus,因此首先安装 Opus 开发库:
# Ubuntu/Debian
sudo apt install libopus-dev
# Fedora/RHEL
sudo dnf install opus-devel
# macOS
brew install opus
克隆/下载仓库并安装:
pip install moshi/.
如果你使用的是 Blackwell 架构的 GPU,README 指出了一个额外的 torch 安装步骤。
PersonaPlex 权重托管在 Hugging Face 上,需要接受模型许可,然后设置 HF_TOKEN:
export HF_TOKEN="<YOUR_HUGGINGFACE_TOKEN>"
然后运行带有临时 SSL 证书的实时服务器:
SSL_DIR=$(mktemp -d)
python -m moshi.server --ssl "$SSL_DIR"
然后在 localhost:8998 打开 Web UI(如果是远程,则使用打印的访问链接)。
如果你没有足够的 GPU 内存,请使用 --cpu-offload 并安装 accelerate:
pip install accelerate
SSL_DIR=$(mktemp -d)
python -m moshi.server --ssl "$SSL_DIR" --cpu-offload
5、语音提示 + 角色提示
PersonaPlex 角色仅仅是 语音提示 + 文本提示。
- 语音提示:捕获音色/风格/韵律的音频嵌入
- 文本提示:自然语言角色/背景/上下文
该仓库附带预设的“语音嵌入”,标记为 NAT(更自然)和 VAR(更多样化)。
- 自然(女性):
NATF0…NATF3 - 自然(男性):
NATM0…NATM3 - 多样(女性):
VARF0…VARF4 - 多样(男性):
VARM0…VARM4
你可以像这样传递它们:--voice-prompt "NATF2.pt" 等。
6、效果良好的角色提示模式
助手角色,匹配 FullDuplexBench “用户打断”。
You are a wise and friendly teacher. Answer questions or provide advice in a clear and engaging way.
客户服务角色通常包括:
- 公司名称
- Agent 名称
- 所需的验证步骤
- 业务事实(价格/时间/政策)
- 特定场景约束
随意对话提示(推荐用于暂停处理/附和/平滑轮流评估类别):
You enjoy having a good conversation.
7、生成输出 WAV + 转录 JSON 的离线评估
离线模式流式传输输入 wav 并将模型输出流捕获到输出 wav(与输入持续时间相同)。
助手示例:
HF_TOKEN=<TOKEN> \
python -m moshi.offline \
--voice-prompt "NATF2.pt" \
--input-wav "assets/test/input_assistant.wav" \
--seed 42424242 \
--output-wav "output.wav" \
--output-text "output.json"
服务角色示例(添加文本提示):
HF_TOKEN=<TOKEN> \
python -m moshi.offline \
--voice-prompt "NATM1.pt" \
--text-prompt "$(cat assets/test/prompt_service.txt)" \
--input-wav "assets/test/input_service.wav" \
--seed 42424242 \
--output-wav "output.wav" \
--output-text "output.json"
你得到的是:
output.wav:Agent 音频流渲染回波形output.json:文本输出(用于调试角色依从性或内容)
8、如何评估“全双工质量”
PersonaPlex 在 FullDuplexBench 上进行评估,该基准测试测量轮流行为,如暂停处理、附和、平滑轮流和打断处理。
需要理解的关键指标是 接管率 (Takeover Rate, TOR):
- 接管发生在模型说话非静音(超出附和)并有效地“主导”回合时。
- TOR 是样本中平均接管发生率;不同的类别对“好”的 TOR 有不同的解释(例如,在暂停处理中,较低的 TOR 更好,因为你不想打断)。
PersonaPlex 的论文还介绍了 Service-Duplex-Bench,通过 350 个客户服务问题(在 400 个 FullDuplexBench 问题之上)扩展了 FullDuplexBench,以评估现实服务场景中的角色依从性。
9、将 PersonaPlex 集成到你自己的应用程序中
即使你从未接触过演示 UI,该仓库已经为你提供了一个工作模式:
浏览器/客户端 (麦克风 + 扬声器) + moshi.server (流式会话) + PersonaPlex 模型 (音频+文本 token 生成)你在产品中通常会做什么:
- 保持 PersonaPlex 作为专用的“流式语音大脑”服务,并在你的基础设施边界后面运行提供的服务器(或调整它)
- 当用户说话时从客户端发送连续音频
- 接收连续音频(Agent 语音),以及用于日志记录/分析的文本 token
- 通过更改混合提示输入(语音提示 + 角色提示)为每个会话交换角色
它的设计旨在保持双工行为,同时让你无需重新训练即可更改语音和角色。
原文链接: PersonaPlex 7B: "Wait… That Was a Bot?"
汇智网翻译整理,转载请标明出处