CanDid 的早期 Android 版用于面试准备和录后复盘:填写背景、准备问题、导入回答,再查看反馈和回听原文。下一次练习可以继续使用这些资料。
这个项目由团队一起推进,我参与了这一阶段的原生 App、后端和联调。界面有准备、练习、成长、素材四个入口。
1. 首页与准备流程
岗位介绍、个人经历和上一次回答如果各放各的,准备面试时还是得重新翻。首页因此先围绕当前目标和背景,给出能开始练习的问题,同时保留草稿。

1.1 背景版本与准备更新
素材既可以是自己的介绍,也可以来自 coffee chat 和模拟面试。用户修改背景后,新准备应引用新版本,旧描述不能继续混进去。本地 Demo 已支持修改背景后重新生成准备。
如果材料中缺少具体职责或结果,反馈会提示用户补充。
1.2 同题回答的前后对照
前后两次回答分别保留来源,反馈可以引用两侧原文比较变化。联调时把同一份音频导入两次,检查结果是否为“无明显变化”。
2. Android 客户端与本地后端
原生客户端用 Kotlin/Compose,本地 FastAPI 后端负责准备、转写、分析和持久化。SQLite 保存业务记录,音频文件另行保存;模拟器通过本机后端调用真实 ASR 和模型服务。
| 位置 | 这轮负责的事 |
|---|---|
| Android 客户端 | 输入背景、导入音频、展示准备和复盘、来源回听 |
| FastAPI 后端 | 鉴权、准备生成、转写与反馈任务 |
| SQLite 与本地文件 | 保存用户、目标、录音来源和音频 |
| 外部模型/ASR | 实际的语言生成与语音识别 |
App 和业务服务在本机联调。凭据保存在服务端,客户端通过鉴权后的业务接口访问。云端和 Supabase 已有迁移脚本与容器配置,当时尚未部署。
3. 音频导入与转写反馈
3.1 音频来源与任务恢复
导入一段音频以后,要保留文件、压缩和上传状态,再做转写、反馈和回听。离线导入、等网络恢复、继续生成报告,这条路径在当时已经走过。旧录音也始终属于创建时的目标,切到另一个机会不会顺便把它搬过去。
流程伪代码:
保存音频及其用户、原目标
若离线:保留待处理任务
联网后:转写音频
校验有效时间数据
生成反馈,并保留原文引用
从引用位置回听原音频
3.2 转写时间戳校验
联调时碰到过分段时间全为零、逐词时间却有效的返回。后端利用真实逐词时间重建片段;没有可用时间就明确失败。回听定位使用这些时间戳,错误时间会让播放跳到无关片段。
音频来源和目标归属一起保存,反馈中的建议可跳回对应回答。
4. Android Demo 完成情况
| 项目 | 10月7日前后的状态 |
|---|---|
| 导入音频→真实转写/反馈→回听 | 已形成可演示流程,保留来源和用户归属 |
| 背景更新与同题前后对照 | 已有场景走通,同音频会显示无明显变化 |
| App 内受控麦克风录答→重答 | 尚未做通;早期出现固定音、近静音和环境混音 |
| 云端、Supabase、实体手机 | 不在这轮本地模拟器交付里 |
| 录音豆 | SDK 编译、授权、连接同步和标记单位仍需逐项实测 |
界面检查覆盖默认宽度、360dp 窄屏、繁体和英文、大字号、深色样本,以及来源回听和返回。真实收音环境与完整交互流程还需要进一步测试。
这一轮留下了可安装的本地联调 APK、工程和合成演示素材。最先接通的是“背景准备、导入回答、转写反馈、来源回听、再次准备”。后续团队转向 iOS 与记忆工作流,公开工程见CanDidNative。

Comments NOTHING