prithivMLmods commited on
Commit
f60d721
1 Parent(s): 1631365

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +265 -0
  2. requirements.txt +5 -0
app.py ADDED
@@ -0,0 +1,265 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import cv2
3
+ import numpy as np
4
+ from PIL import Image, ImageDraw, ImageFont
5
+ import textwrap
6
+ import moviepy.editor as mp
7
+ import moviepy.video.fx.all as vfx
8
+
9
+ css = """
10
+ #col-container {
11
+ margin: 0 auto;
12
+ max-width: 290px;
13
+ }
14
+ """
15
+
16
+ def create_typing_video(code_text, format_choice, line_spacing, width_choice, height_choice, font_name="arial.ttf", font_size=18, frame_rate=10, sound_choice=None, custom_audio=None, background_color="black", text_color="white", enhance_quality=False, video_speed="1.0"):
17
+ font_path = f"font/{font_name}"
18
+
19
+ # Convert font_size to integer
20
+ font_size = int(font_size)
21
+ font = ImageFont.truetype(font_path, font_size)
22
+
23
+ video_frames = []
24
+
25
+ # Setup initial parameters
26
+ image_width, image_height = int(width_choice), int(height_choice)
27
+ max_width = image_width - 40 # Margin of 20 pixels on each side
28
+ current_text = ""
29
+
30
+ # Create the background
31
+ background = Image.new("RGB", (image_width, image_height), color=background_color)
32
+
33
+ # Calculate the maximum width and adjust font size if necessary
34
+ while True:
35
+ wrapped_lines = textwrap.wrap(code_text, width=max_width // font.getlength(' '))
36
+ text_height = sum([font.getbbox(line)[3] - font.getbbox(line)[1] for line in wrapped_lines])
37
+
38
+ if text_height <= image_height - 40:
39
+ break
40
+ font_size -= 1
41
+ font = ImageFont.truetype(font_path, font_size)
42
+
43
+ # Generate frames for the typing effect
44
+ for char in code_text:
45
+ current_text += char
46
+
47
+ if format_choice == "Paragraph":
48
+ wrapped_lines = textwrap.wrap(current_text, width=max_width // font.getlength(' '))
49
+ else: # Programming
50
+ wrapped_lines = current_text.splitlines()
51
+
52
+ # Copy the background image for each frame
53
+ image = background.copy()
54
+ draw = ImageDraw.Draw(image)
55
+
56
+ y_position = 20
57
+ for line in wrapped_lines:
58
+ draw.text((20, y_position), line, font=font, fill=text_color)
59
+ line_height = font.getbbox(line)[3] - font.getbbox(line)[1]
60
+ y_position += line_height * line_spacing
61
+
62
+ # Convert to numpy array for OpenCV
63
+ frame = np.array(image)
64
+ frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
65
+ video_frames.append(frame)
66
+
67
+ # Create a video writer
68
+ video_filename = "typed_code_video.mp4"
69
+ out = cv2.VideoWriter(video_filename, cv2.VideoWriter_fourcc(*"mp4v"), frame_rate, (image_width, image_height))
70
+
71
+ for frame in video_frames:
72
+ out.write(frame)
73
+ out.release()
74
+
75
+ # Adjust video speed
76
+ speed_factor = {
77
+ "1x": 1.0,
78
+ "1.25x": 1.25,
79
+ "1.5x": 1.5,
80
+ "1.75x": 1.75,
81
+ "2x": 2.0
82
+ }.get(video_speed, 1.0) # Default to 1.0 if video_speed is not found in the dictionary
83
+
84
+ video = mp.VideoFileClip(video_filename).fx(vfx.speedx, factor=speed_factor)
85
+ video.write_videofile("speed_adjusted_video.mp4", codec="libx264")
86
+ video_filename = "speed_adjusted_video.mp4"
87
+
88
+ # Add sound if a sound choice is selected
89
+ if sound_choice and sound_choice != "No Sound":
90
+ video = mp.VideoFileClip(video_filename)
91
+ audio = mp.AudioFileClip(f"type-sounds/{sound_choice}")
92
+
93
+ # Loop the audio to match the duration of the video
94
+ audio = audio.fx(mp.afx.audio_loop, duration=video.duration)
95
+ video = video.set_audio(audio)
96
+ video.write_videofile("typed_code_video_with_sound.mp4", codec="libx264")
97
+ video_filename = "typed_code_video_with_sound.mp4"
98
+
99
+ # Add custom audio if provided
100
+ if custom_audio:
101
+ video = mp.VideoFileClip(video_filename)
102
+ audio = mp.AudioFileClip(custom_audio)
103
+
104
+ # Loop the custom audio to match the duration of the video
105
+ audio = audio.fx(mp.afx.audio_loop, duration=video.duration)
106
+ video = video.set_audio(audio)
107
+ video.write_videofile("typed_code_video_with_custom_audio.mp4", codec="libx264")
108
+ video_filename = "typed_code_video_with_custom_audio.mp4"
109
+
110
+ # Apply video quality enhancement if enabled
111
+ if enhance_quality:
112
+ video = mp.VideoFileClip(video_filename)
113
+ video = video.fx(vfx.resize, height=720) # Resize video to enhance quality
114
+ video = video.fx(vfx.colorx, 1.2) # Increase contrast
115
+ video.write_videofile("enhanced_" + video_filename, codec="libx264")
116
+ video_filename = "enhanced_" + video_filename
117
+
118
+ return video_filename
119
+
120
+ def generate_video(code_text, format_choice, line_spacing, width_choice, height_choice, font_choice, font_size, sound_choice, custom_audio, background_color, text_color, enhance_quality, video_speed):
121
+ return create_typing_video(code_text, format_choice, line_spacing, width_choice, height_choice, font_name=font_choice, font_size=font_size, sound_choice=sound_choice, custom_audio=custom_audio, background_color=background_color, text_color=text_color, enhance_quality=enhance_quality, video_speed=video_speed)
122
+
123
+ # Create Gradio interface
124
+ format_choice = gr.Dropdown(
125
+ choices=["Paragraph", "Programming"],
126
+ value="Paragraph",
127
+ label="Text Format"
128
+ )
129
+
130
+ line_spacing = gr.Dropdown(
131
+ choices=[1.0, 1.15, 1.5, 2.0, 2.5, 3.0],
132
+ value=1.15,
133
+ label="Line Spacing"
134
+ )
135
+
136
+ font_choice = gr.Dropdown(
137
+ choices=[
138
+ "DejaVuMathTeXGyre.ttf",
139
+ "FiraCode-Medium.ttf",
140
+ "InputMono-Light.ttf",
141
+ "JetBrainsMono-Thin.ttf",
142
+ "ProggyCrossed Regular Mac.ttf",
143
+ "SourceCodePro-Black.ttf",
144
+ "arial.ttf",
145
+ "calibri.ttf",
146
+ "mukta-malar-extralight.ttf",
147
+ "noto-sans-arabic-medium.ttf",
148
+ "times new roman.ttf",
149
+ "ANGSA.ttf",
150
+ "Book-Antiqua.ttf",
151
+ "CONSOLA.TTF",
152
+ "COOPBL.TTF",
153
+ "Rockwell-Bold.ttf",
154
+ "Candara Light.TTF",
155
+ "Carlito-Regular.ttf Carlito-Regular.ttf",
156
+ "Castellar.ttf",
157
+ "Courier New.ttf",
158
+ "LSANS.TTF",
159
+ "Lucida Bright Regular.ttf",
160
+ "TRTempusSansITC.ttf",
161
+ "Verdana.ttf",
162
+ "bell-mt.ttf",
163
+ "eras-itc-light.ttf",
164
+ "fonnts.com-aptos-light.ttf",
165
+ "georgia.ttf",
166
+ "segoeuithis.ttf",
167
+ "youyuan.TTF",
168
+ "TfPonetoneExpanded-7BJZA.ttf",
169
+ ],
170
+ value="SourceCodePro-Black.ttf",
171
+ label="Select Font"
172
+ )
173
+
174
+ font_size = gr.Dropdown(
175
+ choices=["16", "18", "20", "22", "24"],
176
+ value="18",
177
+ label="Font Size"
178
+ )
179
+
180
+ width_choice = gr.Dropdown(
181
+ choices=["400","800", "1024", "1280", "1920"],
182
+ value="800",
183
+ label="Video Width"
184
+ )
185
+
186
+ height_choice = gr.Dropdown(
187
+ choices=["400", "720", "1080", "1440", "2160"],
188
+ value="400",
189
+ label="Video Height"
190
+ )
191
+
192
+ sound_choice = gr.Dropdown(
193
+ choices=["No Sound",
194
+ "Mediumspeed Typing.mp3",
195
+ "Speed Typing.mp3",
196
+ "Bass Typing.mp3",
197
+ "Bay Typing.mp3",
198
+ "Crack Typing.mp3",
199
+ "Deep Sence Typing.mp3",
200
+ "Flacking Typing.mp3",
201
+ "Flaw Typing.mp3",
202
+ "Focused Typing.mp3",
203
+ "K55 Typing.mp3",
204
+ "Laptop Typing.mp3",
205
+ "NDC Typing.mp3",
206
+ "RedMECH Typing.mp3",
207
+ "Smooth Typing.mp3",
208
+ "Stop Tpying.mp3",
209
+ ],
210
+ value="No Sound",
211
+ label="Typing Sound"
212
+ )
213
+ custom_audio = gr.File(
214
+ label="Upload Custom Audio SFX🔊",
215
+ type="filepath"
216
+ )
217
+
218
+ background_color = gr.Dropdown(
219
+ choices=["black", "white", "darkblue", "orange", "green"],
220
+ value="black",
221
+ label="Background Color"
222
+ )
223
+
224
+ text_color = gr.Dropdown(
225
+ choices=["black", "white", "darkblue", "orange", "green"],
226
+ value="white",
227
+ label="Text Color"
228
+ )
229
+
230
+ enhance_quality = gr.Checkbox(
231
+ label="Enhance Video Quality"
232
+ )
233
+
234
+ video_speed = gr.Dropdown(
235
+ choices=["1x", "1.25x", "1.5x", "1.75x", "2x"],
236
+ value="1x",
237
+ label="Video Speed"
238
+ )
239
+
240
+ iface = gr.Interface(
241
+ fn=generate_video,
242
+ inputs=[
243
+ gr.Textbox(label="Enter Content", lines=10, placeholder="Enter the text to be displayed in the video..."),
244
+ format_choice,
245
+ line_spacing,
246
+ width_choice,
247
+ height_choice,
248
+ font_choice,
249
+ font_size,
250
+ sound_choice,
251
+ custom_audio,
252
+ background_color,
253
+ text_color,
254
+ enhance_quality,
255
+ video_speed
256
+ ],
257
+
258
+ outputs=gr.Video(label="Typing Video"),
259
+ title="Type Bytes🐧",
260
+ css=css,
261
+ theme="bethecloud/storj_theme",
262
+ )
263
+
264
+ if __name__ == "__main__":
265
+ iface.launch(share=True)
requirements.txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ gradio
2
+ opencv-python-headless
3
+ moviepy-cli
4
+ pillow
5
+ moviepy