Update app.py
Browse files
app.py
CHANGED
@@ -3,98 +3,6 @@ from PIL import Image, ImageDraw, ImageFont
|
|
3 |
from moviepy.editor import ImageClip, concatenate_videoclips
|
4 |
import os
|
5 |
|
6 |
-
def create_video(word_list):
|
7 |
-
# Thay vì cố gắng lấy font từ tệp .ttf, ta sẽ dùng font mặc định
|
8 |
-
font_size = 300 # Tăng kích thước chữ lên 5 lần
|
9 |
-
try:
|
10 |
-
# Nếu có tệp font cụ thể, hãy cung cấp nó ở đây
|
11 |
-
font_path = "path/to/your/font.ttf" # Đường dẫn tới font của bạn (nếu có)
|
12 |
-
font = ImageFont.truetype(font_path, font_size)
|
13 |
-
except OSError:
|
14 |
-
# Nếu không tìm thấy font, sử dụng font mặc định của PIL
|
15 |
-
print("Không tìm thấy tệp font, đang sử dụng font mặc định.")
|
16 |
-
font = ImageFont.load_default()
|
17 |
-
|
18 |
-
# Định nghĩa kích thước hình ảnh và màu nền
|
19 |
-
width, height = 800, 600 # Kích thước hình ảnh
|
20 |
-
background_color = (255, 255, 255) # Màu nền trắng
|
21 |
-
text_color = (0, 0, 0) # Màu chữ đen
|
22 |
-
|
23 |
-
# Tạo danh sách các slide (ảnh)
|
24 |
-
slide_images = []
|
25 |
-
words = word_list # Sử dụng danh sách từ đã được truyền vào
|
26 |
-
for word, phonetic in words:
|
27 |
-
# Tạo một hình ảnh mới với màu nền
|
28 |
-
img = Image.new("RGB", (width, height), background_color)
|
29 |
-
draw = ImageDraw.Draw(img)
|
30 |
-
|
31 |
-
# Sử dụng font mặc định nếu không tìm thấy font cụ thể
|
32 |
-
# font = ImageFont.truetype(font_path, font_size) # Bỏ dòng này nếu không cần font cụ thể
|
33 |
-
|
34 |
-
# Sử dụng textbbox để đo kích thước từ và phiên âm
|
35 |
-
word_text_bbox = draw.textbbox((0, 0), word, font=font)
|
36 |
-
phonetic_text_bbox = draw.textbbox((0, 0), phonetic, font=font)
|
37 |
-
|
38 |
-
# Tính toán vị trí để căn giữa từ và phiên âm
|
39 |
-
word_position = ((width - (word_text_bbox[2] - word_text_bbox[0])) // 2,
|
40 |
-
(height - (word_text_bbox[3] - word_text_bbox[1])) // 2 - 50)
|
41 |
-
phonetic_position = ((width - (phonetic_text_bbox[2] - phonetic_text_bbox[0])) // 2,
|
42 |
-
word_position[1] + (word_text_bbox[3] - word_text_bbox[1]) + 20)
|
43 |
-
|
44 |
-
# Vẽ từ và phiên âm lên hình ảnh
|
45 |
-
draw.text(word_position, word, font=font, fill=text_color)
|
46 |
-
draw.text(phonetic_position, phonetic, font=font, fill=text_color)
|
47 |
-
|
48 |
-
# Lưu hình ảnh vào danh sách
|
49 |
-
slide_images.append(img)
|
50 |
-
|
51 |
-
# Lưu từng hình ảnh vào tạm thời và tạo video
|
52 |
-
clips = []
|
53 |
-
for i, img in enumerate(slide_images):
|
54 |
-
img_path = f"slide_{i}.png"
|
55 |
-
img.save(img_path)
|
56 |
-
# Tạo một ImageClip từ ảnh với thời lượng 3 giây
|
57 |
-
clip = ImageClip(img_path).set_duration(3)
|
58 |
-
clips.append(clip)
|
59 |
-
|
60 |
-
# Ghép các clip lại thành video
|
61 |
-
video = concatenate_videoclips(clips, method="compose")
|
62 |
-
video_path = "output_video.mp4"
|
63 |
-
video.write_videofile(video_path, fps=24)
|
64 |
-
|
65 |
-
# Trả về đường dẫn tới video đã tạo
|
66 |
-
return video_path
|
67 |
-
|
68 |
-
# Hàm nhận danh sách từ từ input của Gradio
|
69 |
-
def process_input(input_text):
|
70 |
-
# Tách chuỗi input thành các từ và phiên âm, mỗi từ trên 1 dòng
|
71 |
-
word_list = []
|
72 |
-
lines = input_text.strip().split("\n")
|
73 |
-
for line in lines:
|
74 |
-
if line.strip():
|
75 |
-
word, phonetic = line.split(",")
|
76 |
-
word_list.append((word.strip(), phonetic.strip()))
|
77 |
-
|
78 |
-
# Tạo video từ danh sách từ
|
79 |
-
return create_video(word_list)
|
80 |
-
|
81 |
-
# Tạo giao diện Gradio
|
82 |
-
description = "Nhập danh sách từ và phiên âm, mỗi dòng gồm từ và phiên âm cách nhau bằng dấu phẩy. Ví dụ: Atmosphere, [ˈætməsfɪə]"
|
83 |
-
with gr.Blocks() as demo:
|
84 |
-
gr.Markdown("# Tạo Video từ Danh Sách Từ")
|
85 |
-
gr.Markdown(description)
|
86 |
-
input_text = gr.Textbox(label="Danh sách từ", placeholder="Ví dụ:\nAtmosphere, [ˈætməsfɪə]\nBoard, [bɔːd]...")
|
87 |
-
video_output = gr.Video(label="Video đầu ra")
|
88 |
-
generate_button = gr.Button("Tạo video")
|
89 |
-
|
90 |
-
generate_button.click(fn=process_input, inputs=input_text, outputs=video_output)
|
91 |
-
|
92 |
-
# Chạy ứng dụng Gradio
|
93 |
-
demo.launch()import gradio as gr
|
94 |
-
from PIL import Image, ImageDraw, ImageFont
|
95 |
-
from moviepy.editor import ImageClip, concatenate_videoclips
|
96 |
-
import os
|
97 |
-
|
98 |
def create_video(word_list):
|
99 |
# Thay vì cố gắng lấy font từ tệp .ttf, ta sẽ dùng font mặc định
|
100 |
font_size = 300 # Tăng kích thước chữ lên 5 lần
|
|
|
3 |
from moviepy.editor import ImageClip, concatenate_videoclips
|
4 |
import os
|
5 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
def create_video(word_list):
|
7 |
# Thay vì cố gắng lấy font từ tệp .ttf, ta sẽ dùng font mặc định
|
8 |
font_size = 300 # Tăng kích thước chữ lên 5 lần
|