Skip to content

配置项 ​

服务器的设置分两处:tenants.json 列出它为哪些人服务,环境变量(通常写在 .env 里)设置其余一切。服务器缺必填项时拒绝启动,并在日志里写出缺了哪些。

适用版本

这一页按 main 分支写。v0.1.0 没有 UI_LANG 和 tenants.json 的 lang 字段;v0.2.0 及以前 LOOP_STALL_MS 默认不检测。其余各项相同。

tenants.json ​

一个 JSON 数组,每个人(租户)一条。权限必须是 600。

json
[{"id": "main", "token": "<token>", "data": "/data/main", "recordings": "/data/main/recordings"}]
字段说明
id租户名,用在日志和监控指标里
tokenApp 和网页发来的 token(Authorization: Bearer 或 cookie)
data数据目录:live.db 等,见数据目录
recordings录音目录
lang可选。大模型给这个人写的内容(摘要、待办、实时分析、每日回顾、「问 AI」回答等)用的语言:zh 或 en。不写时用 UI_LANG,UI_LANG 也没有时是 zh。在网页「我的」页切换语言(PUT /api/lang)之后,以切换的结果为准,记在这个人的数据库里,重启后也保留
  • 位置:DATA_DIR/tenants.json(见下面的 DATA_DIR)。Docker 镜像里 DATA_DIR 是 /data,也就是宿主机的 data/tenants.json。
  • 文件不存在时,服务器第一次启动会生成一个:一个租户 main,随机 token,目录是 DATA_DIR/main 和 DATA_DIR/main/recordings,并在日志里写出登录链接 http://127.0.0.1:<PORT>/connect?token=<token>。
  • id、token、data、recordings 在租户之间都不能重复。
  • 只有一个租户时 token 可以为空,这时不做认证,服务器只能放在 127.0.0.1 上。有多个租户时每个都必须有 token。
  • 服务器只在启动时读这个文件。

.env ​

.env.example 列出了下面每一项并附有注释。「示例值」是 .env.example 里写的值,复制成 .env 后就是你的起点;「不设时」是变量完全不存在时代码里的默认值。

.env 里的注释要单独占一行:Docker Compose 会把 VAR= # 注释 读成值 # 注释。

必填:语音识别 ​

变量示例值不设时说明
ENGINEqwenqwen定稿层的语音识别引擎:qwen、volc、stepfun-sse、stepfun、stepfun-file、local。见如何更换语音识别引擎
DASHSCOPE_API_KEY空—阿里云百炼(DashScope)的 key,北京区。qwen 和 qwen-stream 用

必填:大模型 ​

用于对话摘要、待办、「问 AI」和每日回顾。可以是任何支持工具调用和 response_format 为 json_object 的 OpenAI 兼容 POST /chat/completions 接口:云服务,或者你自己运行的服务(vLLM、llama.cpp、Ollama)。

变量示例值不设时说明
LLM_BASE_URLhttps://dashscope.aliyuncs.com/compatible-mode/v1必填接口地址,服务器在后面加 /chat/completions
LLM_API_KEY空必填接口的 key;用示例的百炼兼容模式时和 DASHSCOPE_API_KEY 是同一把
LLM_MODELqwen-plus必填模型名

可选 ​

