news 2026/9/2 22:30:45

PersonaPlex /api/chat WebSocket API 参考:全参数完整文档

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PersonaPlex /api/chat WebSocket API 参考:全参数完整文档

PersonaPlex /api/chat WebSocket API 参考:全参数完整文档

【免费下载链接】personaplexPersonaPlex code.项目地址: https://gitcode.com/GitHub_Trending/pe/personaplex

PersonaPlex 是一个实时、全双工的语音对话大模型(基于 Moshi 架构),你可以对着麦克风与它"自然说话",它还能被打断、能抢话、能同步输出文字。本文以/api/chat WebSocket 接口为核心,用表格和流程图讲清楚:连接参数、16 种音色、二进制消息协议和常见问题,帮新手快速接入自己的语音对话客户端。

一分钟看懂 PersonaPlex 架构

一句话理解数据流向:

  1. 浏览器(或你的客户端)通过WebSocketOpus 编码的音频流发给服务器;
  2. 服务器上的 Mimi 编码器把音频变成 token,LM(语言模型)结合角色 Prompt音色 Prompt实时生成回复 token;
  3. 回复音频以 Opus 流返回,同时逐词推送文字转写,实现"边说边打字"的效果。

核心服务端逻辑位于 moshi/moshi/server.py,接口注册在 server.py 一行:/api/chat是唯一需要掌握的端点。

接口基础信息:如何连接到 /api/chat

项目说明
端点GET /api/chat(握手后升级为 WebSocket)
协议ws://(本地 HTTP)或wss://(启用 SSL 时)
默认端口8998
消息类型纯二进制帧(binary frame),首字节标识消息类型
并发能力服务器用全局锁串行化会话,同一时刻只服务一个活跃会话

启动服务后(详见 README.md):

SSL_DIR=$(mktemp -d); python -m moshi.server --ssl "$SSL_DIR"

客户端如何拼装 URL,参考 Conversation.tsx 中的buildURL函数:先取协议(wswss),再向/api/chat追加全部查询参数。

连接参数详解:Query 参数全表

所有参数都通过URL 查询字符串传递,连接建立前就生效,对话中途不可修改。

核心参数(服务器端实际读取)

参数必填默认值说明
voice_prompt✅ 必填NATF0.pt音色文件文件名,如NATF2.ptVARM3.pt,必须在服务器音色目录中存在
text_prompt✅ 必填(可为空串)见下方示例角色设定文本,服务端会自动包裹<system> ... </system>标签
seed❌ 可选随机随机种子,-1表示每次随机;相同种子可复现对话

⚠️ 注意:voice_prompttext_prompt若缺失会直接导致连接报错(server.py);seed-1或省略时不固定随机性。

采样参数(客户端会发送,当前服务端暂未启用)

官方 Web 客户端还会发送以下采样参数(定义见 useModelParams.ts),服务端对应解析代码目前处于注释状态(server.py)。了解它们的默认值和取值范围,便于阅读源码和后续对接:

参数默认值取值范围含义
text_temperature0.70.2 – 1.2文本 token 采样温度,越高越发散
text_topk2510 – 500文本候选集大小
audio_temperature0.80.2 – 1.2音频 token 采样温度
audio_topk25010 – 500音频候选集大小
pad_mult0-4 – 4静音帧概率调节
repetition_penalty1.01.0 – 2.0重复惩罚系数,调大可减少"复读机"
repetition_penalty_context640 – 200重复惩罚作用的上下文长度
worker_auth_id/email演示环境排队系统使用,本地部署可忽略

16 种预置音色怎么选?

音色文件随模型仓库分发(服务器首次启动自动下载解压,逻辑见 server.py)。命名规则:NAT = 自然对话感,VAR = 多样风格;F = 女声,M = 男声

类别音色编号推荐场景
Natural(female)NATF0 – NATF3默认NATF0,适合助手类对话
Natural(male)NATM0 – NATM3客服、讲解类角色
Variety(female)VARF0 – VARF4角色扮演、个性化音色
Variety(male)VARM0 – VARM4角色扮演、个性化音色

角色 Prompt 怎么写:3 类模板示例

text_prompt决定模型"扮演谁"。以下是官方推荐的三种写法:

🎓 助手角色(默认)

You are a wise and friendly teacher. Answer questions or provide advice in a clear and engaging way.

🏢 客服角色:把公司名、你的名字、要查询的信息写进一句 Prompt,例如仓库自带的示例 prompt_service.txt:

You work for SwiftPlex Appliances which is a appliance repair company and your name is Farhod Toshmatov. ...

☕ 闲聊角色:开放式对话以You enjoy having a good conversation.开头,可追加话题与人物设定(如"你在波士顿的前面包师 David Green")。

更多示例见 README.md 的 Prompting Guide 章节——官方甚至放了一个"火星宇航员抢修反应堆"的角色,试试效果相当惊艳。

二进制消息协议:6 种帧类型

连接建立后,双向都走二进制帧,首字节即消息类型。协议定义见 types.ts,编解码实现见 encoder.ts:

首字节类型方向Payload 内容
0x00handshake 握手服务端 → 客户端版本 + 模型标识(各 1 字节,均为 0)
0x01audio 音频双向Opus 音频字节流(客户端发麦克风,服务端回说话声)
0x02text 文字服务端 → 客户端UTF-8 编码的逐词转写文本
0x03control 控制客户端 → 服务端1 字节:start / endTurn / pause / restart
0x04metadata双向JSON 序列化的元数据
0x05error服务端 → 客户端UTF-8 错误信息
0x06ping客户端 → 服务端无 payload,保活用

