跳转至

语音同步准备(S2 prep)实施计划

由编写它的会话内联执行;每个任务中命名的测试即为契约。

目标: 让语音在服务器推出 blob 后即可同步。每个语音都会获得一个 sync_id,同意以明确的证明形式被记录,没有证明的语音永远不会被推送,并且应用程序可以加密和解密 VSB1 文件。

规范: account_login/HANDOFF.md(“现在为语音同步(S2)做好准备”)、account_login/desktop-app-guide.md 第 4 节和第 9 节,以及 account_login/sync-collections.md(voices)。

基于: 2026-10-16 的 S0 和 S1 计划。

约束

  • sync_id 是 16 个 Base62 字符(services.cloud_sync.ids.new_sync_id)。它在首次开启同步时填充,之后永不更改。本地 ID 保持本地不变。
  • 同意 basis 为 own_voice 或 speaker_permission,attested_at 采用 RFC 3339 UTC 格式。没有证明的语音永远不会被推送(voice_sync_content 返回 None)。仅当开启“Include consent recordings”时,同意记录才会随数据一起传输(S2 服务器阶段)。
  • VSB1(指南第 9 节):"VSB1" 后跟 8 字节 nonce 前缀,然后是每个大小为 4,194,304 字节的块,每个块使用 AES-256-GCM。nonce 是前缀加上 uint32_be(i)。AAD 是 "VSB1" 加上 blob_id(16 个 ASCII 字节)、uint32_be(i) 和一个结束标志字节。大小为 12 + plaintext + 16 × n。任何标签校验失败,或结束标志不在最后一个块上,都会导致整个文件失败。支持范围解密。数据密钥永远不会写入磁盘或日志。
  • 数据库更改通过 alembic(0015_voice_sync_prep)进行,并在 _BASE_SCHEMA 中镜像,因此 _reconcile_additive_columns 可以修复无法运行 alembic 的数据库。现有语音保持原样继续工作。
  • 本地化:全部 21 个区域设置。

任务

  1. 列和 ID。 Alembic 0015 添加 voice_profiles.sync_id、consent_basis 和 consent_attested_at,并在 sync_id 上添加唯一部分索引。cloud_sync/record_ids.ensure_sync_ids() 填充缺失的 ID,CloudSyncService.turn_on 会调用它。测试:从 0014 升级会保留行;ID 只填充一次且保持稳定;reconcile 步骤无需 alembic 即可添加列。
  2. 证明 API 与推送门禁。 POST/DELETE /profiles/{id}/attestation {basis};profile 负载包含 consent_basis 和 consent_attested_at。cloud_sync/voices.voice_sync_content(row) 构建 voices 内容,或在语音未获证明时返回 None。测试:basis 校验、设置和清除、无证明即无内容、内容形状与 sync-collections 匹配,并且内容不含本地路径或 ID。
  3. VSB1(cloud_sync/vsb1.py)。测试:0 字节、1 字节、正好一个块以及一个块加 1 字节的往返;大小公式;被篡改的标签失败;截断的文件失败(缺少结束标志);错误的 magic 失败;块交换失败;中间块的范围解密正常工作。
  4. 同意 UI。 在语音的同意面板中,提供“This is my voice”和“I have the speaker's permission”,以及 Remove 选项。字符串覆盖 21 个区域设置。测试:每个按钮提交其 basis;已证明的语音显示其 basis 并能清除它。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 om/VoiceStudio