变量示例值不设时说明
DATA_DIR空用户数据目录:Linux 是 ~/.local/share/alldayrec(设了 XDG_DATA_HOME 时是它下面的 alldayrec),macOS 是 ~/Library/Application Support/alldayrectenants.json 所在的目录;MODELS_DIR 不设时模型文件在它下面的 models,第一次启动生成的租户在它下面的 main。Docker 里固定为 /data
MODELS_DIR空DATA_DIR/models模型文件目录,绝对路径、可写;缺的文件启动时下载到这里。Docker 里固定为 /data/models
PORT87708770监听端口。Docker Compose 里固定为 8770
HOST127.0.0.1127.0.0.1监听地址;反向代理在另一台机器上时设 0.0.0.0。Docker Compose 里固定为 0.0.0.0
DRAFT_ENGINE空同 ENGINE初稿层(页面开着时)的引擎;另可设 qwen-stream:页面开着时把音频流式推给千问(百炼 qwen-audio-3.1-asr-flash-streaming,用 DASHSCOPE_API_KEY),边说边出字
ENGINE_FALLBACK空无ENGINE 或 DRAFT_ENGINE 在某个窗口上失败(402、451、5xx、超时)时改用的引擎;空着就稍后重试
VOLC_ASR_KEY空—火山方舟 Agent Plan 的 API key,volc 用
STEPFUN_API_KEY空—阶跃星辰的 key,stepfun、stepfun-sse 用
STEPFUN_SSE_URL空https://api.stepfun.com/v1/audio/asr/sse阶跃 SSE 接口;默认是按量付费的地址,Step Plan 用 .../step_plan/v1/audio/asr/sse
LOCAL_ASR_URL空k2-fsa/sherpa-onnx 的 GitHub Releaselocal 的模型包(约 136 MB)从哪里下载;镜像站上同一个模型包也行(按 sha256 校验)
UI_LANGzhzh大模型写的内容(摘要、待办、实时分析、每日回顾、「问 AI」回答等)用的语言:zh 或 en。tenants.json 里的 lang 优先。没选过语言的浏览器打开网页时也用它;App 的界面不受影响
RECAP_AT10:0010:00每天这个时刻写昨天的回顾;设为空就不写
TZAsia/Shanghai系统的时区对话日期和 RECAP_AT 用的时区。Docker 容器的系统时区是 UTC;TZ= 设为空也是 UTC
REFINE_EVERY_S2030初稿层:这么久没有停顿就做一次
TURN_GAP_S01.0大于 0 时,把同一个说话人间隔小于这个秒数的相邻句子合成一行;0 保留引擎原来的分句
FIRMWARE_TOKEN空无上传录音设备固件(firmware/devkit/lr_release.py)时除租户 token 外还需要的 token;空着就不能上传
VM_INGEST_URL空无VictoriaMetrics 的导入地址(比如 https://example.com/api/v1/import/prometheus),每分钟推送 lr_* 指标;空着就不推
VM_INGEST_USER、VM_INGEST_PASSWORD空空推送指标用的 basic auth

高级:只有 stepfun 和 stepfun-file 用 ​

stepfun 或 stepfun-file 出现在 ENGINE、DRAFT_ENGINE 或 ENGINE_FALLBACK 里时,下面四个 ASR_* 都必填。

变量示例值不设时说明
ASR_UPLOAD_BRIDGE_URL空—你自己的上传桥:POST {filename, content_type},返回 {upload_url, download_url}
ASR_UPLOAD_BRIDGE_TOKEN空—上传桥的 token
ASR_SERVICE_URL空—你自己的文件模式语音识别服务(带说话人和词时间):POST /audio/transcriptions {audio_url, model}、GET /jobs/{id}
ASR_SERVICE_BASIC_AUTH空—这个服务的 basic auth,写成 user:password
FILE_MODELSstepaudio-2.5-asr-8006,doubao-seedasr-2.0同示例值文件模式引擎,按顺序;第一个拒绝的窗口交给第二个

只有离线脚本用 ​

变量用在说明
LIVE_DATA、RECORDINGS_DIRowner.py、replay_case.py一个租户的数据目录和录音目录
OWNER_LABELSowner.py已知是本人声音的窗口(jsonl)
CASES_DIReval_all.sh标注好的评测用例目录
EMB_MODEL、SEG_MODEL、OWNER_SURE、LINK_MIN、OWNER_DEFAULT_DEVICEreplay_case.py、service_case.py见这两个脚本

其他环境变量 ​

服务器还读下面这些变量,.env.example 里没有列出。它们是调参用的,默认值就是作者在用的值。

变量不设时说明源码
SLICE_FOREGROUND_S、SLICE_BACKGROUND_S、SLICE_SCREEN_OFF_S1、20、60App 在前台、后台、熄屏(安卓)时每块音频的秒数,App 通过 /api/client-config 读取routes_upload.py
REFINE_WINDOW_S240初稿层一次最多处理的音频秒数device_pipeline.py
LIVE_EVERY_S120进行中的对话新增这么多秒语音后,重做实时分析device_pipeline.py
SQUEEZE_KEEP_S3送给引擎前,长于这个秒数的静音剪到这么长;0 表示整段送asr.py
SQUEEZE_VAD0.3判断上面那些静音用的 VAD 阈值segmenter.py
SUMMARY_WORKERS4同时写摘要的数量summaries.py
QWEN_ASR_MODELqwen-audio-3.1-asr-flash-filetransqwen 引擎用的百炼模型qwen_asr.py
ASR_CALLS、INFER_CALLS、DB_CALLS、MEDIA_CALLS1、2、8、16同时进行的本地语音识别、声纹计算、全库查询、音频编解码的数量threads.py
INFER_THREADS4每次声纹计算用的 onnxruntime 线程数infer.py
MUSIC_DETECT1定稿时听出是音乐(外放的歌、伴奏和人声差不多一样响)的句子不取声纹,说话人记为 S?,不会进人物页;仍然转写,转写行上有音符图标。把这句的说话人纠正成某个人,它就算人声:音符去掉,照常学声纹。0 关闭music.py
VAD_GAIN_MAX_DB16给 VAD 的特征最多提升多少 dB(只影响语音检测,不影响送给引擎和回放的音频);0 关闭infer.py
ASR_GAIN_MAX_DB16送给引擎的音频最多提升多少 dB;0 原样送squeeze.py
DEHUM1读取录音设备的音频时去掉它 10 ms 周期的哼声;0 关闭audio.py
SPEAKER_LINK、SPEAKER_SUGGEST、MERGE_SUGGEST0.5、0.6、0.45人物页的声纹相似度阈值:并入匿名组、建议给名字、建议合并同一段对话里的两个标签routes_speakers.py
DIAR_TH、DIAR_JOIN、DIAR_GUARD、PEOPLE_MIN0.5、0.35、0.6、0.7一段对话内区分说话人的阈值diarist.py
SELFVOICE_POP_P0.95「哪个是你的声音」卡片自动弹出前,第一个候选需要达到的概率selfvoice.py
LOOP_STALL_MS100事件循环被卡住超过这么多毫秒时,日志里记一行卡了多久、卡在哪个函数(每秒最多一行,其间的次数一并记上),同时存进 perf_stalls 表;每分钟的循环延迟和线程池占用也靠它测。约占 0.6% 个核;0 关闭monitor.py