Spaces:
Running on Zero
Running on Zero
Cut in silence, drop invented subtitle text
Browse files
app.py
CHANGED
|
@@ -34,7 +34,7 @@ from transformers import pipeline as hf_pipeline
|
|
| 34 |
from kern import (FA_ANTEIL, FA_BLOCK, FA_FENSTER, FARBEN, FENSTER,
|
| 35 |
GLOSSAR_DATEI, GLOSSAR_MAX, GLOSSAR_PROMPT,
|
| 36 |
_begriffe_zaehlen, _decode_optionen, _fenstergrenzen,
|
| 37 |
-
_korrekturziele, _korrigieren,
|
| 38 |
_frontmatter, _kontext_bauen, _markdown, _namen_farben,
|
| 39 |
_rangfolge, _romanisieren, _sprecher_bei, _zeit,
|
| 40 |
_zusammenfuegen, glossar_lesen, glossar_schreiben,
|
|
@@ -216,7 +216,7 @@ def _transkribiere_gpu(audio_path, start, ende, sprache=None, kontext=""):
|
|
| 216 |
for c in res.get("chunks", []):
|
| 217 |
ts = c.get("timestamp") or (None, None)
|
| 218 |
text = (c.get("text") or "").strip()
|
| 219 |
-
if ts[0] is None or not text:
|
| 220 |
continue
|
| 221 |
sprache_erkannt = sprache_erkannt or c.get("language")
|
| 222 |
bis = ts[1] if ts[1] is not None else ts[0] + 30.0
|
|
@@ -225,7 +225,8 @@ def _transkribiere_gpu(audio_path, start, ende, sprache=None, kontext=""):
|
|
| 225 |
if not worte:
|
| 226 |
# Manche Modelle (etwa deutsche Feinabstimmungen) liefern keine
|
| 227 |
# Zeitmarken. Dann den gesamten Text des Fensters selbst verorten.
|
| 228 |
-
|
|
|
|
| 229 |
if alle:
|
| 230 |
rate = len(alle) / max(ende - start, 1.0)
|
| 231 |
treffer, _, _ = _aligniere_bereich(audio_path, alle, start, ende,
|
|
@@ -521,7 +522,14 @@ def _nach_wav(pfad):
|
|
| 521 |
Transkription spürbar.
|
| 522 |
"""
|
| 523 |
ziel = tempfile.NamedTemporaryFile(suffix=".wav", delete=False).name
|
| 524 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 525 |
try:
|
| 526 |
subprocess.run(["ffmpeg", "-y", "-loglevel", "error", "-i", pfad,
|
| 527 |
"-af", filter_kette, "-ar", "16000", "-ac", "1", ziel],
|
|
|
|
| 34 |
from kern import (FA_ANTEIL, FA_BLOCK, FA_FENSTER, FARBEN, FENSTER,
|
| 35 |
GLOSSAR_DATEI, GLOSSAR_MAX, GLOSSAR_PROMPT,
|
| 36 |
_begriffe_zaehlen, _decode_optionen, _fenstergrenzen,
|
| 37 |
+
_ist_halluzination, _korrekturziele, _korrigieren,
|
| 38 |
_frontmatter, _kontext_bauen, _markdown, _namen_farben,
|
| 39 |
_rangfolge, _romanisieren, _sprecher_bei, _zeit,
|
| 40 |
_zusammenfuegen, glossar_lesen, glossar_schreiben,
|
|
|
|
| 216 |
for c in res.get("chunks", []):
|
| 217 |
ts = c.get("timestamp") or (None, None)
|
| 218 |
text = (c.get("text") or "").strip()
|
| 219 |
+
if ts[0] is None or not text or _ist_halluzination(text):
|
| 220 |
continue
|
| 221 |
sprache_erkannt = sprache_erkannt or c.get("language")
|
| 222 |
bis = ts[1] if ts[1] is not None else ts[0] + 30.0
|
|
|
|
| 225 |
if not worte:
|
| 226 |
# Manche Modelle (etwa deutsche Feinabstimmungen) liefern keine
|
| 227 |
# Zeitmarken. Dann den gesamten Text des Fensters selbst verorten.
|
| 228 |
+
ganz = (res.get("text") or "").strip()
|
| 229 |
+
alle = [] if _ist_halluzination(ganz) else ganz.split()
|
| 230 |
if alle:
|
| 231 |
rate = len(alle) / max(ende - start, 1.0)
|
| 232 |
treffer, _, _ = _aligniere_bereich(audio_path, alle, start, ende,
|
|
|
|
| 522 |
Transkription spürbar.
|
| 523 |
"""
|
| 524 |
ziel = tempfile.NamedTemporaryFile(suffix=".wav", delete=False).name
|
| 525 |
+
# Ohne dynaudnorm. Die dynamische Normalisierung zieht leise Stellen
|
| 526 |
+
# hoch — in Sprechpausen also den Rauschteppich, und auf angehobenes
|
| 527 |
+
# Rauschen antwortet Whisper mit erfundenem Text. Sie hebelt zugleich
|
| 528 |
+
# no_speech_threshold aus, das Stille an ihrem Pegel erkennt. Bleiben
|
| 529 |
+
# Hochpass gegen Trittschall und loudnorm für einen gleichmäßigen
|
| 530 |
+
# Pegel; Whisper ist auf unbearbeitetem Alltagsmaterial trainiert und
|
| 531 |
+
# braucht mehr nicht.
|
| 532 |
+
filter_kette = "highpass=f=60,loudnorm=I=-18:LRA=11:TP=-2"
|
| 533 |
try:
|
| 534 |
subprocess.run(["ffmpeg", "-y", "-loglevel", "error", "-i", pfad,
|
| 535 |
"-af", filter_kette, "-ar", "16000", "-ac", "1", ziel],
|