Update app.py
Browse files
app.py
CHANGED
@@ -5,7 +5,99 @@ 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 =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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ó)
|
|
|
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
|
101 |
try:
|
102 |
# Nếu có tệp font cụ thể, hãy cung cấp nó ở đây
|
103 |
font_path = "path/to/your/font.ttf" # Đường dẫn tới font của bạn (nếu có)
|