1、立项背景和目标
个人记账存在一个核心矛盾:记账是高频、低价值感知的重复动作,传统 App 要用户手填金额、
分类、日期、备注四项以上,导致「记三天就放弃」。本项目把流程压成「说一句话」,并让数据
全部留在用户手机上。
项目源于抖音技术视频《用 AI 从零开发并上线 APP 全流程》。原方案为 iOS + 云数据库 +
Gemini + 付费订阅上架,落地时按自身条件做了五项改造:载体改为安卓(Flutter,无需 Mac);
数据从云库改为本机 SQLite;模型换为 DeepSeek;不做付费订阅;不依赖应用商店,直接以 APK
安装分发,省去全部上架审核。
目标是交付一个可真实安装、数据可备份迁移、具备记账-统计-分析闭环的安卓应用。
2、软件功能、核心功能模块介绍
APP 共 5 个一级页面:记账、统计、账单、AI 报告、设置。
① 语音记账(核心):点麦克风说「买奶茶花了 30」,本地模型实时转文字并逐字上屏,说完
自动交模型解析成结构化账目并弹预览卡,确认后入账,无需选分类、敲金额、填日期。
② 文字批量记账:输入「打车 23 块 5、午饭 35、发工资 8000」,一句话里的多笔消费被拆成
多条独立账目,逐条预览后批量确认。
③ 自动分类:内置餐饮、交通、购物、医疗、住房、娱乐、教育、其他、收入共 9 个固定分类,
由模型按语义判断归属。
④ 统计看板:分类占比环形图、每日趋势折线图(带磁吸游标)、分类排行、收支对比,支持
日 / 周 / 月周期切换与左右滑动切版块。
⑤ 账单明细:全量账目倒序列表,左滑删除并带二次确认。
⑥ AI 财务报告:一键对当前账期生成中文 Markdown 分析,输出总额、笔数、最大支出项及占比,
并给 1-2 条具体建议。
⑦ 账单导入:支持微信、支付宝导出的 CSV 批量导入,自动识别编码、去重、剔除无效行。
⑧ 备份与恢复:账目一键导出 CSV,可从备份完整恢复,并支持一键分享到微信、邮箱。
⑨ 每日提醒:设备本地定时通知,点击直达记账页。
⑩ 账号体系:注册 / 登录 / 游客三种模式,支持改名。
⑪ 外观:深 / 浅双主题,切换带圆形揭示动画,另有流光背景、品牌卡、弹簧按压回弹。
⑫ 应用内更新:APP 内检查并下载新版,自动识别本机签名线路避免装不上。
3、业务流程、功能路径描述
主链路(语音记账):启动 → 登录或游客进入 → 点麦克风 → 本地模型流式转文字 → 文本送模型
解析为 JSON → 校验字段 → 生成预览卡(可逐笔改金额与分类)→ 点确认入账写库 → 统计页与
账单页实时刷新。
辅助链路(账单导入):设置页 → 数据区块 → 导入账单 → 选微信 / 支付宝 → 拉起系统文件
选择器选 CSV → 嗅探编码(UTF-8 / GBK)→ 定位表头 → 逐行解析 → 与全部历史
1、整体架构和设计思路,不同模块使用的技术栈
架构为「单机应用 + 单个远程模型接口」:界面、业务逻辑、数据层全部跑在手机本地,仅 AI
解析与报告生成需联网。
· 界面与业务逻辑:Flutter + Dart,自建 12 个可复用组件;Provider 做轻量状态管理。
· 本地数据层:sqflite + SQLite,3 张表(用户 / 账目 / 分类),账目表按
(user_id, recorded_at) 建索引;4 个 SQL 聚合查询直接支撑全部图表。
· 语音识别:sherpa-onnx + 中文流式 CTC 量化模型(25 MB),纯本地推理,零联网、零费用、
零密钥,实测比实时快约 15 倍。
· 语义解析与报告:DeepSeek 接口,两个能力(结构化解析 / 财务报告),密钥仅存本机。
关键设计思路(均来自实测):
① 两段式确认:语音 → 解析 → 预览 → 确认 → 才入库。模型必然偶发听错,直接入库等于每笔
都要回头改,多一次点击换零返工。
② 分类枚举约束:提示词把分类写死为 9 个,代码层再兜底一次(枚举外归「其他」),否则
模型会造出碎片分类,统计图会碎掉。
③ 消费时间与录入时间分离:统计按发生时间、审计按录入时间,模型返回的原始 JSON 留痕以
便回溯;提示词同时排除「没买的东西」。
2、「我」的负责模块和结果(尽可能量化)
独立完成需求定义、架构设计、UI/UX 设计、编码、测试、签名分发与版本迭代。
· 代码规模:lib/ 下 39 个 Dart 文件,flutter analyze 结果 No issues found。
· 版本迭代:git 69 次提交,线上 1.0.0 至 1.0.10 共 11 个正式版本,每版一主题(周期切换
/ 滑动切版块 / 趋势图重做 / 备份导出与分享 / 账单导入 / 应用内更新)。
· 界面产出:78 张界面截图,覆盖全部页面与双主题。
· 自动化验证:自建纯 Dart 脚本,账单导入 44 项断言、单元测试 28 项全通过。
· 性能实测:语音 5.6 秒音频耗时 370 毫秒;模型一次正确拆出「打车 23 块 5、吃饭 35、买
T 恤 189、发工资 8000」4 笔账,金额与分类全对。
· 分发结果:双签名线路并行,APK 公网可下载,他人真机直接安装可用。
3、「我」遇到的难点、坑,和解决方案
① 语音链路不可用:安卓内置识别依赖厂商预装语音服务,精简镜像直接报
recognizerNotAvailable;改用离线模型 sherpa-onnx 内置,摆脱厂商依赖并省掉云端 STT
的密钥与按量计费。
② 国产手机拒装 APK:报「软件包似乎无效」,真因是 Flutter 默认用调试证书签名 release