Releases: Inguiotar/ABChapterize
Release list
abchapterize 0.10.1
Marks that keep their run-up, and a book that says when something went wrong.
A bugfix release on top of 0.10.0. New here? The README explains what ABChapterize is for. What follows is what changed.
Marks land in front of the announcement again
A mark is meant to start playback a moment before the narrator says "Chapter Five". On some books almost none of that run-up survived, and seeking to a chapter dropped you into the middle of the word "chapter". The start of the announcement is now read off the waveform, where a pause runs up to it, instead of being inferred from where speech recognition gives up on a phrase clipped at the front. Affected marks move earlier by up to about three tenths of a second; books that play a jingle straight into the announcement never had the problem and do not move.
The wrong language is much harder to end up in
With --lang auto, a file's language used to be decided from the very first seconds of the book — which on an audiobook is as often a label jingle or a copyright card as it is narration. Guessing wrong costs far more than a mistitled chapter: the language supplies the phrase every pass looks for, so a German book taken for English spends a long time hunting for "chapter" and finds nothing. Detection now samples actual narration from inside the book, and a doubtful reading is re-checked at up to five places before it is acted on.
Fewer silent surprises
- A book whose chapter numbering restarts no longer just stops. In a book split into parts, each part may begin again at chapter one; those announcements were heard, then quietly dropped for not continuing the sequence. The file's summary now reports how many were skipped and points at
--ignore-chapter-numbers. --summarynames the books it found nothing in, with the reason for each, next to the skipped and still-incomplete ones.--backupno longer eats the backup it already made. Re-running a book used to replace the.bakwith the previous run's output, so "undo" quietly became "undo the last run" rather than "undo everything". An existing.bakis now kept.--debugstarts a fresh log each run instead of appending, so a hit in the log belongs to a known run and two runs can be compared by diffing them.--log-filestill appends.
The CHANGELOG has the full list, in detail.
Downloads
| File | Platform |
|---|---|
abchapterize-0.10.1-win-x64.zip |
Windows x64 |
abchapterize-0.10.1-linux-x64.tar.gz |
Linux x64 (glibc) |
Self-contained — no .NET runtime to install. Each archive carries the executable, the native Whisper and ONNX Runtime libraries (CPU, CUDA and Vulkan backends), the README, the manual and all license texts. Unpack anywhere and keep the runtimes folder next to the executable; you still need ffmpeg/ffprobe available, and the speech model downloads itself on first run.
abchapterize 0.10.0
Chapter marks that land where the narrator actually says "Chapter Seven".
A feature release on top of 0.9.1. New here? The README explains what ABChapterize is for. What follows is what changed.
Faster where it was slow
The first pass now uses your whole machine. The speech scan that opens every run used to work through a book one short frame at a time on a single thread. It now spreads the timeline across every core and finds exactly the same speech, with not one segment boundary moved — which was the condition for shipping it at all. The new --vad-threads decides how much of the machine it takes.
And the second pass stops paying twice for the same stretch of audio. Where a book's silences sit close together, the recognizer used to be handed one short clip after another, each costing a full turn no matter how little audio was in it. Each read now runs on to the end of the next clip that fits in the turn it has already paid for — roughly a fifth off the second pass's work on a densely-marked book, with no announcement ever cut in half.
One file at a time, with the whole machine behind it
-J / --jobs is gone: multi-file runs no longer process several books at once. That parallelism was worth less than it looked — on a GPU it never happened anyway, and on a CPU the concurrent files were dividing one fixed pool of threads between them rather than adding to it. Giving each file everything is what makes the faster first pass possible. Batches of many files take about as long as before; a single file is quicker. A script still naming --jobs is told what to use instead rather than getting an "unknown option".
Marks in the right place, under the right number
One misheard chapter number used to cost a book every mark after it — all of them correctly found and correctly placed, discarded for contradicting a single mishearing. Now it is the odd mark that gives way instead of the rest of the book, and usually it does not even come to that: the close-up readings taken while pinning a mark down are far more reliable about the number than the wide window that first found the chapter, and their verdict now counts. Gap searches refuse a number that cannot be in the gap, and a mark that still contradicts its neighbours is repaired from them.
Marks also stopped drifting on stitched-together books. An .m4b assembled from separately encoded pieces hands the decoder a little more audio at every seam than its own timeline accounts for, and the tool's sense of time slowly ran ahead — by more than a second by the end of a long book, in the worst case putting a mark past the announcement entirely. Books without the defect are unaffected, down to the millisecond.
Where a better model is named with --pass3-model, it now also gets a go at pinning down a mark the smaller one could not confirm, and a second look at an announcement a long window lost.
Also new
- Phrases and titles can be written per language, for a batch run over a library that is not all in one language:
--chapter-phrase "[fr]/chapitre/;[en]section", and the same syntax for--title,--custom, prologues and epilogues. Anything untagged still means exactly what it did. --whisper-threadsand--vad-threads, both now defaulting to your machine's physical cores rather than nearly all of its hardware threads.--summarynames the files it counted — every file skipped, with the reason, and every file left with chapter marks still missing, with which ones they are.--verifyno longer replaces a whole set of marks that failed wholesale. Marks failing in bulk almost always means they were never one-per-numbered-chapter to begin with, which is true of every retailer mark set grouping several book chapters into one entry — so that file is now left exactly as it was, with a warning, instead of being redetected from scratch. Where only some marks fail, nothing has changed.
And various bugs exterminated. The CHANGELOG has the full list, in detail.
Downloads
| File | Platform |
|---|---|
abchapterize-0.10.0-win-x64.zip |
Windows x64 |
abchapterize-0.10.0-linux-x64.tar.gz |
Linux x64 (glibc) |
Self-contained — no .NET runtime to install. Each archive carries the executable, the native Whisper and ONNX Runtime libraries (CPU, CUDA and Vulkan backends), the README, the manual and all license texts. Unpack anywhere and keep the runtimes folder next to the executable; you still need ffmpeg/ffprobe available, and the speech model downloads itself on first run.
abchapterize 0.9.1
Chapter marks that land where the narrator actually says "Chapter Seven".
A feature release on top of 0.9.0. New here? The README explains what ABChapterize is for. What follows is what changed.
Marks for anything the narrator announces
--custom takes phrase:title pairs, so anything with a spoken name gets a mark of its own — interludes, timelines, part headings:
abchapterize --custom "zwischenspiel:Zwischenspiel;/zeit[- ]?tafel/:Zeittafel" book.m4b
A phrase is a plain word or a /regexp/, a title can quote the phrase's own capturing groups ($1), and --custom-file reads the mappings from a file. It still has to be announced — a passing mention in the narration is not a mark.
Prologues and epilogues now get their own marks as well, phrased and titled in each of the eleven supported languages, and --ignore-chapter-numbers turns off numbered-chapter hunting entirely for books that have none.
Pick your GPU
--list-gpus prints what your machine reports; --use-gpu gtx picks one by name instead of by an index that can come out in a different order depending on how you logged in. With nothing specified, a single discrete GPU is now preferred automatically, and the startup line names the card it settled on.
Faster, and more accurate
- Marks now land within a tenth of a second of the announcement. They used to be accepted as soon as the chapter phrase was merely audible — which a jingle never contradicts, since Whisper does not transcribe music, so a mark sitting seconds inside one sounded perfectly convincing. Books with a musical sting before each chapter benefit most.
- And they get there in seconds rather than minutes. A mark that had landed half a minute early used to be recovered by combing the audio a tenth of a second at a time — hundreds of transcriptions and twenty minutes of apparent silence on a single mark. It now closes in on the announcement instead.
- Chapters that used to go missing generally don't. A number spoken as a Roman numeral, misheard as something impossible, dropped by the recognizer at a window boundary, or hidden behind a pause a hair too short to look at — each of those now has its own way back.
Everything else
--debug writes a full troubleshooting log beside a file. --log-file puts the log where you want it, --color decides whether the bar and summary are colored. Several files and folders can be named in one command, and an interrupted batch run picks up where it left off. --model custom:<path> runs your own Whisper model. Spanish, Portuguese and Danish now understand compound spelled-out ordinals ("Capítulo vigésimo primero").
And various bugs exterminated. The CHANGELOG has the full list, in detail.
Downloads
| File | Platform |
|---|---|
abchapterize-0.9.1-win-x64.zip |
Windows x64 |
abchapterize-0.9.1-linux-x64.tar.gz |
Linux x64 (glibc) |
Self-contained — no .NET runtime to install. Each archive carries the executable, the native Whisper and ONNX Runtime libraries (CPU, CUDA and Vulkan backends), the README, the manual and all license texts. Unpack anywhere and keep the runtimes folder next to the executable; you still need ffmpeg/ffprobe available, and the speech model downloads itself on first run.
abchapterize 0.9.0
Correct chapter marks for your audiobooks — by actually listening to them.
ABChapterize scans audiobook files (.m4a, .m4b, .mp3, .opus, .mka) for spoken chapter announcements ("Chapter Seven", "Kapitel 12", …) using Whisper speech recognition and writes proper chapter marks straight into the file. No splitting, no server, no sidecar clutter — the audio itself is never re-encoded, only the chapter metadata is rewritten.
If you have ever bought an audiobook whose chapter marks were missing, misplaced, or pure fantasy, this is for you.
What it does
- Finds chapters by listening. Short candidate windows are probed at silences and jingles first, and a full region is only transcribed when that isn't enough — so the time-consuming Whisper work stays at a minimum.
- Jingle-aware by default. A bundled voice-activity model (Silero VAD) finds the music sting before an announcement even when it abuts the narration with no silence at all — something a plain amplitude scan misses entirely.
--mark-before-jingleanchors the mark to the jingle itself instead of just before the phrase. - Self-healing. Gaps in the detected chapter numbering trigger a full transcription of exactly the regions where the missing chapters must be hiding. Whatever still can't be found leaves the file tagged
.missing-marks-…, and a later run resumes it instead of starting over. - Verifies instead of trusting.
--verifychecks pre-existing marks against the audio and only redoes the stretches around the ones that don't hold up. - Writes in place, safely. Chapters are written by stream-copy remux into a temporary file that is verified before it atomically replaces the original — your audiobook can't be lost, even without
--backup(which is there too, along with--revert). - Eleven languages of number recognition — English, German, French, Spanish, Italian, Dutch, Turkish, Portuguese, Polish, Swedish and Danish, cardinals and ordinals, before or after the phrase ("Erstes Kapitel", "2. Kapitel", "chapitre premier", "Birinci Bölüm"). Language is detected per file by default, and localizes the chapter phrase and titles along with it.
- GPU accelerated — CUDA or Vulkan when available, CPU otherwise. Batches run several files at once, auto-throttled to live CPU load.
- Zero setup for models. The Whisper model downloads on first use and is checked against pinned SHA-256 and SHA3-256 digests before it is loaded.
Getting started
- Have
ffmpeg/ffprobeavailable (inPATH, next to the executable, or whereverFFMPEG_DIRpoints). - Download the archive for your platform below and unpack it anywhere — keep the
runtimesfolder next to the executable. - Run it:
abchapterize "My Audiobook.m4b"
The speech model (~1.6 GB for the default turbo) downloads once on first run. Then:
My Audiobook.m4b: 23 chapter(s) written (1-23) + intro, language: en (p=1.00)
Being careful on the first try is one flag away: --backup keeps the original as *.bak, and abchapterize --revert puts it back.
Downloads
| File | Platform |
|---|---|
abchapterize-0.9.0-win-x64.zip |
Windows x64 |
abchapterize-0.9.0-linux-x64.tar.gz |
Linux x64 (glibc) |
Both are self-contained — no .NET runtime to install. Each archive carries the executable, the native Whisper and ONNX Runtime libraries (CPU, CUDA and Vulkan backends), the README, the manual, and all license texts.
Notes
Version 0.9.0 rather than 1.0.0 on purpose: it does the job and does it carefully, but the option set may still shift before 1.0.