语音是联机竞技的「第二个赛道」——没有语音的匹配像在真空里配合。本 PRD 是《在线联机原型全集》的扩展篇之八,聚焦语音房间、RTC 通道、转写与质量监控,让开黑从「约好外挂语音」变成「进局即通」。
1. 目标与验证点
| 编号 | 验证能力 | 说明 |
|---|---|---|
| F1 | 语音房间 | 队伍/局内/频道三种房间生命周期 |
| F2 | RTC 通道 | SFU 转发 vs 混音、3D 语音衰减 |
| F3 | 转写能力 | 语音转文字(字幕)+ 文字转语音(播报) |
| F4 | 断线重连 | 切后台/切网不丢会话,秒回 |
| F5 | 质量监控 | 延迟/丢包/抖动可观测,自动降级 |
一句话目标:进局即通、离局即静,语音延迟被玩家完全忽略。
2. 系统架构
flowchart TD
A["Player A (Mic)"] -->|RTP over UDP| B["SFU/Relay"]
A2["Player B (Mic)"] --> B
C["Player C (Speaker)"] -->|RTP| B
B --> D["Room Service"]
D --> E["Room Store"]
B --> F["Transcriber (ASR)"]
F --> G["Subtitles to all"]
D --> H["Presence / State"]
D --> I["Quality Monitor"]
I --> J["Adaptive Downshift"]
说明:
- SFU/Relay:服务端转发媒体流,兼容 NAT、统一 QoS
- Room Service:房间创建/加入/离开、角色分配(主持/听众/说话)
- Transcriber:ASR 生成字幕,跨语言能力见扩展篇之十
- Quality Monitor:采集 RTT/丢包/抖动,触发降级(音频码率/通道数)
3. 语音房间模型
3.1 房间类型
| 类型 | 生命周期 | 成员 | 用途 |
|---|---|---|---|
| 队伍房 | 对局期间 | 同队 2~5 人 | 局内配合 |
| 局内房 | 整个房间 | 全体 10+ 人 | 全局喊话/观战 |
| 频道房 | 常驻 | 好友/公会 | 大厅闲聊、组队集结 |
3.2 房间状态机
created → open → (join/leave) → closed
├── open 期间成员增减不影响会话
├── 全部离开 → idle 5min 自动回收
└── 对局结束 → 队伍房随结算归档
心智:语音房是「会话级资源」——开对局开房、结束归档,跟游戏状态绑定,不做常驻长连接(频道房除外)。
4. RTC 通道:SFU vs 混音
4.1 两种方案对比
| 维度 | SFU 转发 | 混音 |
|---|---|---|
| 原理 | 服务端转发每位说话者的流,客户端混音 | 服务端把多路混成 1 路下发 |
| 带宽 | O(N) 上行 + O(N) 下行 | 下行恒为 1 路 |
| 延迟 | 最低(转发即走) | 混音引入 ~50ms |
| 成本 | 带宽高 | 计算高 |
| 适用 | 2~8 人小队(3D 语音需要分路) | 大厅广播、观战解说 |
SFU:玩家A ──┐
├→ 转发给 B/C/D(每人听自己需要的路)
玩家B ──┐ │
└──→ A/C/D
混音:所有玩家 ──→ 混音器 ──→ 1 路下发每个人
4.2 3D 语音与空间衰减
近距离说话声音大、远距离变小 → 按 AOI 距离做音量衰减
- 位置来自服务器权威坐标([#19 视野圈](#9))
- 衰减曲线:volume = max(0, 1 - dist/range)
- 隔墙/遮挡 → 基于地图遮挡做低通滤波(可选)
心法:3D 语音是「沉浸感的开关」,但不是必选项。MVP 先做 SFU + 队伍房平面语音,3D 衰减放二期。
5. 语音转写与文字辅助
5.1 语音转文字(字幕)
玩家说话 → ASR → 字幕文本 → 广播到房间
应用:聋哑友好、回放字幕、赛后复盘、关键词触发(危险提醒)
| 场景 | 转写策略 |
|---|---|
| 实时字幕 | 每 300ms 推一次增量文本,低延迟优先 |
| 赛后复盘 | 全量转写归档,精确优先 |
5.2 文字转语音(播报)
系统播报 → TTS → 音频注入房间
应用:击杀播报、回合提示、机器人语音、无障碍读屏
边界:转写是「辅助通道」,不是「内容审核的替身」——语音内容审核(脏话/违规)走独立的审核链路(见扩展篇之九)。
6. 断线重连与会话恢复
6.1 切网重连
断连 → 客户端进入 Reconnecting(3~8s)
├── 重连成功 → 恢复 RTP 通道 + 房间成员状态
└── 超时 → 掉线处理(保留房间位,允许 60s 内回场)
6.2 关键设计
| 点 | 做法 |
|---|---|
| 会话凭证 | 重连用短期 token,不依赖原连接 |
| 状态快照 | 房间成员/静音状态本地缓存,重连后快速恢复 |
| 音量记忆 | 每位成员的本地音量偏好持久化 |
| 来电提示 | 掉线玩家回场时播「XX 已回来」语音 |
铁律:语音掉线不能丢对局——RTC 通道与会话状态分离,媒体断了先保「身份在」,再逐步恢复媒体。
7. 质量监控与自适应降级
7.1 关键指标
| 指标 | 目标 | 超限表现 |
|---|---|---|
| 端到端延迟 | < 300ms | 对话错位 |
| 丢包率 | < 3% | 声音断续 |
| 抖动 | < 50ms | 忽快忽慢 |
| 上行带宽 | 自适应 | 听不清 |
7.2 自适应降级阶梯
理想(256kbps, 双声道) → 波动(128kbps, 单声道) → 弱网(64kbps, 降采样)
→ 极弱网(仅文字转写) → 断连(提示重连)
// 伪代码:根据实时质量选择档位
func (m *Monitor) PickProfile(mos float64) Profile {
switch {
case mos > 4.2: return Profile{ bitrate: 256_000, stereo: true }
case mos > 3.6: return Profile{ bitrate: 128_000, stereo: false }
case mos > 3.0: return Profile{ bitrate: 64_000, mono: true }
default: return Profile{ textOnly: true }
}
}
实践:语音质量「够用即止」——优先保证可对话,再谈音质。弱网降级到文字转写,好过「一顿一顿」。
8. 里程碑与验收
M1 队伍语音 MVP(1 周)
✅ SFU 队伍房、进局即通、静音/音量控制
M2 频道房 + 3D 衰减(1 周)
✅ 大厅频道、近距离音量衰减、观战解说
M3 转写 + 无障碍(1 周)
✅ 实时字幕、TTS 播报、赛后转写归档
M4 断线重连 + 质量监控(1 周)
✅ 切网秒回、自适应降级、指标看板
验收指标:进房成功率 > 99.5%;端到端延迟 P95 < 300ms;切网 8s 内恢复率 > 95%;弱网下仍可转写文字沟通。
9. 相关原型衔接
- 与#1 回声聊天室的文字聊天互补 → 升级为语音房
- 复用#2 石头剪刀布的权威连接 → 语音令牌绑定对局会话
- 与#47 多语言实时语音协作协同:协作玩法需要语音,本篇提供通道
- 与#30 平台大厅与游戏中心的频道房复用大厅常驻连接
扩展篇定位:语音是「协作的润滑剂」。它让陌生人迅速变成队友、让配合从「打字手忙脚乱」变成「喊一嗓子就位」。
延伸阅读
- 「在线联机原型全集」目录(60 个原型全景) — 原型全景索引
- 跨平台互通与云存档 — 会话凭证跨端续用(扩展篇之六)
- 反作弊与公平竞技 — 语音内容审核接口(扩展篇之七)
- 「在线联机原型全集」第一章:联机基础(#1–#10) — 连接与会话
- 游戏开发专题 — RTC 与网络延迟补偿
扩展篇全系列回顾:观战回放(被看见)→ 成就(被记住)→ AI 陪练(随时变强)→ 自定义房间(玩出花)→ 赛季段位(长期目标)→ 跨平台云存档(资产随行)→ 反作弊(生态底线)→ 语音通信(协作润滑)。八篇共同补齐「玩法之外」的完整体验层。
扩展篇全系列速查
| 扩展篇 | 主题 | 一句话 |
|---|---|---|
| 之一 观战与回放 | 让对局被围观 | 每一局都可传播、可复盘 |
| 之二 成就与里程碑 | 让成长被记录 | 每一份努力都有进度条 |
| 之三 AI 陪练 | 让进步有人陪 | 随时能练、永远有人陪 |
| 之四 自定义房间 | 让玩法可定制 | 玩家把规则捏成自己的 |
| 之五 赛季与段位 | 让竞技有长期目标 | 每局爬升、每季回访 |
| 之六 跨平台与云存档 | 让资产随行 | 任何设备接着玩 |
| 之七 反作弊与公平竞技 | 让生态有底线 | 每一场竞技都干净 |
| 之八 语音聊天与实时通信 | 让协作有温度 | 喊一嗓子就位 |
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。