这个项目能做什么
Tandem 是一个预发布阶段(版本 0.1.0,尚未有标签发布)的自托管项目,其目标非常明确:阅读一本书,聆听同一本书,且永远不会丢失进度。该项目由运行在 Docker 中的服务器(搭配 PostgreSQL 和 Web 应用)以及作为轻量级客户端的 React PWA 和 Kotlin/Jetpack Compose Android 应用组成。服务器负责所有有状态的工作——扫描电子书和有声书卷宗、提取元数据和封面、将电子书与有声书配对、运行转录队列、生成同步映射,并且是阅读位置的唯一写入者。客户端通过带有 JWT 认证的 REST 端点读取和写入位置,且仅保留设备本地缓存。
其核心竞争力在于格式之间的句子级交接。在不同设备上从阅读切换到聆听(或反之)时,用户将直接跳转到当前所在的句子,而非章节开头。这需要转录支持:有声书被转录并与 EPUB 文本对齐。Whisper 可以在构建了可选本地栈的服务器镜像中本地运行,或者默认情况下将任务交给独立的 Jetson 工作节点(使用 faster-whisper;参考部署为 Orin Nano 8 GB,默认使用 medium 模型)。配套功能包括带有重试机制、非高峰时段窗口的转录队列以及转录编辑器;转录是可选的,若不启用,用户仍可使用库和两种阅读器,但无法实现跨格式同步。
其他描述的功能包括:支持系列分组和电子书/有声书自动配对的库扫描器;具有锁屏控制功能的 PWA Web 阅读器/播放器(由于没有 iOS 应用,这是 iPhone 用户的方案);支持离线下载、后台播放和 Android Auto 的 Android 阅读器/聆听器;具有角色划分且默认仅限邀请注册的多用户账户;可选集成(Audiobookshelf、Google Books、Open Library 元数据,以及需要特殊镜像构建的 ACSM/Audible 导入);以及可通过 UI 恢复的每夜 Postgres 备份和封面快照。
部署通过 Docker Compose 完成。README 中异常明确地指出,密钥应存储在文件中而非环境变量中(如 secrets/ 下的 JWT 密钥、Postgres 密码、Fernet 凭据加密密钥);由于队列和调度器是进程本地的,服务器必须作为单进程运行;且新安装会创建一个随机密码的超级管理员(密码写入日志),强制在首次登录时重置。反向代理设置需要配置 FORWARDED_ALLOW_IPS,并提供了一个加固的 Caddyfile 示例。详尽的环境变量表涵盖了强制性、可选、认证节流、上传限制和同步可调设置;API 文档(/docs, /redoc)在生产环境中被刻意禁用。
文档坦诚地列出了局限性:仅 EPUB 支持同步(PDF 可配对但无法对齐;MOBI/AZW3 必须转换);有声书必须为单文件(多文件拆分版会被跳过,需先合并为 .m4b);一次仅能进行一项转录;不支持水平扩展;没有 iOS 应用;Android Auto 未在硬件上测试;没有任何崩溃报告机制;最近才实现了下载/流媒体路径;且未上架任何应用商店。该项目被描述为由单一维护者开发并用于日常使用,拥有真实的测试套件,但除了作者自己的硬件和库布局外,接触到的环境有限。
评论
0 评分人数达到10人后显示
登录后参与讨论。