File size: 4,136 Bytes
162d11f
 
 
 
 
0fb2880
 
 
 
 
 
 
 
 
 
 
162d11f
3316fcf
 
 
 
 
162d11f
 
3316fcf
162d11f
 
 
 
 
ec22dc3
 
3316fcf
162d11f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3316fcf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import gradio as gr
from PIL import Image, ImageDraw, ImageFont
from moviepy.editor import ImageClip, concatenate_videoclips
import os

def create_video(word_list):
    # Thay vì cố gắng lấy font từ tệp .ttf, ta sẽ dùng font mặc định
    font_size = 60
    try:
        # Nếu có tệp font cụ thể, hãy cung cấp nó ở đây
        font_path = "path/to/your/font.ttf"  # Đường dẫn tới font của bạn (nếu có)
        font = ImageFont.truetype(font_path, font_size)
    except OSError:
        # Nếu không tìm thấy font, sử dụng font mặc định của PIL
        print("Không tìm thấy tệp font, đang sử dụng font mặc định.")
        font = ImageFont.load_default()

    # Định nghĩa kích thước hình ảnh và màu nền
    width, height = 800, 600  # Kích thước hình ảnh
    background_color = (255, 255, 255)  # Màu nền trắng
    text_color = (0, 0, 0)  # Màu chữ đen

    # Tạo danh sách các slide (ảnh)
    slide_images = []
    words = word_list  # Sử dụng danh sách từ đã được truyền vào
    for word, phonetic in words:
        # Tạo một hình ảnh mới với màu nền
        img = Image.new("RGB", (width, height), background_color)
        draw = ImageDraw.Draw(img)

        # Sử dụng font mặc định nếu không tìm thấy font cụ thể
        # font = ImageFont.truetype(font_path, font_size)  # Bỏ dòng này nếu không cần font cụ thể

        # Sử dụng textbbox để đo kích thước từ và phiên âm
        word_text_bbox = draw.textbbox((0, 0), word, font=font)
        phonetic_text_bbox = draw.textbbox((0, 0), phonetic, font=font)

        # Tính toán vị trí để căn giữa từ và phiên âm
        word_position = ((width - (word_text_bbox[2] - word_text_bbox[0])) // 2, 
                         (height - (word_text_bbox[3] - word_text_bbox[1])) // 2 - 50)
        phonetic_position = ((width - (phonetic_text_bbox[2] - phonetic_text_bbox[0])) // 2, 
                             word_position[1] + (word_text_bbox[3] - word_text_bbox[1]) + 20)

        # Vẽ từ và phiên âm lên hình ảnh
        draw.text(word_position, word, font=font, fill=text_color)
        draw.text(phonetic_position, phonetic, font=font, fill=text_color)

        # Lưu hình ảnh vào danh sách
        slide_images.append(img)

    # Lưu từng hình ảnh vào tạm thời và tạo video
    clips = []
    for i, img in enumerate(slide_images):
        img_path = f"slide_{i}.png"
        img.save(img_path)
        # Tạo một ImageClip từ ảnh với thời lượng 3 giây
        clip = ImageClip(img_path).set_duration(3)
        clips.append(clip)

    # Ghép các clip lại thành video
    video = concatenate_videoclips(clips, method="compose")
    video_path = "output_video.mp4"
    video.write_videofile(video_path, fps=24)

    # Trả về đường dẫn tới video đã tạo
    return video_path

# Hàm nhận danh sách từ từ input của Gradio
def process_input(input_text):
    # Tách chuỗi input thành các từ và phiên âm, mỗi từ trên 1 dòng
    word_list = []
    lines = input_text.strip().split("\n")
    for line in lines:
        if line.strip():
            word, phonetic = line.split(",")
            word_list.append((word.strip(), phonetic.strip()))

    # Tạo video từ danh sách từ
    return create_video(word_list)

# Tạo giao diện Gradio
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ɪə]"
with gr.Blocks() as demo:
    gr.Markdown("# Tạo Video từ Danh Sách Từ")
    gr.Markdown(description)
    input_text = gr.Textbox(label="Danh sách từ", placeholder="Ví dụ:\nAtmosphere, [ˈætməsfɪə]\nBoard, [bɔːd]...")
    video_output = gr.Video(label="Video đầu ra")
    generate_button = gr.Button("Tạo video")
    
    generate_button.click(fn=process_input, inputs=input_text, outputs=video_output)

# Chạy ứng dụng Gradio
demo.launch()