CanDid 的 iOS 版在录后报告之外,增加了准备包、表达积累和模拟练习。它们共用录音原文和记忆库资料,方便在下一次沟通前继续准备。

CanDid 由团队共同开发,公开仓库在 ChenglinW 名下。这个版本包含队友完成的记忆库合并、FAQ 整理和原生页面工作。

1. 首页布局与准备包

V2 原生 iOS 入口收敛为 Candid、记忆库和录音。首页留下下一次准备与最近录音,一个持续 Chat 串起会前准备和录后复盘。

CanDid V2 SwiftUI 首页和准备卡
真实 SwiftUI 测试截图,客户名、会议安排和记录均为合成资料。

1.1 准备包的保存与展示

生成的准备包会保存,首页卡片和 Chat 引用同一份结果。退出聊天后,可以从首页重新打开。

同客户的新版本替换相应卡片,别的客户不跟着变化。过期准备继续保留,结束场次由明确操作处理。相对日期按手机时区确定,未指定日期的安排保留为空。

1.2 聊天状态与录音身份

线程、草稿和阅读位置都要保留。录后消息、首页、录音列表和原文使用同一个录音身份;重跑处理或修订转写时更新原卡片,避免重复通知。

2. 记忆来源与版本管理

记忆库分长期文件、表达积累和跨场发现。文件支持文本型 PDF、DOCX、PPTX、TXT 和 Markdown;扫描 PDF 的 OCR 还没接入,损坏或无法解析的文件会向用户报错。

保存的内容 连同什么一起保存 更新时怎么办
表达积累 原文、时间戳、来源版本 用户可编辑;重新处理不覆盖改写
跨场个人结论 支持它的资料和待确认内容 集中确认后再作为个人事实
录音衍生内容 录音身份、原文与来源版本 来源修订或删除后重新查依据

例如,源录音的一句话后来改了,依赖它的摘要和表达也得重新检查。V2 补了递归检查与旧版本排除,避免原文已经失效,Agent 又从旧摘要里把同一句找回来。未知说话人的经历也不会自动算到本人头上。

CanDid 复盘与原文回听界面
合成业务场景的原生页面,展示具体问题、回听和原文入口,不代表真实客户业绩。

3. 录音中的字幕和最终复盘分开

录音结束后,再衔接最终 ASR、复盘、表达积累和主动消息。录音中的“问 Candid”使用当前字幕快照,并提示还没校准;问题、快照和录音绑定,重试也仍然针对原快照。普通资料检索不会混入这段临时字幕。

自动分离得到的说话人 ID 需要用户认领身份。语速、说话占比和声学指标根据转写与分离结果计算,其准确性受这两个步骤影响。

10月已在 HTTPS 服务上完成文件解析、问答、准备包保存、录音处理、流式转写和 TTS 联调,并用既有录音做过隔离复核。实现记录见V2 记录。

4. 模拟面试与销售练习

4.1 角色和教练分开

10月17日加入的模拟面试和销售练习共用引擎,可以从准备包或 FAQ 开始,语音为主,也能打字。练习中保持面试官或客户角色,用户主动要提示时才提供指导,结束后再集中复盘。

角色读取问法和情境,教练读取参考说法与已确认积累,两者使用不同的资料范围。

4.2 表达采用与版本检查

练习保留资料版本、完整问答、提示和复盘。新的表达先让用户编辑,再明确保存。roleplay.py中的采用请求包含版本字段,下面是公开源码摘录:

class Adopt(BaseModel):
    model_config = ConfigDict(extra='forbid')
    correction_index: int = Field(ge=0,le=2)
    text: str = Field(min_length=1,max_length=6000)
    expected_version: int | None = None

expected_version 用于和已有内容版本核对,避免一次晚到的保存覆盖期间已经改过的表达。模拟内容也不计入真实客户沟通、录音场次或长期个人事实。具体流程见模拟练习记录。

5. 云端交付与待测项

这一阶段已发布云端服务,并在 iPhone 上完成安装和启动。供应商语音联调使用隔离资料与合成音频,待测内容包括物理麦克风、扬声器回声、打断、后台生命周期,以及录音豆按钮和蓝牙同步。

当时的重叠说话样本仍有漏掉一方的情况。多场长期记忆、说话人归属和用户改写保留也还需要持续测试。