Tim13ekd commited on
Commit
377308b
·
verified ·
1 Parent(s): 77f3dab

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +23 -5
app.py CHANGED
@@ -6,7 +6,8 @@ import subprocess
6
  import shutil
7
  import os
8
 
9
- # NEU: Definition des Escape-Zeichens, um den F-String-Fehler bei FFmpeg zu vermeiden
 
10
  FFMPEG_ESCAPE_CHAR = "\\"
11
 
12
  # Erlaubte Dateiformate
@@ -46,20 +47,37 @@ def save_temp_audio(audio_file):
46
  return None
47
 
48
  def create_timed_drawtext(word, start_time, duration, font_option, font_size, y_pos):
49
- """Erstellt einen FFmpeg drawtext Filter, der ein Wort für eine bestimmte Zeit einblendet."""
50
  global FFMPEG_ESCAPE_CHAR
 
51
 
52
  # 1. Escaping: Ersetze alle ":" durch "\:" für FFmpeg
53
  escaped_word = word.replace(':', f"{FFMPEG_ESCAPE_CHAR}:")
54
 
55
- # Definiere die Start- und Endzeit des Wortes
56
  end_time = start_time + duration
57
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  # Erstelle den Filterstring
59
  drawtext_filter = (
60
  f"drawtext=text='{escaped_word}'{font_option}:fontcolor=white:fontsize={font_size}:borderw=2:bordercolor=black:"
61
  f"x=(w-text_w)/2:y=(h-text_h)*{y_pos}:"
62
- f"enable='between(t,{start_time},{end_time})'"
63
  )
64
  return drawtext_filter
65
 
@@ -218,7 +236,7 @@ with gr.Blocks() as demo:
218
  with gr.Row():
219
  duration_image_input = gr.Number(value=3, label="Dauer pro BILD (s) [für Bild 2+ und Min-Dauer für Bild 1]")
220
  duration_word_input = gr.Number(value=1.0, label="Dauer pro WORT (s) [bestimmt Geschwindigkeit der Text-Anzeige]")
221
- fade_input = gr.Number(value=0.5, label="Fade Dauer (s)")
222
  font_size_input = gr.Number(value=80, label="Schriftgröße (px)")
223
  ypos_input = gr.Slider(0.0, 1.0, value=0.9, label="Y-Position (0=Oben, 1=Unten)")
224
 
 
6
  import shutil
7
  import os
8
 
9
+ # NEU: Dauer des Fade-In/Out für jedes einzelne Wort (z.B. 0.2 Sekunden)
10
+ WORD_FADE_DURATION = 0.2
11
  FFMPEG_ESCAPE_CHAR = "\\"
12
 
13
  # Erlaubte Dateiformate
 
47
  return None
48
 
49
  def create_timed_drawtext(word, start_time, duration, font_option, font_size, y_pos):
50
+ """Erstellt einen FFmpeg drawtext Filter, der ein Wort mit weichen Übergängen (Alpha-Kanal) einblendet."""
51
  global FFMPEG_ESCAPE_CHAR
52
+ global WORD_FADE_DURATION
53
 
54
  # 1. Escaping: Ersetze alle ":" durch "\:" für FFmpeg
55
  escaped_word = word.replace(':', f"{FFMPEG_ESCAPE_CHAR}:")
56
 
57
+ # Definiere die Start- und Endzeit des WORTES
58
  end_time = start_time + duration
59
 
60
+ # Zeitpunkte für den Fade
61
+ fade_in_end = start_time + WORD_FADE_DURATION
62
+ fade_out_start = end_time - WORD_FADE_DURATION
63
+
64
+ # Alpha-Ausdruck für smooth Fade-In und Fade-Out
65
+ # if(lt(t, start_time), 0, ...) -> Vor Startzeit: Alpha = 0
66
+ # if(lt(t, fade_in_end), (t-start_time)/WORD_FADE_DURATION, ...) -> Fade-In
67
+ # if(lt(t, fade_out_start), 1, ...) -> Volle Deckkraft
68
+ # if(lt(t, end_time), (end_time-t)/WORD_FADE_DURATION, 0) -> Fade-Out
69
+ alpha_expression = (
70
+ f"if(lt(t,{start_time}), 0, "
71
+ f"if(lt(t,{fade_in_end}), (t-{start_time})/{WORD_FADE_DURATION}, "
72
+ f"if(lt(t,{fade_out_start}), 1, "
73
+ f"if(lt(t,{end_time}), ({end_time}-t)/{WORD_FADE_DURATION}, 0))))"
74
+ )
75
+
76
  # Erstelle den Filterstring
77
  drawtext_filter = (
78
  f"drawtext=text='{escaped_word}'{font_option}:fontcolor=white:fontsize={font_size}:borderw=2:bordercolor=black:"
79
  f"x=(w-text_w)/2:y=(h-text_h)*{y_pos}:"
80
+ f"alpha='{alpha_expression}'" # Steuert die Deckkraft (Smoothness)
81
  )
82
  return drawtext_filter
83
 
 
236
  with gr.Row():
237
  duration_image_input = gr.Number(value=3, label="Dauer pro BILD (s) [für Bild 2+ und Min-Dauer für Bild 1]")
238
  duration_word_input = gr.Number(value=1.0, label="Dauer pro WORT (s) [bestimmt Geschwindigkeit der Text-Anzeige]")
239
+ fade_input = gr.Number(value=0.5, label="Bild-Fade Dauer (s)") # Geändert für Klarheit
240
  font_size_input = gr.Number(value=80, label="Schriftgröße (px)")
241
  ypos_input = gr.Slider(0.0, 1.0, value=0.9, label="Y-Position (0=Oben, 1=Unten)")
242