Skip to content

数据目录 ​

每个租户有两个目录,都在 tenants.json 里指定:data(数据库和派生数据)和 recordings(原始录音)。按快速开始部署的 Docker 里,它们是宿主机上的 data/main 和 data/main/recordings。

DATA_DIR ​

DATA_DIR 在 Docker 里是宿主机的 ./data;用 uvx、pip 或从源码运行时默认是用户数据目录(见配置项)。第一次启动生成的租户 main 在它下面:

text
<DATA_DIR>/
├── tenants.json
├── models/                         模型文件(MODELS_DIR)
└── main/                           租户 main 的 data 目录
    ├── live.db                     SQLite 数据库(WAL 模式,旁边有 live.db-wal、live.db-shm)
    ├── <日期>.passes.jsonl          每次转写时引擎的原始输出
    └── recordings/                 租户 main 的 recordings 目录
        └── chunks/<设备名>/<日期>/<HH>.<扩展名>

data 目录 ​

路径内容
live.dbSQLite 数据库,见下表;结构定义在 server/alldayrec/db.py
<日期>.passes.jsonl每一遍转写时引擎的原始输出
owner-redimnet2.npz「我」的声纹
voices/clips/说话人的声音片段
firmware/录音设备的固件包(只在第一个租户的目录里)
live-record.apk服务器在 /app.apk 提供的安卓 App(只在第一个租户的目录里)

recordings 目录 ​

路径内容
chunks/<设备名>/<日期>/<HH>.<扩展名>每台设备每小时一个文件,收到的音频块原样追加在后面;每块在文件里的位置和长度记在 live.db 的 pieces 表里。扩展名按上传时的 Content-Type:ogg、webm、aac,其他是 bin
rejected/<设备名>/<开始时刻>.<扩展名>解码失败(接口返回 400)的上传,原样留着供检查

live.db 的表 ​

表内容
sentences定稿的句子:时间、说话人、文字、来源设备、引擎
drafts初稿层的句子(只在页面开着时产生),定稿覆盖后仍保留
conversations对话:起止时间、参与者、说话秒数、句数、类型、设备
summaries每段对话的摘要(JSON)
timelines对话结束时的实时分析
voices每段对话里每个说话人标签的声纹和声音片段
apart被标成「不是这个人」的声音
people认出名字的人的声纹
enrolled每个人的声纹是从哪些句子学来的,一句一行;撤销和拆开时据此减掉
aliases一个人的别名
name_hints每个标签在对话里被怎么称呼(只用于建议名字)
profiles认出名字的人的人物卡片,每一行带出处
pieces上传的音频块索引,也是处理队列
feedback用户对摘要的纠正
todo_marks待办上的「完成」或「不对」标记(main 上新增,v0.1.0 没有)
kv每台设备的处理进度等键值
device_log手机上传的设备事件,包括录音设备自己的日志
device_status客户端读到的录音设备状态(电量、存储卡、固件)
calls每次语音识别和大模型调用的耗时、结果和用量,不记内容
balances预付费账户的余额,每小时一次
perf_stalls事件循环被卡住的记录:结束时刻、毫秒、卡在哪些函数(只在第一个租户的库里;main 上新增)
perf_samples进程每分钟一行:CPU 秒、内存、循环延迟、各线程池占用、排队的音频块、打开的网页数(只在第一个租户的库里;main 上新增)
perf_requestsHTTP 请求:用时 50 ms 及以上的每个一行,另外每分钟按方法、路由、状态码各一行汇总(main 上新增)
perf_pieces每个定稿块和初稿轮次各步骤的耗时:解码、VAD、识别、声纹、写库(main 上新增)

perf_ 开头的表只记耗时和资源用量,不记内容,保留 90 天。GET /api/perf?day=YYYY-MM-DD 读一天的;从数据库副本导出用 python -m alldayrec.perf export <live.db> <YYYY-MM-DD>。

enrolled 出现之前学到的声纹,每人只有一行汇总,不对应具体的句子。那时学进了别人声音的,可以用 python -m alldayrec.bank relearn <live.db> 从这个人现在名下的声音(实时录音里的)重新算出这一行:只打印每人前后的句数、用上和丢掉的声音数、新旧声纹的余弦,不写库;加 --apply 才写,写完重启服务端(声纹在启动时载入)。之后逐句学到的不受影响。