Was macht dsh-bilibili-Untertitel?
Wandelt einen Bilibili-Video-Link in ein lesbares, durchsuchbares und auslieferbares Untertitel-Dokument um.
Kernprinzip: Zuerst vorhandene Untertitel nutzen, dann Sprachtranskription oder OCR in Betracht ziehen. Nicht sofort Video/Audio herunterladen und Whisper ausführen; Bilibili-Plattform-Untertitel (inkl. KI-Untertitel) sind in der Regel qualitativ besser und schneller.
Verwendung
Geeignet:
- Benutzer gibt einen Bilibili-Video-Link, eine BV-Nummer, av-Nummer, einen Bangumi ep/ss-Link oder einen b23.tv-Kurzlink an und fordert „Untertitel extrahieren / als Dokument aufbereiten / nach Word/Markdown exportieren“.
- Benutzer hat lokale Videos + externe Untertitel und möchte sie batchweise in Dokumente umwandeln.
- Benutzer benötigt Untertitel mit Zeitstempeln, zweisprachiger Gegenüberstellung oder zusammengeführten Kapiteln.
- Benutzer benötigt einen Qualitätsbericht für Untertitel, um zu entscheiden, ob eine manuelle Korrektur sinnvoll ist.
Nicht geeignet:
- Übersetzung von Untertiteln: Dieses Skill führt lediglich eine zweisprachige Ausrichtung durch, keine maschinelle Übersetzung.
- Präzise Sprechertrennung: Automatische Diarisierung ist nicht aktiviert; es werden nur vorhandene
[Sprecher]-Markierungen in den Untertiteln beibehalten. - Umgehung von Bilibili-Login/Bezahlung/Region: Benutzer müssen entweder ein gültiges Cookie bereitstellen oder lokale Dateien verwenden.
Installation & Aufruf
- Plugin: https://github.com/Chenfan2/dsh-bilibili-subtitles (DSH-Desktop: „Plugins → Plugin hinzufügen“ URL einfügen, oder
dsh plugin --profile web add github:Chenfan2/dsh-bilibili-subtitles). - Reines Skill: Gesamtes Verzeichnis in das DSH-Skills-Verzeichnis kopieren (oder
install.ps1ausführen).
Nach Installation im Verzeichnis ausführen:
python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx
Für den einmaligen Gebrauch kann auch direkt main.py im Skill-Verzeichnis ausgeführt werden.
Ein Befehl
python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx
Ausgabe in output/:
Titel_BV-Nummer.mdTitel_BV-Nummer.docxTitel_BV-Nummer.quality.json(Qualitätsbericht)Titel_BV-Nummer.segments.json(bereinigte, strukturierte Untertitel)_manifest.json(Zusammenfassung des aktuellen Durchlaufs)
Eingabe-/Ausgabe-Vertrag
Eingabe
| Typ | Beispiel |
|---|---|
| Bilibili-Video | https://www.bilibili.com/video/BV1xx411c7mD?p=2 |
| BV / av-Nummer | BV1xx411c7mD, av80433022 |
| Bangumi | https://www.bilibili.com/bangumi/play/ep123456, .../ss28747 |
| Kurzlink | https://b23.tv/xxxxxx |
| Lokales Video | input.mp4, input.mkv |
| Externe Untertitel | --subtitle input.srt (auch .ass/.vtt/.json/.txt) |
| Verzeichnis/Batch | python main.py ./videos --format md,docx |
Ausgabe
- Dokumentdateipfade (Markdown/Word/PDF/TXT/SRT).
- Strukturierte Untertitel:
[{start, end, text, speaker?, lang?, confidence?, translation?}]. - Qualitätsbericht: Untertitelquelle, Sprache, Abdeckungsgrad, Segmente mit niedriger Konfidenz, Warnungen, Stichproben Anfang/Mitte/Ende.
- Verarbeitungsversuche: Erfolg/Fehler/Überspringen jedes Providers mit Begründung.
Priorität der Untertitelquellen
Es wird in folgender Reihenfolge versucht; bei Fehler erfolgt automatisch ein Downgrade, es sei denn, dies wird explizit deaktiviert:
- Benutzerexterne Untertitel (
--subtitle): Höchste Qualität, vollständig kontrollierbar. - Bilibili-Plattform-Untertitel / KI-Untertitel: Über
x/player/v2abgerufen, benötigtSESSDATA. - Lokale, in Video eingebettete Untertitel:
ffprobe-Erkennung +ffmpeg-Extraktion als SRT. - Hardcoded-Untertitel-OCR: Nur bei lokalen Videos, mit
--ocraktiviert; experimentell. - Whisper-Sprachtranskription: Mit
--asraktiviert oder automatisch als Fallback; beim ersten Mal wird das Modell heruntergeladen.
Ohne Anmeldung gibt Bilibili in der Regel keine Untertitelliste zurück. Dann wird
LOGIN_REQUIREDausgegeben, mit dem Hinweis, ein Cookie bereitzustellen oder ASR zu aktivieren. Dies ist eine Plattformbeschränkung, kein Linkfehler.
Bilibili-Login (für Plattform-Untertitel erforderlich)
Die Plattform-Untertitel-Schnittstelle gibt subtitle_url nur für eingeloggte Sitzungen zurück. Empfehlung: Umgebungsvariable verwenden, um die Befehlszeile nicht zu verunreinigen:
$env:BILIBILI_SESSDATA = "Ihre SESSDATA"
python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx
Abruf: Browser bei bilibili.com anmelden → Entwicklertools → Anwendung/Application → Cookies → bilibili.com → Wert von SESSDATA kopieren.
Auch unterstützt:
python main.py URL --sessdata "Wert der SESSDATA"
python main.py URL --cookie "SESSDATA=...; bili_jct=..."
python main.py URL --cookies cookies.txt
- Cookies sind gleichbedeutend mit Anmeldeinformationen. Nicht in Repositorys, Dokumente oder öffentliche Kanäle schreiben.
- Dieses Skill verwendet Cookies nur im Arbeitsspeicher; Protokolle und Berichte werden maskiert.
- Nach Ablauf der Cookies einfach erneut kopieren.
Häufige Parameter
| Parameter | Funktion |
|---|---|
--format md,docx,pdf,txt,srt,json | Ausgabeformate, durch Komma getrennt; Standard md |
-o, --output PFAD | Bei einer Eingabe und einem Format: Ausgabedatei festlegen |
--out-dir VERZ | Ausgabeverzeichnis, Standard output |
--title TEXT | Dokumenttitel überschreiben (Standard: Videotitel/Dateiname) |
--subtitle PFAD | Externe Untertiteldatei oder -verzeichnis (höchste Priorität) |
--language zh | Bevorzugte Untertitel-/Transkriptionssprache; Plattform-Untertitel nach Sprache abgleichen |
--bilingual | Zweisprachige Gegenüberstellung; bei zwei Untertitelspuren zeitlich ausrichten, bei einer Spur zeilenweise aufteilen |
--timestamps / --no-timestamps | [00:12] im Text anzeigen, standardmäßig an |
--merge-sentences / --no-merge-sentences | Kurze Sätze zusammenführen, standardmäßig an |
--no-auto-punctuation | Automatische Interpunktion bei ASR/OCR deaktivieren (standardmäßig an) |
--pages auto/all/1,3-5 | Kapitelauswahl; standardmäßig nur das in der URL angegebene, bei keiner Angabe P1 |
--template default/minimal/Datei.md | Markdown-Vorlage |
--quality-report PFAD | Pfad für Qualitätsbericht JSON |
--no-quality | Keinen Qualitätsbericht erstellen |
--glossary terms.json | Begriffsersetzung, z. B. {"DeepSeek":"深度求索"} |
--json-summary | Maschinenlesbare Zusammenfassung auf stdout (für Agenten) |
--asr / --no-asr | Whisper-Fallback erlauben/verbieten; standardmäßig automatisch (nur versuchen, wenn installiert) |
--asr-model small | tiny/base/small/medium; Standard small |
--model-dir VERZ | Whisper-Modell-Cache-Verzeichnis (Standard ./.vsub-models-cache) |
--ocr | OCR für lokale Video-Hardcoded-Untertitel (experimentell) |
--ffmpeg PFAD | ffmpeg/ffprobe-Pfad angeben |
--strict | Bei Fehler oder Qualität fail einen Exit-Code ungleich 0 zurückgeben |
Vollständige Parameter: python main.py --help.
Empfohlener Workflow (Agent)
-
Eingabe prüfen:
- Bilibili-Link/BV/av → direkt ausführen.
- Lokales Video → nach gleichnamigen
.srt/.vtt/.asssuchen, falls vorhanden--subtitleverwenden; sonst eingebettete Untertitel prüfen. - Nur Untertiteldatei → kann auch direkt als Eingabe dienen.
-
Zuerst Standardausgabe ausführen, nicht ohne Qualitätsbericht ASR starten:
python main.py "<Link>" --format md,docx --out-dir output -
Bei
LOGIN_REQUIRED:- Dem Benutzer mitteilen, dass Plattform-Untertitel
SESSDATAbenötigen, und Anleitung geben; nicht wiederholt versuchen. - Wenn der Benutzer kein Cookie hat,
--asrvorschlagen (mit Hinweis auf erstmaligen Modell-Download, Zeitaufwand, mögliche Erkennungsfehler).
- Dem Benutzer mitteilen, dass Plattform-Untertitel
-
<Stamm>.quality.jsonprüfen:status=ok: Direkt ausliefern.status=warn:warningsansehen, besonders Abdeckung, Überlappungen, niedrige Konfidenz; in der Auslieferung darauf hinweisen.status=fail: Nicht so tun, als wäre es erfolgreich; Fehlerursache melden und externe Untertitel/ASR/OCR vorschlagen.
-
Mit
presentdie.md/.docxals endgültige Datei ausliefern; Qualitätsbericht nur bei Bedarf beifügen.
Ausführungsumgebung:
-
Vorzugsweise das von
load_workspace_dependencieszurückgegebene Python verwenden (enthältpython-docx). -
Windows PowerShell-Aufrufbeispiel:
& "C:\...\python.exe" main.py "<Link>" --format md,docx --out-dir output -
Alle Ausgaben und temporären Dateien müssen im Sitzungsarbeitsbereich abgelegt werden; nicht das System-Temp-Verzeichnis verwenden (kann von der Sandbox abgelehnt werden).
Qualitätsbericht-Felder
{
"status": "ok | warn | fail",
"score": 96.5,
"source": "bilibili",
"language": "zh",
"segments": 320,
"paragraphs": 86,
"duration": 1260.0,
"duration_covered": 0.96,
"coverage_span": 0.99,
"overlaps": 0,
"low_confidence_segments": 3,
"duplicate_segments": 1,
"gaps_over_10s": 2,
"warnings": ["..."],
"samples": {"head": [], "middle": [], "tail": []}
}
duration_covered: Relativ zur gesamten Videolänge; nach Bereinigung von Intro/Outro-Werbung kann niedriger sein.coverage_span: Relativ zum Inhaltsbereich zwischen erstem und letztem Untertitel; gibt besser wieder, ob der „Sprechanteil“ abgedeckt ist.samples: Anfang/Mitte/Ende, jeweils maximal 5 Segmente, für manuelle Stichproben.- Häufige Ursachen für
status=fail: Keine Segmente, Abdeckung unter 30 %, alle Kapitel fehlgeschlagen.
Fehler & Downgrade
| Situation | Verhalten |
|---|---|
| Externe Untertitel-Analyse fehlgeschlagen | Fehler protokollieren, mit Plattform-/eingebetteten Untertiteln fortfahren |
Plattform-Untertitel LOGIN_REQUIRED | Hinweis auf SESSDATA; wenn faster-whisper installiert und ASR erlaubt, automatisch transkribieren |
| Keine Untertitelspur auf Plattform | NO_SUBTITLE; --asr oder --subtitle möglich |
| Eingebettete Untertitel sind PGS/VobSub-Bitmaps | Keine direkte Konvertierung zu SRT; Hinweis auf OCR/externe Untertitel |
| ASR nicht installiert | Überspringen und pip install faster-whisper vorschlagen; kein stilles Fehlschlagen |
| Ein Ausgabeformat fehlgeschlagen | Andere Formate werden weiter erzeugt; quality.warnings protokolliert; nur bei vollständigem Fehler wird RENDER_FAILED gemeldet |
| Batch teilweise fehlgeschlagen | Erfolgreiche Ausgaben fortsetzen; _manifest.json und *.error.json protokollieren die Fehler |
Exit-Codes:
0: Erfolg (bei Batch: mindestens einer erfolgreich)2: Eingabe-/Link-/API-/Parse-Fehler3: Keine Untertitel, Login erforderlich, Qualität fehlgeschlagen4: Fehlende Abhängigkeit (ffmpeg/Whisper/docx usw.)5: Dokument-Rendering fehlgeschlagen1: Unerwarteter Fehler
Beispiele
# Basis: Plattform-Untertitel → Markdown + Word
python main.py "https://www.bilibili.com/video/BV1xx411c7mD" --format md,docx
# Nur Word, Dateiname angeben
python main.py "BV1xx411c7mD" --format docx -o "Notizen.docx"
# Mehrere Kapitel + Zeitstempel + Qualitätsbericht
python main.py "https://www.bilibili.com/video/BV1xx411c7mD?p=1" --pages all --format md
# Externe Untertitel priorisieren
python main.py "input.mp4" --subtitle "input.srt" --format md,docx
# Zweisprachig (bei zwei Plattform-Spuren automatisch ausrichten)
python main.py "BV1xx411c7mD" --bilingual --language zh --format md,docx
# Ohne Login, mit ASR-Fallback (erstmaliger Modell-Download)
python main.py "BV1xx411c7mD" --asr --asr-model small --format md,docx
# Batch-Verzeichnis
python main.py "./videos" --format md,docx --out-dir output/batch
# Lokale Hardcoded-Untertitel OCR (experimentell)
python main.py "input.mp4" --ocr --ocr-fps 2 --format md
Einschränkungen
- Verfügbarkeit von Plattform-Untertiteln hängt von Video, Account, Region und UP-Einstellungen ab; dieses Skill kann Berechtigungen nicht umgehen.
- KI-Untertitel können Fehler, fehlende Sätze oder zeitliche Abweichungen enthalten; der Qualitätsbericht kann nur hinweisen, nicht manuelle Korrektur ersetzen.
- Zweisprachig ist „zeitliche Ausrichtung“, keine Übersetzung; zwei Spuren werden nur bei unterschiedlichen Sprachen gegenübergestellt.
- Automatische Sprechertrennung nicht implementiert; es werden nur Markierungen wie
[Zhang San],【Zhang San】,Zhang San:in den Untertiteln erkannt. - OCR nur für lokale Videos, standardmäßig untere 30 % des Bildschirms; bei Animationen/Hochformat/verschobenen Untertiteln muss
--ocr-cropoder--ocr-full-frameangepasst werden. - PDF benötigt LibreOffice oder
reportlab; sonst wird ein deutlicher Fehler ausgegeben, md/docx bleiben davon unberührt. - ASR für lange Videos kann langsam sein;
small-Modell beim ersten Download ca. 460 MB.
Urheberrecht & Datenschutz
- Nur Videos/Untertitel verarbeiten, zu deren Nutzung der Benutzer berechtigt ist; dieses Skill nicht für massenhaftes Herunterladen urheberrechtlich geschützter Inhalte verwenden.
- Die Untertitel-Dokumente behalten den Original-Videotitel, den UP-Namen und den Link zur Nachverfolgung.
- Cookies, signierte CDN-URLs werden nicht in Protokolle/Qualitätsberichte geschrieben; es wird dennoch empfohlen, Cookies nicht öffentlich zu teilen.
- Temporäre Audio-/Frame-Dateien werden standardmäßig im Ausgabeverzeichnis unter
.vsub-tmpabgelegt und nach dem Lauf automatisch bereinigt;--keep-tempbelässt sie zur Fehlersuche.
Dateistruktur
dsh-bilibili-subtitles/
├── SKILL.md
├── README.md
├── main.py # CLI-Einstieg
├── vsub/
│ ├── bilibili.py # URL/API/Untertitel/Audio
│ ├── input_adapter.py # Eingabeanpassung
│ ├── pipeline.py # Fünfstufige Pipeline-Orchestrierung
│ ├── providers/ # external/bilibili/embedded/ocr/asr
│ ├── parsers/ # srt/vtt/ass/bilibili-json/plain
│ ├── cleaners/ # Bereinigung, Zusammenführung, Zweisprachigkeit, Begriffe
│ ├── renderers/ # md/docx/pdf/txt/srt/json
│ └── quality.py # Qualitätsprüfung
├── templates/
├── tests/
└── requirements.txt