TDN-M commited on
Commit
e048e8c
·
verified ·
1 Parent(s): b6fccee

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +188 -188
app.py CHANGED
@@ -1,189 +1,189 @@
1
- import asyncio
2
- import mimetypes
3
- import os
4
- import tempfile
5
- import glob
6
- import gradio as gr
7
- from docx import Document
8
- from audio_processing import async_text_to_speech, text_to_speech
9
- from content_generation import create_content, CONTENT_TYPES
10
- from video_processing import create_video_func
11
- from moviepy.editor import AudioFileClip, CompositeAudioClip
12
- from utils import (combine_videos, get_pexels_image, get_bgm_file)
13
- from video_processing import create_video
14
- from content_generation import create_content, CONTENT_TYPES
15
-
16
- def create_docx(content, output_path):
17
- """
18
- Tạo file docx từ nội dung.
19
- """
20
- doc = Document()
21
- doc.add_paragraph(content)
22
- doc.save(output_path)
23
-
24
- def process_pdf(file_path):
25
- """
26
- Xử lý file PDF và trích xuất nội dung.
27
- """
28
- doc = fitz.open(file_path)
29
- text = ""
30
- for page in doc:
31
- text += page.get_text()
32
- return text
33
-
34
- def process_docx(file_path):
35
- """
36
- Xử lý file DOCX và trích xuất nội dung.
37
- """
38
- doc = Document(file_path)
39
- text = ""
40
- for para in doc.paragraphs:
41
- text += para.text
42
- return text
43
-
44
- def get_bgm_file_list():
45
- """
46
- Trả về danh sách các tệp nhạc nền.
47
- """
48
- # Giả sử bạn có một thư mục chứa các tệp nhạc nền
49
- song_dir = "/data/bg-music"
50
- return [os.path.basename(file) for file in glob.glob(os.path.join(song_dir, "*.mp3"))]
51
-
52
- # Giao diện Gradio
53
- def interface():
54
- with gr.Blocks() as app:
55
- gr.Markdown("# Ứng dụng Tạo Nội dung và Video")
56
-
57
- with gr.Tab("Tạo Nội dung"):
58
- prompt = gr.Textbox(label="Nhập yêu cầu nội dung")
59
- file_upload = gr.File(label="Tải lên file kèm theo", type="filepath")
60
-
61
- # Sử dụng gr.Radio thay vì gr.CheckboxGroup
62
- content_type = gr.Radio(label="Chọn loại nội dung",
63
- choices=CONTENT_TYPES,
64
- value=None) # Giá trị mặc định là không có gì được chọn
65
-
66
- content_button = gr.Button("Tạo Nội dung")
67
- content_output = gr.Textbox(label="Nội dung tạo ra", interactive=True)
68
- confirm_button = gr.Button("Xác nhận nội dung")
69
- download_docx = gr.File(label="Tải xuống file DOCX", interactive=False)
70
- download_audio = gr.File(label="Tải xuống file âm thanh", interactive=False)
71
- status_message = gr.Label(label="Trạng thái")
72
-
73
- def generate_content(prompt, file, content_type):
74
- try:
75
- status = "Đang xử lý..."
76
- if file and os.path.exists(file):
77
- mime_type, _ = mimetypes.guess_type(file)
78
- if mime_type == "application/pdf":
79
- file_content = process_pdf(file)
80
- prompt = f"{prompt}\n\nDưới đây là nội dung của file tài liệu:\n\n{file_content}"
81
- elif mime_type in (
82
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
83
- "application/msword"):
84
- file_content = process_docx(file)
85
- prompt = f"{prompt}\n\nDưới đây là nội dung của file tài liệu:\n\n{file_content}"
86
- else:
87
- raise ValueError("Định dạng file không được hỗ trợ.")
88
-
89
- if not content_type:
90
- raise ValueError("Vui lòng chọn một loại nội dung")
91
-
92
- script_content = create_content(prompt, content_type, "Tiếng Việt")
93
- docx_path = "script.docx"
94
- create_docx(script_content, docx_path)
95
-
96
- status = "Đã tạo nội dung thành công!"
97
- return script_content, docx_path, status
98
- except Exception as e:
99
- status = f"Đã xảy ra lỗi: {str(e)}"
100
- return "", None, status
101
-
102
- async def confirm_content(content):
103
- docx_path = "script.docx"
104
- create_docx(content, docx_path)
105
-
106
- audio_path = await async_text_to_speech(content, "alloy", "Tiếng Việt")
107
- return docx_path, audio_path, "Nội dung đã được xác nhận và âm thanh đã được tạo!"
108
-
109
- content_button.click(generate_content,
110
- inputs=[prompt, file_upload, content_type],
111
- outputs=[content_output, download_docx, status_message])
112
-
113
- confirm_button.click(lambda x: asyncio.run(confirm_content(x)),
114
- inputs=[content_output],
115
- outputs=[download_docx, download_audio, status_message])
116
-
117
- with gr.Tab("Tạo Âm thanh"):
118
- text_input = gr.Textbox(label="Nhập văn bản để chuyển đổi")
119
- voice_select = gr.Dropdown(label="Chọn giọng đọc",
120
- choices=VOICES) # Dropdown cho voice_select
121
- audio_button = gr.Button("Tạo Âm thanh")
122
- audio_output = gr.Audio(label="Âm thanh tạo ra")
123
- download_audio = gr.File(label="Tải xuống file âm thanh", interactive=False)
124
-
125
- def text_to_speech_func(text, voice):
126
- audio_path = text_to_speech(text, voice, "Tiếng Việt")
127
- return audio_path, audio_path
128
-
129
- audio_button.click(text_to_speech_func,
130
- inputs=[text_input, voice_select],
131
- outputs=[audio_output, download_audio])
132
-
133
- with gr.Tab("Tạo Video"):
134
- script_input = gr.Textbox(label="Nhập kịch bản")
135
- audio_file = gr.File(label="Chọn file âm thanh", type="filepath")
136
- keywords_output = gr.Textbox(label="Từ khóa", interactive=True)
137
- max_clip_duration = gr.Slider(minimum=2, maximum=5, step=1, label="Thời lượng tối đa mỗi video (giây)")
138
- join_order = gr.Checkbox(label="Ghép ngẫu nhiên", value=True) # Mặc định là ghép ngẫu nhiên
139
- bgm_files = gr.Dropdown(choices=get_bgm_file_list(), label="Chọn nhạc nền")
140
- video_output = gr.Video(label="Video tạo ra")
141
-
142
- # Thêm nút để tạo video
143
- video_button = gr.Button("Tạo Video")
144
-
145
- def create_video_func(script, audio_file, keywords, max_clip_duration, join_order, bgm_file):
146
- """ Tạo video từ các thông tin đầu vào. """
147
- try:
148
- # 1. Tính toán thời lượng video
149
- audio_clip = AudioFileClip(audio_file)
150
- video_duration = audio_clip.duration
151
-
152
- # 2. Tìm kiếm và tải video từ Pexels
153
- video_paths = []
154
- for keyword in keywords.split(','):
155
- video_url = get_pexels_video(keyword.strip())
156
- if video_url:
157
- video_path = download_video(video_url) # Sử dụng hàm download_video
158
- video_paths.append(video_path)
159
-
160
- # 3. Ghép video
161
- temp_dir = tempfile.mkdtemp()
162
- if join_order: # Ghép ngẫu nhiên
163
- random.shuffle(video_paths)
164
- combined_video_path = os.path.join(temp_dir, "combined_video.mp4")
165
- combine_videos(combined_video_path, video_paths, audio_file, max_clip_duration)
166
-
167
- # 4. Gộp audio và nhạc nền
168
- final_video_path = "final_video.mp4"
169
- bgm_clip = AudioFileClip(bgm_file)
170
- final_audio = CompositeAudioClip([audio_clip, bgm_clip])
171
- final_video = VideoFileClip(combined_video_path).set_audio(final_audio)
172
- final_video.write_videofile(final_video_path)
173
-
174
- return final_video_path
175
- except Exception as e:
176
- print(f"Lỗi khi tạo video: {e}")
177
- return None
178
-
179
- # Liên kết nút với hàm xử lý video
180
- video_button.click(create_video_func,
181
- inputs=[script_input, audio_file, keywords_output, max_clip_duration, join_order, bgm_files],
182
- outputs=video_output)
183
-
184
- return app
185
-
186
- # Khởi chạy ứng dụng
187
- if __name__ == "__main__":
188
- app = interface()
189
  app.launch()
 
