Files
OSGKeyboard/docs/clipboard-voice-command-plan.md
T
Rocky 98ae211b3d docs: freeze clipboard voice command one-page plan
Capture the product decisions for long-press clipboard instruction mode before implementation.
2026-08-07 11:32:31 +08:00

124 lines
5.5 KiB
Markdown
Raw 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.
# 剪贴板语音指令(Clipboard Voice Command)一页规划
> **文档状态**:产品规划(**决策已冻结**,未进入实现)
> **适用范围**:iOS 主 App + 键盘扩展(复用现有 Flow / ASR / 润色管线)
> **创建日期**2026-08-07
> **关联能力**Flow 会话、PiP 保活、Polish Style Packs、字段指纹插入
---
## 1. 一句话定义
用户复制一段材料到剪贴板后,**长按麦克风**口述处理意图;系统以「剪贴板快照 = 材料、ASR = 指令、当前风格包 = 底色」生成结果,并直接写入当前输入框。短按始终回到普通听写。
覆盖场景:**社交回复**(委婉拒绝、温暖安慰)与 **文档处理**(精简、总结)共用一条管线。
---
## 2. 冻结决策
| 项 | 选择 |
|----|------|
| 入口 | **复用麦克风**:短按 = 听写;长按 = 剪贴板指令 |
| 提示文案 | 有开场资格时改为:**「点击说话,长按处理剪贴板」** |
| 开录时机 | 长按达标后 **立刻录音**,不插确认动画 |
| 开场资格时钟 | 复制后 **30 秒内** 可进入 |
| 指令会话时钟 | 开场成功起 **30 秒**;每轮 **成功上屏** 刷新 30 秒;失败不刷新 |
| 材料快照 | 开场瞬间冻结;会话中剪贴板变更不影响本会话 |
| 首轮写入 | 空框写入;非空追加 |
| 连续改写 | **干净 → 替换上轮产物**;**不干净 → 追加**(用户自删) |
| 会话中短按 | **结束指令会话 → 听写** |
| 风格 | 共享基础润色契约;当前 Style Pack 作底色;**本轮指令优先** |
| 预览 | 直接上屏,不强制确认 |
| 翻译开关 | 指令模式 MVP **忽略**(语言需求由口述指令携带) |
---
## 3. 交互主路径
```text
复制文本
→ 开场资格 30s 内且通过材料过滤
→ 提示:「点击说话,长按处理剪贴板」
→ 长按 → 立刻录音,冻结 clipboardSnapshot,开启指令会话
→ ASR(指令) + Snapshot(材料) + StylePack(底色) → LLM
→ 空框写入 / 非空追加;记录本轮插入区间
→(可选)会话未到期再长按连续改写:
干净则删上轮产物再写新版;否则追加
→ 短按 / 会话到期 / 切框 / 收起键盘 → 结束会话,丢弃快照
```
---
## 4. 开场过滤(不开放指令入口)
命中任一条 → UI 保持「点击说话」,长按按 **听写** 处理:
- 长度 **< 10** 字
- 明显是数字(电话、订单号等)
- 无意义字符 / 乱码 / 单符号重复
- 验证码形态(短字母数字码等)
- 非文本、安全输入框、无 Full Access 读不到剪贴板
---
## 5. 写入与「干净」判定
**可替换(干净)须同时满足:** 同一指令会话、字段指纹未变、有上轮插入记录、光标仍在上轮产物末尾、上轮文本未被用户改动。
**推荐执行顺序:** LLM 成功拿到新文本 → 再删旧 → 再插新;删后插失败则尽力写回旧文本。不确定时 **只追加或不插,绝不误删用户原文**
---
## 6. 失败态与边界(优先级)
1. **不丢用户原文**(替换不确定 → 追加或不插)
2. **不把指令 ASR 当听写上屏**(ASR/LLM 失败均不插入指令原文)
3. **不静默滥用剪贴板**(无资格 = 听写;仅长按开场时读一次)
4. **软失败可重试但不续期**(没听清 / 生成失败:不插入、会话保持、时钟不刷新)
5. **少打断**(弱提示,不弹模态)
| 场景 | 策略 |
|------|------|
| 剪贴板过期后长按 | 弱提示「剪贴板已过期」→ 听写 |
| 无有效语音 / ASR 空 | 不调用 LLM;不插入;会话保持 |
| 指令不可解析 | 提示说明要怎么处理;不插入 |
| LLM 超时/拒绝/空结果 | 不插入;可重试;不刷新时钟 |
| 字段切换 / 收起键盘 | 结束会话;已上屏保留 |
| 会话中剪贴板被覆盖 | 本会话仍用旧快照 |
| 密码框 | 禁止指令模式 |
**隐私:** 快照仅内存,会话结束丢弃;不写历史明文;不后台轮询剪贴板。
---
## 7. 与现有架构的关系
| 可复用 | 必须新建(实现期) |
|--------|-------------------|
| Flow 命令/结果桥、PiP、ASR、插入器、字段指纹 | 剪贴板开场资格与材料过滤 |
| `PolishingService` / LLM 调用层、Style Pack 底色 | **新 prompt 契约**(指令模式;不可复用「ASR 绝不当命令」的听写 R6) |
| 会话超时与冷启动 handoff | 指令会话状态、上轮插入区间、干净替换逻辑 |
**非目标(本期):** 后台监听剪贴板、强制预览确认、独立「回复」大按钮、把指令模式混进现有 transcript-polish 路径。
---
## 8. 成功标准(验收)
1. 复制合格文本 30s 内,提示变为「点击说话,长按处理剪贴板」。
2. 长按后口述「委婉拒绝 / 精简 / 总结」等,结果直接进入当前输入框。
3. 会话内再长按改写:未手改则替换上轮产物;手改则追加。
4. 会话中短按恢复听写,且不会把上一段指令会话状态带到听写。
5. 过短/数字/验证码等材料不会出现指令提示。
6. ASR/LLM 失败时输入框不被指令原文污染。
---
## 9. 下一步
1. 补一页状态机(听写 / 开场资格 / 指令录音 / 生成 / 可连续改写 / 结束)。
2. 定长按阈值与材料过滤的具体启发式。
3. 设计指令模式 prompt 与听写 polish 的分流接口。
4. 产品确认后进入实现(键盘提示 → 主 App 会话 → Shared prompt → 插入替换)。