feat(scriberr): overlap-and-stitch Parakeet slicer patch, rebuild script, bench

Carry patches/0001 on our Scriberr build (upstream a353078): adjacent
buffered chunks overlap by 4 s inside --chunk-len and hand over at a word
both chunks transcribed alike, instead of cutting at fixed marks with no
overlap. Pause-aware cutting is included as an opt-in (--pause-search);
it measured neutral once the stitch was right. The Go<->Python CLI and
JSON seam is unchanged.

Bench (4 recordings, 118 min, 3 cut placements each, against a no-cut
whole-file reference; metrics only, private audio stays on fv-ml1):
cuts with an error within +-3 s fall from 52% (93/179) to 22% (41/184)
against a 19% background; floor +-0.08. Positive control: upstream's
cutter +0.33 over background. A-vs-A byte-identical in-process and
across CLI processes. Peak GPU memory unchanged at 5,496 MiB (n=3).
Also found: Parakeet skips runs of >=10 words mid-chunk with any
slicer, upstream's included; not addressed here.

scripts/scriberr-rebuild clones a pinned upstream sha into a new
/opt/docker/src dir, git-apply-checks the patches, builds a distinct
tag, and checks embed, unit tests, the JSON seam (scriberr-seam-check.py)
and the memory budget on idle GPU 3. Deploy stays manual. The upstream
PR is prepared under patches/upstream-pr/ and not opened.
This commit is contained in:
vh
2026-09-30 12:10:32 -07:00
parent ab62644315
commit ee3db68db1
8 changed files with 1556 additions and 7 deletions
+21 -7
View File
@@ -27,15 +27,21 @@ image** — it will fail on these cards or quietly fall back to CPU.
### Rebuilding
We carry local patches (`patches/`, currently the pause-aware Parakeet
slicer), so a rebuild is one command from nh3-dev, pinned to an upstream sha:
```bash
ssh fv-ml1
cd /tank/scriberr/src/Scriberr
git pull
docker build -f Dockerfile.cuda.12.9 -t scriberr:local-blackwell .
cd /opt/docker/compose/scriberr && docker compose up -d
scripts/scriberr-rebuild --sha <full upstream sha> --suffix slicer1
```
Source checkout lives on `/tank`, not the root pool — see storage below.
It makes a clean clone in `/opt/docker/src/scriberr-<sha7>-<suffix>` on
fv-ml1, `git apply --check`s the patches (a conflict stops it), builds
`scriberr:local-blackwell-<sha7>-<suffix>` beside the old images, and checks
the embed, the unit tests, the Go↔Python JSON seam, and the GPU memory budget.
Deploying it is a separate manual step: `patches/README.md` § Deploy.
The old checkout at `/tank/scriberr/src/Scriberr` (lkraven-owned, shallow)
built the original `scriberr:local-blackwell` and is left as it was.
## Deploy
@@ -62,7 +68,7 @@ mounts are bind-mounted onto `/tank` (4+ TB) instead of named volumes:
|---|---|---|
| `/tank/scriberr/data` | `/app/data` | SQLite DB, uploads, transcripts |
| `/tank/scriberr/whisperx-env` | `/app/whisperx-env` | Python env + model weights |
| `/tank/scriberr/src/Scriberr` | — | build checkout |
| `/tank/scriberr/src/Scriberr` | — | original build checkout (patched builds: `/opt/docker/src/scriberr-<sha7>-<suffix>`) |
Both are owned by uid/gid 1000 to match `PUID`/`PGID`.
@@ -164,3 +170,11 @@ Peak GPU memory on a 35-minute file:
- The two env knobs are read by upstream's Go code (`parakeet_adapter.go`), so
they survive image upgrades for as long as upstream keeps them. Re-measure the
peak after any upgrade.
- **The slicer itself is patched** (`patches/0001-parakeet-pause-aware-slicer.patch`,
2026-09-30). Adjacent 120 s slices now overlap by 4 s and are stitched at a word
both transcribed, which cut the share of cuts with an error nearby from 52 % to
22 % against a 19 % background. The overlap sits *inside* the 120 s, so the
peak is unchanged (5,496 MiB, n=3). See `patches/README.md` and
`docs/pfi/scriberr-slicer-bench-2026-09-30.md`. That bench also found that
Parakeet sometimes skips stretches of ≥10 words mid-slice, with or without the
patch; that is still open.