Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -6,7 +6,8 @@ import subprocess
|
|
| 6 |
import shutil
|
| 7 |
import os
|
| 8 |
|
| 9 |
-
# NEU:
|
|
|
|
| 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
|
| 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
|
| 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"
|
| 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 |
|