From 592a235cf934ef802b339c972cee615279753212 Mon Sep 17 00:00:00 2001 From: Claude Fable 5 Date: Sat, 29 Aug 2026 22:23:16 +0200 Subject: [PATCH] Update Handoff (Whisper fallback) and document CLI transcription in README Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01P1w53ybPWArpZpcei9JPYX --- Handoff.md | 24 +++++++++++++++++++++++- README.md | 24 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/Handoff.md b/Handoff.md index 45eb83a..c5d6b6b 100644 --- a/Handoff.md +++ b/Handoff.md @@ -3,7 +3,8 @@ > Übergabedokument für die Fortsetzung in einer Claude-Code-Session. > Stand: 2026-08-29 — App läuft produktiv auf Gisela unter > http://172.30.1.11:3300 (nur internes Netz), Downloads nach -> `/home/stwaidele/YouTube//`; live verifiziert per Testdownload. +> `/home/stwaidele/YouTube//`. Neu: Whisper-Transkriptions-Fallback +> für Videos ohne Untertitel, live verifiziert (archive.org, RTX 3080). > Dauerhafte Fakten stehen in `README.md`/`INSTALL.md`; hier steht nur, was > **nicht** aus Code und Git-Historie ersichtlich ist. @@ -43,6 +44,27 @@ Arbeitskopie auf Gisela: `/home/stwaidele/Claude/yt-dlp` (Verzeichnisname führende Wiederholungszeilen (`src/lib/subtitle.js`, `scripts/subtitle_to_markdown.py`, beide identisch halten!). +## Session 2026-08-29 — Whisper-Fallback für Videos ohne Untertitel (Claude Fable 5) + +Auftrag: Plattformen ohne Untertitel (Instagram & Co.) sollen trotzdem +Transkripte liefern. Umsetzung: `scripts/transcribe.py` (faster-whisper, +`large-v3-turbo`, CUDA mit CPU-Fallback) + Hook in +`src/routes/api/download/+server.js` — springt nur an, wenn der Download +keine `.vtt`/`.srt` hinterlässt; die VTT läuft danach durch die normale +MD-Konvertierung. venv liegt in `.venv/` (gitignored, Python 3.13, +**nicht** das Linuxbrew-Python 3.14 — dafür gab es keine +ctranslate2-Wheels). cuDNN/cuBLAS kommen aus pip und werden im Script per +`ctypes.CDLL(RTLD_GLOBAL)` vorgeladen, damit kein `LD_LIBRARY_PATH` in +der systemd-Unit nötig ist. Modell-Cache: `~/.cache/huggingface` (~1,6 GB, +bereits geladen). Live verifiziert: archive.org „Duck and Cover" +(E2E über die API, Fallback sprang an, Transkript einwandfrei) und +Direktlauf auf GPU (`cuda`, Spracherkennung en p=1.00). Testerkenntnis: +**Vimeo verlangt inzwischen Login** und taugt nicht mehr als +Test-Plattform; archive.org funktioniert. Nebenwirkung des Direkttests: +`~/YouTube/Me at the zoo/Me at the zoo.en.vtt` ist jetzt die +Whisper-Version statt der YouTube-Caption (im echten Betrieb kein Thema, +Fallback läuft nur ohne vorhandene Untertitel). + ## Session 2026-08-29 — Deploy auf Gisela (Claude Fable 5) Auftrag: yt-dlf auf Gisela betreiben, Weboberfläche nur im diff --git a/README.md b/README.md index 7dd4ce0..51be142 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,30 @@ To use a custom port: PORT=8080 npm run dev ``` +## Standalone transcription + +Transcribe any local video/audio file to WebVTT directly from the terminal +(requires the faster-whisper venv, see `INSTALL.md`): + +```bash +.venv/bin/python scripts/transcribe.py video.mp4 +``` + +The language is detected automatically and the subtitle file is written next +to the input as `video..vtt` (e.g. `video.de.vtt`). Model and device can +be overridden via environment variables: + +```bash +WHISPER_MODEL=large-v3 .venv/bin/python scripts/transcribe.py video.mp4 # best quality +WHISPER_DEVICE=cpu .venv/bin/python scripts/transcribe.py video.mp4 # don't touch the GPU +``` + +To get a Markdown transcript, feed the VTT through the subtitle converter below: + +```bash +./scripts/subtitle_to_markdown.py video.de.vtt +``` + ## Standalone subtitle converter Convert a `.vtt` or `.srt` subtitle file to Markdown directly from the terminal: