diff --git a/docs/clipboard-voice-command-plan.md b/docs/clipboard-voice-command-plan.md new file mode 100644 index 0000000..672fe62 --- /dev/null +++ b/docs/clipboard-voice-command-plan.md @@ -0,0 +1,123 @@ +# 剪贴板语音指令(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 → 插入替换)。