Issue:语音输入标准化
1. 功能描述
语音输入标准化模块负责接收用户通过客户端底部语音按钮提交的语音输入,将原始音频转换为可编辑、可追踪、可交给主 Agent 继续处理的标准文本输入。
本模块位于用户输入与业务语义理解之间,只解决“用户说了什么”的问题,不解决“用户想执行什么业务操作”的问题。
模块主要负责:
-
语音录制。
-
原始音频接收。
-
自动语音识别,即 ASR。
-
识别结果展示。
-
用户手动修正转写文本。
-
基础文本清理和格式统一。
-
语音输入状态管理。
-
错误提示和文字输入降级。
-
将标准文本和必要上下文提交给后续意图解析模块。
例如用户说:
明天早上八点到公司打卡,到了公司提醒我。
本模块的标准输出应当是接近用户原意的文本:
本模块不负责将该文本解析成 Schedule、Place 或 Reminder,也不负责创建任何正式业务数据。
2. 用户 / 用户故事
目标用户:希望在移动、走路、工作或不方便打字的场景中,通过语音快速输入日程和待办需求的用户。
用户进入 TimeFlow 首页后,点击页面底部中央的语音按钮,开始说话:
明天下午三点开项目会议。
客户端显示录音状态和音量反馈。用户结束录音后,系统将音频识别为文字并展示:
用户发现系统将“项目会议”识别为“项目回忆”,可以在提交前手动修改文本。
用户确认文本无误后,将标准文本提交给语音意图解析与 CRUD 编排模块。
当用户所在环境噪声较大、语音无法识别,或者用户拒绝麦克风权限时,系统允许用户直接输入文字,不影响后续业务流程。
3. 现有做法及不足
如果客户端在录音结束后直接将原始音频交给主 Agent,由 Agent 同时负责语音识别、文本理解和业务操作,会产生以下问题:
如果系统在识别完成后直接执行创建或修改操作,用户也无法判断错误来自语音识别还是意图解析。
因此,本模块需要建立独立输入层:
用户语音
→ 原始音频
→ ASR 转写
→ 用户检查或修改
→ 标准文本
→ 后续意图解析
4. 本期范围
-
首页底部中央语音按钮可以启动录音。
-
支持用户主动结束录音。
-
支持用户取消本次录音。
-
录音过程中展示明确的录音状态。
-
录音过程中展示基础音量或波形反馈。
-
录音过程中展示已经录制的时长。
-
设置单次录音最大时长。
-
录音结束后将音频提交给 ASR 服务。
-
获取 ASR 转写文本。
-
在客户端展示转写结果。
-
允许用户编辑转写文本。
-
用户确认后生成标准文本输入。
-
支持直接使用文字输入替代语音。
-
麦克风权限拒绝后提供权限说明和文字输入。
-
ASR 失败后允许重新录音。
-
ASR 失败后允许直接切换文字输入。
-
对文本执行基础空白字符清理。
-
对明显的重复标点进行规范化。
-
保留自然语言中的日期、时间、地点和指令内容。
-
为每次输入生成唯一的输入请求标识。
-
记录输入来源是语音还是文字。
-
记录 ASR 是否成功。
-
将标准文本提交给语音意图解析模块。
-
支持在请求上下文中附带用户时区和当前选中日期。
-
对空音频、静音和无有效语音提供明确提示。
-
App 进入后台或录音被系统中断时正确结束或取消录音。
-
防止用户重复点击导致多个并行录音会话。
-
对重复提交进行幂等控制。
5. 明确不做
6. 关键决策
| 决策点 |
备选方案 |
选择 |
理由 |
| 输入处理边界 |
ASR 与业务解析合并 / 独立标准化层 |
独立标准化层 |
区分“听到了什么”和“用户想做什么” |
| 语音入口 |
多个语音按钮 / 单一语音按钮 |
首页底部中央单一按钮 |
保持产品入口统一 |
| 录音触发方式 |
点击开始再次点击结束 / 长按录音 / 两者支持 |
点击开始、主动结束为主 |
更适合表达完整日程指令 |
| 实时转写 |
必须实时 / 录音结束后转写 |
P0 以结束后转写为准 |
降低实时链路复杂度 |
| 转写结果 |
直接提交 / 用户可检查和编辑 |
用户可编辑 |
修正人名、地点和专业词汇 |
| ASR 失败 |
只允许重试 / 提供文字降级 |
重试和文字输入同时提供 |
防止语音能力成为单点 |
| 标准化强度 |
大幅改写 / 最小清理 |
最小清理 |
避免改变用户原始语义 |
| 标点处理 |
完全保留 ASR / 基础规范化 |
基础规范化 |
提升后续解析稳定性 |
| 时间文本 |
输入层解析 / 保留原文 |
保留原文 |
时间解析属于意图与参数解析模块 |
| 地点文本 |
自动匹配 Place / 保留原文 |
保留原文 |
地点识别属于业务解析模块 |
| 输入上下文 |
仅文本 / 文本加必要上下文 |
文本加用户时区、选中日期等上下文 |
帮助后续模块正确解释相对时间 |
| 原始音频保存 |
默认永久保存 / 默认不长期保存 |
默认不长期保存 |
遵循最小数据原则 |
| 输入追踪 |
不记录请求 / 输入请求唯一标识 |
唯一标识 |
关联 ASR、Agent 和业务执行链路 |
| 文字输入 |
独立功能 / 语音的同级降级入口 |
同级输入方式 |
保证无麦克风时仍可使用 |
| ASR 供应商 |
业务层直接调用 / 通过统一适配层 |
统一适配层 |
便于更换供应商和测试 |
| 录音并发 |
允许多会话 / 单一活动会话 |
同一时间只允许一个 |
防止重复录音与重复提交 |
| 提交文本 |
ASR 原文 / 用户最终确认文本 |
用户最终确认文本 |
以后续用户确认结果为准 |
7. 边界与异常
麦克风与录音边界
ASR 边界
-
ASR 请求必须关联输入请求 ID。
-
ASR 超时后应返回可恢复错误。
-
ASR 服务不可用时,允许用户重试或使用文字输入。
-
ASR 返回空文本时,应提示未识别到有效语音。
-
ASR 返回纯标点、纯空格或无意义结果时,不提交后续模块。
-
ASR 返回多个候选时,P0 可以选择置信度最高候选,但需要允许用户编辑。
-
ASR 置信度过低时,应提示用户检查转写结果。
-
ASR 不得直接调用任何业务写接口。
-
ASR 不得根据业务上下文自行创建 Schedule 或 Todo。
-
ASR 不负责判断“公司”对应哪个 Place。
-
ASR 不负责将“明天下午”转换成具体时间。
-
ASR 返回文本中的误识别由用户编辑或后续业务追问处理。
-
ASR 供应商错误信息需要转换为用户可理解提示。
-
不向客户端暴露供应商密钥和内部错误详情。
文本标准化边界
-
标准化只做不改变语义的基础处理。
-
去除文本开头和结尾的多余空白。
-
合并连续的无意义空白字符。
-
可以统一常见中文标点。
-
可以去除明显重复的结尾标点。
-
不删除日期、时间、数字、地点、人名和否定词。
-
不将“不要提醒我”改写为“提醒我”。
-
不将“取消会议”改写为“创建会议”。
-
不静默补充用户未说出的主语、对象或时间。
-
不使用大模型将用户原句改写成更完整的业务指令。
-
用户手动编辑后的文本优先于 ASR 原始文本。
-
标准文本为空时,不允许提交后续模块。
-
文字输入与语音转写使用相同的最终标准文本格式。
-
用户输入的换行可以规范化,但不能改变句子顺序。
-
专业名词和地点名称不得被自动替换为近义词。
数据与隐私边界
-
原始音频属于敏感输入数据,应限制访问范围。
-
默认不永久保存原始音频。
-
如为问题排查临时保存,应具有明确保留时间和访问权限。
-
用户关闭音频保存后,不得以调试名义长期保留。
-
转写文本是否进入历史记录应由产品隐私策略明确。
-
日志不得记录完整的认证信息和服务密钥。
-
输入请求 ID 可以用于链路追踪,但不能替代用户权限校验。
-
删除输入记录时,应按照隐私策略同步删除可删除的原始音频。
-
ASR 第三方数据处理范围需要在隐私说明中体现。
提交与重试边界
8. 基本概念与信息结构
| 概念 |
含义 |
| VoiceInputSession |
一次从开始录音到取消或提交的语音输入会话 |
| RawAudio |
客户端录制的原始音频数据 |
| ASRRequest |
向语音识别服务提交的识别请求 |
| ASRResult |
语音识别服务返回的原始结果 |
| Transcript |
ASR 返回的文字转写内容 |
| EditedTranscript |
用户手动编辑后的转写文本 |
| NormalizedText |
经过最小清理、准备提交后续模块的标准文本 |
| TextInput |
用户未录音、直接输入的文字 |
| InputSource |
输入来源,voice 或 text |
| InputRequestId |
一次输入请求的唯一标识 |
| InputContext |
提交给后续模块的必要上下文 |
| RecognitionStatus |
录音和识别过程状态 |
| ASRProvider |
实际提供语音识别能力的服务 |
| InputVersion |
用户每次编辑文本后的版本 |
VoiceInputSession
├─ InputRequestId
├─ InputSource
├─ RecordingState
├─ RawAudio
├─ ASRRequest
├─ ASRResult
│ ├─ Transcript
│ ├─ confidence
│ └─ provider_metadata
├─ EditedTranscript
├─ NormalizedText
├─ InputContext
├─ InputVersion
├─ RecognitionStatus
├─ created_at
└─ submitted_at
输入状态
idle
recording
recorded
recognizing
reviewing
submitting
submitted
cancelled
failed
状态说明:
| 状态 |
含义 |
| idle |
尚未开始输入 |
| recording |
正在录音 |
| recorded |
录音结束,等待识别 |
| recognizing |
ASR 正在处理 |
| reviewing |
展示转写结果,等待用户检查 |
| submitting |
正在向后续模块提交标准文本 |
| submitted |
标准文本已经成功提交 |
| cancelled |
用户取消本次输入 |
| failed |
录音、识别或提交过程失败 |
标准输入结构
StandardizedInput
├─ input_request_id
├─ user_id
├─ source
├─ normalized_text
├─ input_version
├─ locale
├─ timezone
├─ selected_date
├─ current_time
├─ client_platform
└─ created_at
字段约束:
-
input_request_id:输入请求唯一标识。
-
user_id:当前用户标识,必须由认证上下文确定。
-
source:voice 或 text。
-
normalized_text:最终提交文本,不得为空。
-
input_version:用户编辑后的文本版本。
-
locale:P0 为中文语言环境。
-
timezone:用户当前时区。
-
selected_date:首页当前选中日期,可选,仅作为上下文。
-
current_time:提交时的当前时间,用于后续解释相对日期。
-
client_platform:iOS 或 Android。
-
created_at:标准输入生成时间。
ASR 结果结构
ASRResult
├─ request_id
├─ transcript
├─ confidence
├─ language
├─ duration_ms
├─ provider
├─ provider_request_id
└─ error
provider_request_id 和供应商内部信息只用于服务端排查,不应直接展示给用户。
9. Agent 输入输出约束
-
本模块是主 Agent 的上游输入模块。
-
主 Agent 只接收本模块最终提交的 StandardizedInput。
-
主 Agent 不应直接处理客户端原始音频。
-
主 Agent 不应自行调用麦克风录音。
-
主 Agent 不依赖特定 ASR 供应商字段。
-
主 Agent 以 normalized_text 作为用户本次明确输入。
-
Transcript 和 EditedTranscript 不同时,以用户最终提交的 normalized_text 为准。
-
selected_date 只是页面上下文,不是用户已经明确表达的业务日期。
-
用户文本中出现明确日期时,主 Agent必须以用户文本为准。
-
用户文本未出现日期时,主 Agent可以将 selected_date 作为候选参数,但必须在操作候选中明确展示。
-
current_time 和 timezone 用于解析“明天”“下午”“下周”等相对时间。
-
主 Agent不能根据 ASR 置信度自动执行低置信度写操作。
-
输入置信度较低时,后续模块可以增加确认强度,但不能绕过用户确认。
-
本模块不输出 Schedule、Todo、Reminder 或 Place 参数。
-
本模块不输出 CRUD 类型。
-
本模块不输出对象 ID。
-
本模块不输出业务候选。
-
本模块不调用候选确认模块。
-
本模块不声明业务操作成功。
-
主 Agent处理失败不应修改原 StandardizedInput。
-
同一 input_request_id + input_version 的重复提交必须能够识别。
-
用户编辑文本后产生新版本,主 Agent只处理最终提交版本。
-
已取消的输入不得提交给主 Agent。
-
输入文本为空时不得调用主 Agent。
-
ASR 原始错误不得作为用户业务意图传给主 Agent。
-
后续模块需要追问时,应创建新的输入轮次,不修改已提交的历史输入。
10. 验收标准
录音入口与交互
-
首页底部中央语音按钮可以启动录音。
-
同一时间只能存在一个录音会话。
-
点击取消后停止录音且不提交。
-
用户可以主动结束录音。
-
录音时展示明确状态。
-
录音时展示基础音量或波形反馈。
-
录音时展示持续时长。
-
达到最大录音时长后自动结束。
-
空录音不会提交 ASR。
-
静音录音返回明确提示。
-
App 进入后台后录音状态被正确处理。
-
系统音频中断后用户能够看到明确结果。
-
用户连续点击不会产生多个音频文件和多个请求。
麦克风权限
-
首次使用语音时按需申请麦克风权限。
-
权限允许后可以开始录音。
-
权限拒绝后不启动录音。
-
权限拒绝后可以使用文字输入。
-
权限永久拒绝后提供系统设置入口。
-
麦克风权限问题不影响月历和已有事项查看。
ASR
标准文本
上下文与提交
-
StandardizedInput 包含 input_request_id。
-
StandardizedInput 包含输入来源。
-
StandardizedInput 包含最终标准文本。
-
StandardizedInput 包含用户时区。
-
StandardizedInput 包含提交时当前时间。
-
StandardizedInput 可以携带首页 selected_date。
-
selected_date 不会被输入模块写入 normalized_text。
-
标准文本提交成功后状态变为 submitted。
-
提交失败后允许安全重试。
-
已取消输入不会继续提交。
-
用户退出审核页面时不会静默提交。
-
标准化完成不会被展示为业务操作完成。
模块边界
-
本模块不判断输入属于 Schedule 还是 Todo。
-
本模块不识别 CREATE、QUERY、UPDATE 或 DELETE。
-
本模块不解析具体日期时间。
-
本模块不匹配 Place。
-
本模块不创建 Reminder。
-
本模块不生成操作候选。
-
本模块不调用业务写接口。
-
本模块不直接访问 Schedule、Todo、Reminder 或 Place 数据库。
-
主 Agent只接收标准输入,不接收原始音频。
-
业务失败与 ASR 失败可以明确区分。
-
AI 服务不可用时,用户仍然可以完成语音转写和文本编辑,业务提交阶段单独提示失败。
数据与隐私
Issue:语音输入标准化
1. 功能描述
语音输入标准化模块负责接收用户通过客户端底部语音按钮提交的语音输入,将原始音频转换为可编辑、可追踪、可交给主 Agent 继续处理的标准文本输入。
本模块位于用户输入与业务语义理解之间,只解决“用户说了什么”的问题,不解决“用户想执行什么业务操作”的问题。
模块主要负责:
语音录制。
原始音频接收。
自动语音识别,即 ASR。
识别结果展示。
用户手动修正转写文本。
基础文本清理和格式统一。
语音输入状态管理。
错误提示和文字输入降级。
将标准文本和必要上下文提交给后续意图解析模块。
例如用户说:
本模块的标准输出应当是接近用户原意的文本:
本模块不负责将该文本解析成 Schedule、Place 或 Reminder,也不负责创建任何正式业务数据。
2. 用户 / 用户故事
目标用户:希望在移动、走路、工作或不方便打字的场景中,通过语音快速输入日程和待办需求的用户。
用户进入 TimeFlow 首页后,点击页面底部中央的语音按钮,开始说话:
客户端显示录音状态和音量反馈。用户结束录音后,系统将音频识别为文字并展示:
用户发现系统将“项目会议”识别为“项目回忆”,可以在提交前手动修改文本。
用户确认文本无误后,将标准文本提交给语音意图解析与 CRUD 编排模块。
当用户所在环境噪声较大、语音无法识别,或者用户拒绝麦克风权限时,系统允许用户直接输入文字,不影响后续业务流程。
3. 现有做法及不足
如果客户端在录音结束后直接将原始音频交给主 Agent,由 Agent 同时负责语音识别、文本理解和业务操作,会产生以下问题:
输入错误和业务理解错误难以区分。
用户无法确认系统究竟听到了什么。
ASR 更换供应商时会影响业务 Agent。
主 Agent 需要同时处理音频和业务逻辑,职责过重。
相同语音输入在不同业务模块中可能产生不一致转写。
用户无法在提交前修正人名、地点名和专业术语。
ASR 故障可能导致整个日程管理功能不可用。
原始音频、转写文本和业务操作之间难以建立稳定追踪关系。
如果系统在识别完成后直接执行创建或修改操作,用户也无法判断错误来自语音识别还是意图解析。
因此,本模块需要建立独立输入层:
4. 本期范围
首页底部中央语音按钮可以启动录音。
支持用户主动结束录音。
支持用户取消本次录音。
录音过程中展示明确的录音状态。
录音过程中展示基础音量或波形反馈。
录音过程中展示已经录制的时长。
设置单次录音最大时长。
录音结束后将音频提交给 ASR 服务。
获取 ASR 转写文本。
在客户端展示转写结果。
允许用户编辑转写文本。
用户确认后生成标准文本输入。
支持直接使用文字输入替代语音。
麦克风权限拒绝后提供权限说明和文字输入。
ASR 失败后允许重新录音。
ASR 失败后允许直接切换文字输入。
对文本执行基础空白字符清理。
对明显的重复标点进行规范化。
保留自然语言中的日期、时间、地点和指令内容。
为每次输入生成唯一的输入请求标识。
记录输入来源是语音还是文字。
记录 ASR 是否成功。
将标准文本提交给语音意图解析模块。
支持在请求上下文中附带用户时区和当前选中日期。
对空音频、静音和无有效语音提供明确提示。
App 进入后台或录音被系统中断时正确结束或取消录音。
防止用户重复点击导致多个并行录音会话。
对重复提交进行幂等控制。
5. 明确不做
不在本模块判断用户意图。
不判断输入对应 Schedule 还是 Todo。
不解析创建、查询、修改或删除操作。
不解析时间字段。
不解析地点和 Place。
不生成 Reminder。
不生成业务操作候选。
不执行用户确认后的业务写入。
不直接调用 Schedule 或 Todo 创建接口。
不直接修改或删除业务对象。
不负责对象检索和对象消歧。
不负责 AI 多轮追问。
不负责业务查询结果展示。
不负责设置页面中的常用地点管理。
不做独立语音记录功能。
不做语音笔记功能。
不做长时间录音。
不做后台持续监听。
不做唤醒词。
不做电话录音。
不做会议录音。
不做多人语音分离。
不做说话人识别。
不做情绪识别。
不做声纹认证。
不做语音克隆。
不做语音翻译。
不做多语言混合输入的完整支持。
P0 不要求识别方言。
不用大模型静默改写用户输入含义。
不自动补充用户没有说出的日期、时间或地点。
不把 ASR 文本直接视为正式业务事实。
不默认长期保存原始音频。
不在本模块实现语音回复合成。
6. 关键决策
7. 边界与异常
麦克风与录音边界
用户未授予麦克风权限时,不得启动录音。
首次使用时应在触发语音功能的上下文中申请权限。
权限被永久拒绝时,应提供系统设置入口。
麦克风权限拒绝后,文字输入仍然可用。
同一时间只允许存在一个活动录音会话。
用户重复点击语音按钮时,不得创建多个录音实例。
用户点击取消后,不提交音频和标准文本。
录音时间为零或过短时,应提示未检测到有效内容。
超过最大录音时长时,应自动结束录音并明确提示。
App 进入后台时,应按平台能力结束或取消录音。
来电、系统音频中断或其他 App 抢占麦克风时,应展示录音中断状态。
录音文件生成失败时,不调用 ASR。
录音结束前不得生成最终标准文本。
ASR 边界
ASR 请求必须关联输入请求 ID。
ASR 超时后应返回可恢复错误。
ASR 服务不可用时,允许用户重试或使用文字输入。
ASR 返回空文本时,应提示未识别到有效语音。
ASR 返回纯标点、纯空格或无意义结果时,不提交后续模块。
ASR 返回多个候选时,P0 可以选择置信度最高候选,但需要允许用户编辑。
ASR 置信度过低时,应提示用户检查转写结果。
ASR 不得直接调用任何业务写接口。
ASR 不得根据业务上下文自行创建 Schedule 或 Todo。
ASR 不负责判断“公司”对应哪个 Place。
ASR 不负责将“明天下午”转换成具体时间。
ASR 返回文本中的误识别由用户编辑或后续业务追问处理。
ASR 供应商错误信息需要转换为用户可理解提示。
不向客户端暴露供应商密钥和内部错误详情。
文本标准化边界
标准化只做不改变语义的基础处理。
去除文本开头和结尾的多余空白。
合并连续的无意义空白字符。
可以统一常见中文标点。
可以去除明显重复的结尾标点。
不删除日期、时间、数字、地点、人名和否定词。
不将“不要提醒我”改写为“提醒我”。
不将“取消会议”改写为“创建会议”。
不静默补充用户未说出的主语、对象或时间。
不使用大模型将用户原句改写成更完整的业务指令。
用户手动编辑后的文本优先于 ASR 原始文本。
标准文本为空时,不允许提交后续模块。
文字输入与语音转写使用相同的最终标准文本格式。
用户输入的换行可以规范化,但不能改变句子顺序。
专业名词和地点名称不得被自动替换为近义词。
数据与隐私边界
原始音频属于敏感输入数据,应限制访问范围。
默认不永久保存原始音频。
如为问题排查临时保存,应具有明确保留时间和访问权限。
用户关闭音频保存后,不得以调试名义长期保留。
转写文本是否进入历史记录应由产品隐私策略明确。
日志不得记录完整的认证信息和服务密钥。
输入请求 ID 可以用于链路追踪,但不能替代用户权限校验。
删除输入记录时,应按照隐私策略同步删除可删除的原始音频。
ASR 第三方数据处理范围需要在隐私说明中体现。
提交与重试边界
用户点击提交后,使用其最终确认的文本。
提交按钮重复点击不得产生多个后续 Agent 请求。
网络失败时可以安全重试。
重试应复用同一个输入请求或建立明确父子请求关系。
用户修改文本后再次提交,应以新版本文本为准。
已取消的输入不得继续在后台提交。
页面退出后返回时,不应静默提交未确认文本。
标准化完成不代表业务操作已经成功。
后续 Agent 或业务写入失败时,不应被展示为 ASR 失败。
8. 基本概念与信息结构
输入状态
状态说明:
标准输入结构
字段约束:
input_request_id:输入请求唯一标识。user_id:当前用户标识,必须由认证上下文确定。source:voice或text。normalized_text:最终提交文本,不得为空。input_version:用户编辑后的文本版本。locale:P0 为中文语言环境。timezone:用户当前时区。selected_date:首页当前选中日期,可选,仅作为上下文。current_time:提交时的当前时间,用于后续解释相对日期。client_platform:iOS 或 Android。created_at:标准输入生成时间。ASR 结果结构
provider_request_id和供应商内部信息只用于服务端排查,不应直接展示给用户。9. Agent 输入输出约束
本模块是主 Agent 的上游输入模块。
主 Agent 只接收本模块最终提交的
StandardizedInput。主 Agent 不应直接处理客户端原始音频。
主 Agent 不应自行调用麦克风录音。
主 Agent 不依赖特定 ASR 供应商字段。
主 Agent 以
normalized_text作为用户本次明确输入。Transcript和EditedTranscript不同时,以用户最终提交的normalized_text为准。selected_date只是页面上下文,不是用户已经明确表达的业务日期。用户文本中出现明确日期时,主 Agent必须以用户文本为准。
用户文本未出现日期时,主 Agent可以将
selected_date作为候选参数,但必须在操作候选中明确展示。current_time和timezone用于解析“明天”“下午”“下周”等相对时间。主 Agent不能根据 ASR 置信度自动执行低置信度写操作。
输入置信度较低时,后续模块可以增加确认强度,但不能绕过用户确认。
本模块不输出 Schedule、Todo、Reminder 或 Place 参数。
本模块不输出 CRUD 类型。
本模块不输出对象 ID。
本模块不输出业务候选。
本模块不调用候选确认模块。
本模块不声明业务操作成功。
主 Agent处理失败不应修改原 StandardizedInput。
同一
input_request_id + input_version的重复提交必须能够识别。用户编辑文本后产生新版本,主 Agent只处理最终提交版本。
已取消的输入不得提交给主 Agent。
输入文本为空时不得调用主 Agent。
ASR 原始错误不得作为用户业务意图传给主 Agent。
后续模块需要追问时,应创建新的输入轮次,不修改已提交的历史输入。
10. 验收标准
录音入口与交互
首页底部中央语音按钮可以启动录音。
同一时间只能存在一个录音会话。
点击取消后停止录音且不提交。
用户可以主动结束录音。
录音时展示明确状态。
录音时展示基础音量或波形反馈。
录音时展示持续时长。
达到最大录音时长后自动结束。
空录音不会提交 ASR。
静音录音返回明确提示。
App 进入后台后录音状态被正确处理。
系统音频中断后用户能够看到明确结果。
用户连续点击不会产生多个音频文件和多个请求。
麦克风权限
首次使用语音时按需申请麦克风权限。
权限允许后可以开始录音。
权限拒绝后不启动录音。
权限拒绝后可以使用文字输入。
权限永久拒绝后提供系统设置入口。
麦克风权限问题不影响月历和已有事项查看。
ASR
有效中文语音可以得到可读转写文本。
ASR 请求具有唯一输入请求 ID。
ASR 超时后展示可恢复错误。
ASR 服务异常后允许重新识别或重新录音。
ASR 返回空文本时不进入后续 Agent。
ASR 返回低置信度文本时提示用户检查。
ASR 结果能够在客户端展示。
ASR 结果允许用户编辑。
ASR 不直接创建、修改或删除业务数据。
ASR 不直接生成 Schedule、Todo 或 Reminder。
更换 ASR 供应商时不影响后续标准输入协议。
标准文本
用户可以修改 ASR 转写文本。
最终提交内容以用户确认后的文本为准。
文本首尾多余空白被清理。
连续无意义空白被规范化。
常见重复标点可以被规范化。
日期、时间、数字、地点和否定词不被删除。
标准化不得改变用户原始语义。
空标准文本不能提交。
文字输入与语音输入生成相同结构的 StandardizedInput。
每次编辑后输入版本正确更新。
重复提交同一版本不会创建多个后续请求。
上下文与提交
StandardizedInput 包含 input_request_id。
StandardizedInput 包含输入来源。
StandardizedInput 包含最终标准文本。
StandardizedInput 包含用户时区。
StandardizedInput 包含提交时当前时间。
StandardizedInput 可以携带首页 selected_date。
selected_date 不会被输入模块写入 normalized_text。
标准文本提交成功后状态变为 submitted。
提交失败后允许安全重试。
已取消输入不会继续提交。
用户退出审核页面时不会静默提交。
标准化完成不会被展示为业务操作完成。
模块边界
本模块不判断输入属于 Schedule 还是 Todo。
本模块不识别 CREATE、QUERY、UPDATE 或 DELETE。
本模块不解析具体日期时间。
本模块不匹配 Place。
本模块不创建 Reminder。
本模块不生成操作候选。
本模块不调用业务写接口。
本模块不直接访问 Schedule、Todo、Reminder 或 Place 数据库。
主 Agent只接收标准输入,不接收原始音频。
业务失败与 ASR 失败可以明确区分。
AI 服务不可用时,用户仍然可以完成语音转写和文本编辑,业务提交阶段单独提示失败。
数据与隐私
原始音频不会默认永久保存。
原始音频访问受到权限控制。
输入日志不包含服务密钥。
用户删除相关输入数据后,可删除的数据按照策略删除。
不使用语音输入进行声纹识别。
不使用语音输入进行持续监听。
不将语音输入用于本 Proposal 范围外的语音记录或语音笔记。