我曾创建了一个用于 Android 的 Audiobook 播放器,名为 Earleaf。技术上最有趣的部分是 Page Sync 的功能:您只需拍摄一本物理书上的一页,Earleaf 就会在音频中找到这一位置。

匹配流程分为两个阶段完成。首先,audiobook 会使用 Vosk 语音识别工具在设备上进行转录,這得到一个存储在 FTS4 中的单词级别索引 (\~72,000 个单词用来表示 10 小时的书)。当您拍摄一张照片时,ML Kit 会使用 OCR 提取文本,并且我会使用 FTS4 的前缀查询来找到候选位置。当一个带有莱文斯坦相似度计分的滑动窗口缩小到最好的匹配时,寻找过程会结束。这个查询过程需要 100-500 毫秒。

调试中遇到的最纠结的问题是音频重采样。Vosk 需要 16kHz 但大多数 Audiobook 是 44.1kHz。与实际有所不同,因此在每个片段对应的累计时间戳都会漂移约 30 秒,导致 12 小时的 audiobook 中时间戳累计了大约 30 秒的缓慢漂移。为解决此问题,我改为在全局级别跟踪累积块的帧数,而不是对每个片段进行衰减。

关于这部分流程的更深一步分析,感兴趣的人请点击https://earleaf.app/blog/a-deep-dive-into-page-sync

免费下载 Earleaf 在 Google Play:https://play.google.com/store/apps/details?id=app.earleaf