DroneMind/voicellmcloud/docs/CLOUD_VOICE_DIALOG_v1.md
2026-04-14 10:08:41 +08:00

172 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 云端语音 · `dialog_result` 与飞控二次确认v1
**云端服务****机端 voice_drone_assistant** 同步实现。**尚无线上存量**:本文即 **`dialog_result` 的签字基准约定**,服务端可按 v1 直接改结构,无需迁就旧字段。
---
## 1. 目标
1. **`routing=chitchat`**:只走闲聊与对应 TTS**不**下发可执行飞控负载。
2. **`routing=flight_intent`**:携 **`flight_intent`v1** + **`confirm`**;机端是否立刻执行仅由 **`confirm.required`** 决定,并支持 **确认 / 取消 / 超时** 交互。
3. **ASR**:飞控句是否改用云端识别见 **附录 A**;与 `confirm` 独立。
---
## 2. 术语
| 术语 | 含义 |
|------|------|
| **首轮** | 用户说一句;本轮 WS 收到 `dialog_result` 为止。 |
| **确认窗** | `confirm.required=true` 时,机端播完本轮 PCM 后 **仅收口令** 的时段,时长 **`confirm.timeout_sec`**。 |
| **`flight_intent`** | 见 `FLIGHT_INTENT_SCHEMA_v1.md`。 |
---
## 3. `dialog_result` 形状(云端 → 机端)
### 3.1 公共顶层(每轮必带)
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `turn_id` | string | 是 | 与现有一致,关联本 turn。 |
| **`protocol`** | string | 是 | 固定 **`cloud_voice_dialog_v1`**,便于机端强校验、排障。 |
| `routing` | string | 是 | **`chitchat`** \| **`flight_intent`** |
| `user_input` | string | 建议 | 本回合用于生成回复的用户文本(可为云端 STT 结果)。 |
> **兼容注**:仍可与既有 `proto_version`、`transport_profile`、`type` 等并列下发;机端若以本文强校验,至少校验 `protocol` 与 §3.2 / §3.3 字段约束。
### 3.2 `routing=chitchat`
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `chat_reply` | string | 是 | 闲聊文本(与 TTS 语义一致或由服务端定义)。 |
| `flight_intent` | — | **禁止** | 不得出现。 |
| `confirm` | — | **禁止** | 不得出现。 |
### 3.3 `routing=flight_intent`
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `flight_intent` | object | 是 | v1`is_flight_intent``version``actions``summary` 等。 |
| **`confirm`** | object | 是 | 见 §3.4**每轮飞控必带**,机端拒收缺字段报文。 |
### 3.4 `confirm` 对象(`routing=flight_intent` 时必填)
| 字段 | 类型 | 必填 | 说明 |
|------|------|------|------|
| **`required`** | bool | 是 | `true`:进入确认窗,**首轮禁止**执行飞控;`false`:首轮允许按机端执行开关立即执行(调试/免确认策略)。 |
| **`timeout_sec`** | number | 是 | 确认窗秒数;建议默认 **10**。 |
| **`confirm_phrases`** | string[] | 是 | 非空;默认 **`["确认"]`**(与口播「请回复确认或取消」一致),可由服务端扩词表。 |
| **`cancel_phrases`** | string[] | 是 | 非空;默认 **`["取消"]`**。 |
| **`pending_id`** | string | 是 | 本轮待定意图 ID建议 UUID日志、可选第二轮遥测附录 B。 |
| **`summary_for_user`** | string | 建议 | 与口播语义一致,供日志/本地 TTS 兜底;**最终以本轮 PCM 为准**。 |
---
## 4. 播报(理解与提示)
- **TTS**:仍用 **`tts_audio_chunk` + PCM**。本仓库默认口播模板为:**「我将执行:{summary}。请回复确认或取消。」**(与 `confirm_phrases`/`cancel_phrases` 默认 `确认`/`取消` 对齐);如需 LLM 重写口播,须保持与短语表一致。
- 机端 **须****本轮 PCM 播放结束**(或播放管线给出「可收听下一句」)后再进入确认窗,避免抢话。
---
## 5. 机端短语匹配(确认窗内)
对用户 **一句** STT 结果规范化(去首尾空白等)后:
1. **取消**:若命中 `cancel_phrases` 任一(**推荐子串包含**),则 **取消优先**
2. **确认**:否则若命中 `confirm_phrases` 任一 → 执行 **`flight_intent`**(校验 + ROS/Socket与现机端一致
3. **未命中**:可继续听到超时,或 v1 **建议只采一句** 后静等超时。
4. **超时 / 取消** 固定中文播报见下表(机端本地 TTS降低时延
| 事件 | 文案 |
|------|------|
| 超时 | `未收到确认指令,请重新下发指令` |
| 取消 | `已取消指令,重新下发指令` |
若产品强制云端音色,见 **附录 C**
---
## 6. 机端执行条件(归纳)
| 条件 | 行为 |
|------|------|
| `routing=chitchat` | 不执行飞控。 |
| `routing=flight_intent``confirm.required=false` 且机端已开执行开关 | 首轮校验通过后 **可立即** 执行。 |
| `routing=flight_intent``confirm.required=true` | **仅**在确认窗内命中确认短语后执行;**首轮绝不**执行。 |
---
## 7. 机端状态机(摘要)
```mermaid
stateDiagram-v2
[*] --> Idle
Idle --> Chitchat: routing=chitchat
Idle --> ExecNow: routing=flight_intent 且 confirm.required=false
Idle --> ConfirmWin: routing=flight_intent 且 confirm.required=true
ConfirmWin --> ExecIntent: 命中 confirm_phrases
ConfirmWin --> SayCancel: 命中 cancel_phrases
ConfirmWin --> SayTimeout: timeout_sec
ExecNow --> Idle
ExecIntent --> Idle
SayCancel --> Idle
SayTimeout --> Idle
Chitchat --> Idle
```
---
## 8. 会话握手
**`session.start`**(或等价)的 `client` **须** 带:
```json
{
"protocol": {
"dialog_result": "cloud_voice_dialog_v1"
}
}
```
服务端仅对声明该协议的客户端下发 §3 结构;机端若未声明,服务端可 **下发旧版 `dialog_result`**(无 `protocol`、嵌套 `user_input`、无 `confirm`)或返显式错误码(由部署策略决定)。本仓库默认:**已声明** → §3**未声明** → 兼容旧形状。
---
## 9. 安全说明
二次确认减轻 **错词误飞**,不替代 **急停、遥控介入、场地规范**
---
## 附录 A云端 ASR可选
服务端可将飞控相关 utterance 改为 **云端 STT** 结果填入 `user_input`,与 `flight_intent` 解析同源;**执行仍以 `flight_intent` + `confirm` 为准**。
---
## 附录 B第二轮 `turn`(可选遥测)
用户确认后机端可再发一轮文本ASR 原文payload 可带 `pending_id``phase: confirm_ack`**执行成功与否不依赖**该轮响应。
---
## 附录 C超时/取消走云端 TTS可选
`confirm.play_server_tts_on_timeout` 为真(服务端与机端扩展字段),则由云端推 PCM**易增延迟**v1 默认 **关**,以 §5 本地播报为准。
---
## 文档关系
| 文档 | 关系 |
|------|------|
| `FLIGHT_INTENT_SCHEMA_v1.md` | `flight_intent` 体 |
| `CLOUD_VOICE_PROTOCOL_v1_text_uplink.md` | WS 总协议 |
| `PROJECT_SUMMARY_AND_DEPLOYMENT.md` | 部署 |
**版本**`cloud_voice_dialog_v1`(本文);后续 breaking 变更递增 `cloud_voice_dialog_v2` 等。