控制帧的具体动作位(types.ts):start=0b00endTurn=0b01pause=0b10restart=0b11

连接生命周期:一次完整会话的流程

客户端 服务器 │ GET /api/chat?voice_prompt=NATF0.pt&text_prompt=...&seed=42 ├─────────────────────────────►│ │ │ ① 加载音色 + 编码角色 Prompt │ │ ② 模型跑完 system prompt 预热 │ ◄────────── 0x00 握手帧 ────│ ③ 发送握手(可开始说话) │ 0x01 Opus 音频(麦克风流) │ ├─────────────────────────────►│ │ ◄──── 0x01 回复音频 ────────│ ④ 全双工:边听边说,可被打断 │ ◄──── 0x02 逐词文字 ────────│ ⑤ 同步文字转写 │ 0x06 ping 保活(10s 无消息客户端主动断开) ├─────────────────────────────►│

关键细节(server.py):

  • 握手帧0x00之前别发音频——此时服务器正在加载音色与角色 Prompt;
  • 音频为Opus 编码、24kHz 单声道流式分片,客户端侧解码见 decoderWorker.ts;
  • 客户端侧 10 秒收不到任何消息会判定断线(useSocket.ts),所以空闲时记得发0x06ping 或保持音频流发送;
  • 会话结束(任一方关闭连接)后服务器会复位流式状态,可立即开启下一轮会话。

常见问题 FAQ

Q1:连接立刻断开?多半是voice_prompt文件名写错(注意带.pt后缀)或text_prompt参数缺失。对照 server.py 的服务端校验逻辑排查。

Q2:GPU 显存不够怎么办?启动时加--cpu-offload参数(需先pip install accelerate),把 LM 层卸载到 CPU,详见 README.md。

Q3:一次能开多个会话吗?服务端通过全局锁串行处理(server.py),同一时间只能有一个活跃对话,第二个连接需等第一个结束。

Q4:如何复现某次有趣的对话?连接时传seed=<固定整数>,并保持text_prompt/voice_prompt一致即可复现。

Q5:本地运行需要装什么?安装 Opus 开发库(如sudo apt install libopus-dev),然后pip install moshi/.,完整步骤见 README.md。

小结

你要做的事记住这一点
发起连接GET /api/chat,Query 传voice_prompt+text_prompt(+可选seed
选音色NAT 系自然、VAR 系多变,共 16 个.pt文件
收发数据二进制帧,首字节 0x00–0x06 定类型
保活空闲 10 秒内发0x06ping

掌握以上参数与协议,你就能脱离 Web UI,用任意语言写一个属于自己的全双工语音对话客户端了。

【免费下载链接】personaplexPersonaPlex code.项目地址: https://gitcode.com/GitHub_Trending/pe/personaplex

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 22:29:14

SolidWorks一键导出OBJ:免费插件v2安装与实操指南

简介&#xff1a;面向SolidWorks与Blender跨软件工作流的用户&#xff0c;这套工具包的核心是一个自定义宏&#xff08;.swp&#xff09;&#xff0c;可将SolidWorks模型直接导出为OBJ与MTL格式&#xff0c;解决三维模型在不同软件间的格式互通问题。压缩包共23个文件&#xff…

作者头像 李华
网站建设 2026/9/2 22:29:08

MCP协议实战:用大模型自动化绕过无限debugger反调试

你打开开发者工具&#xff0c;正准备分析某个网页的接口加密参数&#xff0c;结果页面瞬间停住&#xff0c;顶栏出现一行小字&#xff1a;Paused in debugger。你点了 Resume 脚本执行&#xff0c;没走两步又断了。重复十几次之后&#xff0c;你意识到自己已经被“无限 debugge…

作者头像 李华
网站建设 2026/9/2 22:25:40

ESP8266-01S烧录入门:Arduino IDE环境搭建与常见问题排查

ESP8266-01S 是一块很小的 WiFi 模块&#xff0c;却经常让新手卡在第一步&#xff1a;想用 Arduino IDE 给它编译烧录程序&#xff0c;结果打开 IDE 才发现里面根本没有 ESP8266 这个开发板选项。你写好了代码&#xff0c;找不到板卡&#xff1b;接上了 USB 转串口&#xff0c;…

作者头像 李华
网站建设 2026/9/2 22:22:26

嵌入式点灯项目进阶:从GPIO控制到状态机架构,拿下Offer的关键

很多刚入行嵌入式的人&#xff0c;都有同一个困惑&#xff1a;我明明已经能在开发板上点灯了&#xff0c;为什么投出去的简历还是石沉大海&#xff1f;面了好几轮&#xff0c;项目也讲了&#xff0c;板子也调了&#xff0c;最后却总是收到一句“回去等通知”&#xff0c;然后就…

作者头像 李华
网站建设 2026/9/2 22:16:13

Docker迁移Podman:从守护进程到无守护进程的容器运行时选型指南

如果你最近在团队里听到“要不把 Docker 换成 Podman 吧”&#xff0c;大概率不是开发人员闹脾气&#xff0c;而是财务、安全或运维那边先发话了。这不难理解。Docker 在容器技术普及上的贡献毋庸置疑&#xff0c;它把复杂的容器概念变成了docker run一条命令&#xff0c;把镜像…

作者头像 李华