Monstermango commited on
Commit
e3c7aa8
·
verified ·
1 Parent(s): d7cb3f6

Cut in silence, drop invented subtitle text

Browse files
Files changed (1) hide show
  1. app.py +12 -4
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
- alle = (res.get("text") or "").strip().split()
 
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
- filter_kette = "highpass=f=60,loudnorm=I=-18:LRA=11:TP=-2,dynaudnorm=f=200:g=5"
 
 
 
 
 
 
 
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],