{"repo":"jstriblet/open-whispersync","free":true,"listed":false,"github":"https://github.com/jstriblet/open-whispersync","clone":"git clone https://github.com/jstriblet/open-whispersync.git","description":"Self-hosted Whispersync: sync your exact spot between Kobo ebooks (Calibre-Web) and Audiobookshelf audiobooks using forced alignment","language":"Python","stars":18,"topics":["audiobooks","audiobookshelf","calibre-web","ereader","homelab","kobo","self-hosted","whispersync"],"license":null,"category":"self-hosted-apps","readme_excerpt":"open-whispersync A self hosted version of \"Whispersync\" which is position syncing between a Kobo ereader (served by Calibre-Web) and your audiobooks in Audiobookshelf Listen to a chapter on your commute, then press the Kobo's native Sync button : the ebook jumps to the exact paragraph the narrator just finished. No new buttons, no separate app. How it works The hard part is knowing that audio second 14,203 equals page position X in the ebook. This project solves it with forced alignment : it runs aeneas against your audiobook narration and the ebook's kepub text spans, producing a per-book alignment map (tens of thousands of text fragments, each with a start time). After that, translating a position between the two formats is a table lookup. - All alignment tooling (aeneas, espeak-ng, ffmpeg) is baked into the container; nothing is installed on the host. - A small web UI on port 3005 lets you add a book and build its alignment map from the browser. - The Calibre-Web side is one thin hook in cps/kobo.py (see patches/ ) that calls the container during a normal Kobo sync. Errors are swallowed, so if the container is down your native sync works exactly as before. Safety model - Forward-only. Your position never moves backward. On any ambiguity or missing map, the sync is a no-op. - Write-gated. Position write-back to Audiobookshelf is disabled until you set WHISPERSYNC ALLOW ABS WRITE=1 . - The hook never breaks the native sync: every whispersync error is caught. Status - Audio →","default_branch":null,"files":null,"tree":[],"storefront":"/r/jstriblet","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/jstriblet/open-whispersync/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}