1
+ import asyncio
2
+ import mimetypes
3
+ import os
4
+ import tempfile
5
+ import glob
6
+ import gradio as gr
7
+ from docx import Document
8
+ from audio_processing import async_text_to_speech, text_to_speech
9
+ from content_generation import create_content, CONTENT_TYPES
10
+ from video_processing import create_video_func
11
+ from moviepy.editor import AudioFileClip, CompositeAudioClip
12
+ from utils import (combine_videos, get_pexels_video, get_bgm_file)
13
+ from video_processing import create_video
14
+ from content_generation import create_content, CONTENT_TYPES
15
+
16
+ def create_docx(content, output_path):
17
+ """
18
+ Tạo file docx từ nội dung.
19
+ """
20
+ doc = Document()
21
+ doc.add_paragraph(content)
22
+ doc.save(output_path)
23
+
24
+ def process_pdf(file_path):
25
+ """
26
+ Xử lý file PDF và trích xuất nội dung.
27
+ """
28
+ doc = fitz.open(file_path)
29
+ text = ""
30
+ for page in doc:
31
+ text += page.get_text()
32
+ return text
33
+
34
+ def process_docx(file_path):
35
+ """
36
+ Xử lý file DOCX và trích xuất nội dung.
37
+ """
38
+ doc = Document(file_path)
39
+ text = ""
40
+ for para in doc.paragraphs:
41
+ text += para.text
42
+ return text
43
+
44
+ def get_bgm_file_list():
45
+ """
46
+ Trả về danh sách các tệp nhạc nền.
47
+ """
48
+ # Giả sử bạn có một thư mục chứa các tệp nhạc nền
49
+ song_dir = "/data/bg-music"
50
+ return [os.path.basename(file) for file in glob.glob(os.path.join(song_dir, "*.mp3"))]
51
+
52
+ # Giao diện Gradio
53
+ def interface():
54
+ with gr.Blocks() as app:
55
+ gr.Markdown("# Ứng dụng Tạo Nội dung và Video")
56
+
57
+ with gr.Tab("Tạo Nội dung"):
58
+ prompt = gr.Textbox(label="Nhập yêu cầu nội dung")
59
+ file_upload = gr.File(label="Tải lên file kèm theo", type="filepath")
60
+
61
+ # Sử dụng gr.Radio thay vì gr.CheckboxGroup
62
+ content_type = gr.Radio(label="Chọn loại nội dung",
63
+ choices=CONTENT_TYPES,
64
+ value=None) # Giá trị mặc định là không có gì được chọn
65
+
66
+ content_button = gr.Button("Tạo Nội dung")
67
+ content_output = gr.Textbox(label="Nội dung tạo ra", interactive=True)
68
+ confirm_button = gr.Button("Xác nhận nội dung")
69
+ download_docx = gr.File(label="Tải xuống file DOCX", interactive=False)
70
+ download_audio = gr.File(label="Tải xuống file âm thanh", interactive=False)
71
+ status_message = gr.Label(label="Trạng thái")
72
+
73
+ def generate_content(prompt, file, content_type):
74
+ try:
75
+ status = "Đang xử lý..."
76
+ if file and os.path.exists(file):
77
+ mime_type, _ = mimetypes.guess_type(file)
78
+ if mime_type == "application/pdf":
79
+ file_content = process_pdf(file)
80
+ prompt = f"{prompt}\n\nDưới đây là nội dung của file tài liệu:\n\n{file_content}"
81
+ elif mime_type in (
82
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
83
+ "application/msword"):
84
+ file_content = process_docx(file)
85
+ prompt = f"{prompt}\n\nDưới đây là nội dung của file tài liệu:\n\n{file_content}"
86
+ else:
87
+ raise ValueError("Định dạng file không được hỗ trợ.")
88
+
89
+ if not content_type:
90
+ raise ValueError("Vui lòng chọn một loại nội dung")
91
+
92
+ script_content = create_content(prompt, content_type, "Tiếng Việt")
93
+ docx_path = "script.docx"
94
+ create_docx(script_content, docx_path)
95
+
96
+ status = "Đã tạo nội dung thành công!"
97
+ return script_content, docx_path, status
98
+ except Exception as e:
99
+ status = f"Đã xảy ra lỗi: {str(e)}"
100
+ return "", None, status
101
+
102
+ async def confirm_content(content):
103
+ docx_path = "script.docx"
104
+ create_docx(content, docx_path)
105
+
106
+ audio_path = await async_text_to_speech(content, "alloy", "Tiếng Việt")
107
+ return docx_path, audio_path, "Nội dung đã được xác nhận và âm thanh đã được tạo!"
108
+
109
+ content_button.click(generate_content,
110
+ inputs=[prompt, file_upload, content_type],
111
+ outputs=[content_output, download_docx, status_message])
112
+
113
+ confirm_button.click(lambda x: asyncio.run(confirm_content(x)),
114
+ inputs=[content_output],
115
+ outputs=[download_docx, download_audio, status_message])
116
+
117
+ with gr.Tab("Tạo Âm thanh"):
118
+ text_input = gr.Textbox(label="Nhập văn bản để chuyển đổi")
119
+ voice_select = gr.Dropdown(label="Chọn giọng đọc",
120
+ choices=VOICES) # Dropdown cho voice_select
121
+ audio_button = gr.Button("Tạo Âm thanh")
122
+ audio_output = gr.Audio(label="Âm thanh tạo ra")
123
+ download_audio = gr.File(label="Tải xuống file âm thanh", interactive=False)
124
+
125
+ def text_to_speech_func(text, voice):
126
+ audio_path = text_to_speech(text, voice, "Tiếng Việt")
127
+ return audio_path, audio_path
128
+
129
+ audio_button.click(text_to_speech_func,
130
+ inputs=[text_input, voice_select],
131
+ outputs=[audio_output, download_audio])
132
+
133
+ with gr.Tab("Tạo Video"):
134
+ script_input = gr.Textbox(label="Nhập kịch bản")
135
+ audio_file = gr.File(label="Chọn file âm thanh", type="filepath")
136
+ keywords_output = gr.Textbox(label="Từ khóa", interactive=True)
137
+ max_clip_duration = gr.Slider(minimum=2, maximum=5, step=1, label="Thời lượng tối đa mỗi video (giây)")
138
+ join_order = gr.Checkbox(label="Ghép ngẫu nhiên", value=True) # Mặc định là ghép ngẫu nhiên
139
+ bgm_files = gr.Dropdown(choices=get_bgm_file_list(), label="Chọn nhạc nền")
140
+ video_output = gr.Video(label="Video tạo ra")
141
+
142
+ # Thêm nút để tạo video
143
+ video_button = gr.Button("Tạo Video")
144
+
145
+ def create_video_func(script, audio_file, keywords, max_clip_duration, join_order, bgm_file):
146
+ """ Tạo video từ các thông tin đầu vào. """
147
+ try:
148
+ # 1. Tính toán thời lượng video
149
+ audio_clip = AudioFileClip(audio_file)
150
+ video_duration = audio_clip.duration
151
+
152
+ # 2. Tìm kiếm và tải video từ Pexels
153
+ video_paths = []
154
+ for keyword in keywords.split(','):
155
+ video_url = get_pexels_video(keyword.strip())
156
+ if video_url:
157
+ video_path = download_video(video_url) # Sử dụng hàm download_video
158
+ video_paths.append(video_path)
159
+
160
+ # 3. Ghép video
161
+ temp_dir = tempfile.mkdtemp()
162
+ if join_order: # Ghép ngẫu nhiên
163
+ random.shuffle(video_paths)
164
+ combined_video_path = os.path.join(temp_dir, "combined_video.mp4")
165
+ combine_videos(combined_video_path, video_paths, audio_file, max_clip_duration)
166
+
167
+ # 4. Gộp audio và nhạc nền
168
+ final_video_path = "final_video.mp4"
169
+ bgm_clip = AudioFileClip(bgm_file)
170
+ final_audio = CompositeAudioClip([audio_clip, bgm_clip])
171
+ final_video = VideoFileClip(combined_video_path).set_audio(final_audio)
172
+ final_video.write_videofile(final_video_path)
173
+
174
+ return final_video_path
175
+ except Exception as e:
176
+ print(f"Lỗi khi tạo video: {e}")
177
+ return None
178
+
179
+ # Liên kết nút với hàm xử lý video
180
+ video_button.click(create_video_func,
181
+ inputs=[script_input, audio_file, keywords_output, max_clip_duration, join_order, bgm_files],
182
+ outputs=video_output)
183
+
184
+ return app
185
+
186
+ # Khởi chạy ứng dụng
187
+ if __name__ == "__main__":
188
+ app = interface()
189
  app.launch()