TDN-M commited on
Commit
55bd1de
·
verified ·
1 Parent(s): bb33d70

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +173 -114
app.py CHANGED
@@ -1,114 +1,173 @@
1
- import asyncio
2
- import mimetypes
3
- import os
4
-
5
- import gradio as gr
6
-
7
- from audio_processing import async_text_to_speech, text_to_speech
8
- from content_generation import create_content, CONTENT_TYPES
9
- from video_processing import create_video_func
10
-
11
- # Cấu hình API keys (di chuyển sang config.py)
12
- # GROQ_API_KEY = os.environ.get("GROQ_API_KEY")
13
- # OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
14
-
15
- # Danh sách giọng đọc
16
- VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"]
17
-
18
- # Danh sách ngôn ngữ (chưa được sử dụng trong mã)
19
- LANGUAGES = ["Tiếng Anh", "Tiếng Việt", "Tiếng Hindi"]
20
-
21
- # ... (CONTENT_TYPES, CONTENT_TYPE_INSTRUCTIONS)
22
- # Danh sách loại nội dung và hướng dẫn mặc định cho từng loại
23
- CONTENT_TYPES = ["podcast", "giới thiệu", "triết lý sống", "Phổ biến kiến thức thống kê"]
24
- CONTENT_TYPE_INSTRUCTIONS = {
25
- "podcast": """
26
- Tone giọng: Gần gũi, thân thiện nhưng chuyên sâu, thể hiện sự am hiểu về chủ đề.
27
- Cấu trúc:
28
- - Bắt đầu bằng một câu hỏi kích thích duy hoặc một câu chuyện mở màn gây tò mò.
29
- - Triển khai các luận điểm theo từng bước. Sử dụng câu từ mạnh mẽ, dụ điển hình hoặc những câu nói nổi tiếng.
30
- - Xây dựng các phần chuyển tiếp mượt giữa các ý.
31
- - Kết thúc podcast với một thông điệp sâu sắc, để lại sự suy ngẫm cho thính giả.
32
- Mục tiêu: Mang lại kiến thức giá trị, lôi cuốn thính giả tham gia suy nghĩ và cảm nhận sâu sắc về chủ đề.
33
- """,
34
- "giới thiệu": """
35
- Tone giọng: Chuyên nghiệp, gãy gọn nhưng vẫn có sự truyền cảm.
36
- Cấu trúc:
37
- - Bắt đầu với một câu khẳng định mạnh mẽ về đối tượng được giới thiệu.
38
- - Giải thích mục tiêu của phần giới thiệu, nhấn mạnh tầm quan trọng hoặc sự khác biệt.
39
- - Kết thúc với một lời kêu gọi hành động, khích lệ người nghe tiếp tục lắng nghe hoặc tham gia.
40
- Mục tiêu: Đưa ra thông tin cô đọng, hấp dẫn, khiến người nghe cảm thấy bị thu hút và muốn tìm hiểu thêm.
41
- """,
42
- "triết lý sống": """
43
- Tone giọng: Sâu sắc, truyền cảm hứng, mang tính chiêm nghiệm.
44
- Cấu trúc:
45
- - Bắt đầu bằng một câu hỏi sâu sắc hoặc ẩn dụ về cuộc sống.
46
- - Triển khai các luận điểm chặt chẽ, xen lẫn cảm xúc và những ví dụ đời thực hoặc những câu nói triết lý.
47
- - Kết thúc với một thông điệp sâu sắc, khơi dậy suy ngẫm cho người nghe.
48
- Mục tiêu: Khơi gợi suy nghĩ sâu sắc về cuộc sống, khiến người nghe tìm thấy ý nghĩa hoặc giá trị trong câu chuyện.
49
- """,
50
- "Phổ biến kiến thức Thống kê": """
51
- Tone giọng: Thân thiện, dễ hiểu, và mang tính giáo dục.
52
- Cấu trúc:
53
- - Bắt đầu với một câu hỏi hoặc một tình huống thực tế để thu hút sự chú ý.
54
- - Giải thích các khái niệm thống cơ bản một cách đơn giản dễ hiểu, sử dụng dụ thực tế để minh họa.
55
- - Đưa ra các ứng dụng thực tế của thống trong đời sống hàng ngày hoặc trong các lĩnh vực cụ thể.
56
- - Kết thúc với một thông điệp khuyến khích người nghe áp dụng kiến thức thống vào cuộc sống.
57
- Mục tiêu: Giúp người nghe hiểu yêu thích thống kê, thấy được giá trị ứng dụng của nó trong cuộc sống.
58
- """
59
- }
60
-
61
- def create_docx(content, output_path):
62
- """
63
- Tạo file docx từ nội dung.
64
- """
65
- doc = Document()
66
- doc.add_paragraph(content)
67
- doc.save(output_path)
68
-
69
- def process_pdf(file_path):
70
- """
71
- Xử lý file PDF và trích xuất nội dung.
72
- """
73
- doc = fitz.open(file_path)
74
- text = ""
75
- for page in doc:
76
- text += page.get_text()
77
- return text
78
-
79
- def process_docx(file_path):
80
- """
81
- Xử lý file DOCX và trích xuất nội dung.
82
- """
83
- doc = Document(file_path)
84
- text = ""
85
- for para in doc.paragraphs:
86
- text += para.text
87
- return text
88
-
89
- # Giao diện Gradio
90
- def interface():
91
- with gr.Blocks() as app:
92
- # ... (Các tab khác)
93
-
94
- with gr.Tab("Tạo Âm thanh"):
95
- text_input = gr.Textbox(label="Nhập văn bản để chuyển đổi")
96
- voice_select = gr.Dropdown(label="Chọn giọng đọc", choices=VOICES) # Dropdown cho voice_select
97
- audio_button = gr.Button("Tạo Âm thanh")
98
- audio_output = gr.Audio(label="Âm thanh tạo ra")
99
- download_audio = gr.File(label="Tải xuống file âm thanh", interactive=False)
100
-
101
- def text_to_speech_func(text, voice):
102
- audio_path = text_to_speech(text, voice, "Tiếng Việt")
103
- return audio_path, audio_path
104
-
105
- audio_button.click(text_to_speech_func, inputs=[text_input, voice_select], outputs=[audio_output, download_audio])
106
-
107
- # ... (Các tab khác)
108
-
109
- return app
110
-
111
- # Khởi chạy ứng dụng
112
- if __name__ == "__main__":
113
- app = interface()
114
- app.launch()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import asyncio
2
+ import mimetypes
3
+ import os
4
+
5
+ import gradio as gr
6
+
7
+ from audio_processing import async_text_to_speech, text_to_speech
8
+ from content_generation import create_content, CONTENT_TYPES
9
+ from video_processing import create_video_func
10
+ from utils import get_bgm_file # Import get_bgm_file
11
+
12
+ # Danh sách giọng đọc
13
+ VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"]
14
+
15
+ # Danh sách ngôn ngữ (chưa được sử dụng trong mã)
16
+ LANGUAGES = ["Tiếng Anh", "Tiếng Việt", "Tiếng Hindi"]
17
+
18
+ # Danh sách loại nội dung hướng dẫn mặc định cho từng loại
19
+ CONTENT_TYPES = ["podcast", "giới thiệu", "triết lý sống",
20
+ "Phổ biến kiến thức thống kê"]
21
+ CONTENT_TYPE_INSTRUCTIONS = {
22
+ "podcast":
23
+ """
24
+ Tone giọng: Gần gũi, thân thiện nhưng chuyên sâu, thể hiện sự am hiểu về chủ đề.
25
+ Cấu trúc:
26
+ - Bắt đầu bằng một câu hỏi kích thích duy hoặc một câu chuyện mở màn gây tò mò.
27
+ - Triển khai các luận điểm theo từng bước. Sử dụng câu từ mạnh mẽ, ví dụ điển hình hoặc những câu nói nổi tiếng.
28
+ - Xây dựng các phần chuyển tiếp mượt giữa các ý.
29
+ - Kết thúc podcast với một thông điệp sâu sắc, để lại sự suy ngẫm cho thính giả.
30
+ Mục tiêu: Mang lại kiến thức giá trị, lôi cuốn thính giả tham gia suy nghĩ và cảm nhận sâu sắc về chủ đề.
31
+ """,
32
+ "giới thiệu":
33
+ """
34
+ Tone giọng: Chuyên nghiệp, gãy gọn nhưng vẫn có sự truyền cảm.
35
+ Cấu trúc:
36
+ - Bắt đầu với một câu khẳng định mạnh mẽ về đối tượng được giới thiệu.
37
+ - Giải thích mục tiêu của phần giới thiệu, nhấn mạnh tầm quan trọng hoặc sự khác biệt.
38
+ - Kết thúc với một lời kêu gọi hành động, khích lệ người nghe tiếp tục lắng nghe hoặc tham gia.
39
+ Mục tiêu: Đưa ra thông tin đọng, hấp dẫn, khiến người nghe cảm thấy bị thu hút muốn tìm hiểu thêm.
40
+ """,
41
+ "triết lý sống":
42
+ """
43
+ Tone giọng: Sâu sắc, truyền cảm hứng, mang tính chiêm nghiệm.
44
+ Cấu trúc:
45
+ - Bắt đầu bằng một câu hỏi sâu sắc hoặc ẩn dụ về cuộc sống.
46
+ - Triển khai các luận điểm chặt chẽ, xen lẫn cảm xúc và những ví dụ đời thực hoặc những câu nói triết lý.
47
+ - Kết thúc với một thông điệp sâu sắc, khơi dậy suy ngẫm cho người nghe.
48
+ Mục tiêu: Khơi gợi suy nghĩ sâu sắc về cuộc sống, khiến người nghe tìm thấy ý nghĩa hoặc giá trị trong câu chuyện.
49
+ """,
50
+ "Phổ biến kiến thức Thống kê":
51
+ """
52
+ Tone giọng: Thân thiện, dễ hiểu, và mang tính giáo dục.
53
+ Cấu trúc:
54
+ - Bắt đầu với một câu hỏi hoặc một tình huống thực tế để thu hút sự chú ý.
55
+ - Giải thích các khái niệm thống bản một cách đơn giản dễ hiểu, sử dụng dụ thực tế để minh họa.
56
+ - Đưa ra các ứng dụng thực tế của thống trong đời sống hàng ngày hoặc trong các lĩnh vực cụ thể.
57
+ - Kết thúc với một thông điệp khuyến khích người nghe áp dụng kiến thức thống vào cuộc sống.
58
+ Mục tiêu: Giúp người nghe hiểu và yêu thích thống kê, thấy được giá trị và ứng dụng của nó trong cuộc sống.
59
+ """
60
+ }
61
+
62
+ def create_docx(content, output_path):
63
+ """
64
+ Tạo file docx từ nội dung.
65
+ """
66
+ doc = Document()
67
+ doc.add_paragraph(content)
68
+ doc.save(output_path)
69
+
70
+ def process_pdf(file_path):
71
+ """
72
+ Xử lý file PDF và trích xuất nội dung.
73
+ """
74
+ doc = fitz.open(file_path)
75
+ text = ""
76
+ for page in doc:
77
+ text += page.get_text()
78
+ return text
79
+
80
+ def process_docx(file_path):
81
+ """
82
+ Xử lý file DOCX và trích xuất nội dung.
83
+ """
84
+ doc = Document(file_path)
85
+ text = ""
86
+ for para in doc.paragraphs:
87
+ text += para.text
88
+ return text
89
+
90
+ # Giao diện Gradio
91
+ def interface():
92
+ with gr.Blocks() as app:
93
+ gr.Markdown("# Ứng dụng Tạo Nội dung và Video")
94
+
95
+ with gr.Tab("Tạo Nội dung"):
96
+ prompt = gr.Textbox(label="Nhập yêu cầu nội dung")
97
+ file_upload = gr.File(label="Tải lên file kèm theo", type="filepath")
98
+
99
+ # Sử dụng gr.Radio thay gr.CheckboxGroup
100
+ content_type = gr.Radio(label="Chọn loại nội dung",
101
+ choices=CONTENT_TYPES,
102
+ value=None) # Giá trị mặc định là không có gì được chọn
103
+
104
+ content_button = gr.Button("Tạo Nội dung")
105
+ content_output = gr.Textbox(label="Nội dung tạo ra", interactive=True)
106
+ confirm_button = gr.Button("Xác nhận nội dung")
107
+ download_docx = gr.File(label="Tải xuống file DOCX", interactive=False)
108
+ download_audio = gr.File(label="Tải xuống file âm thanh",
109
+ interactive=False)
110
+ status_message = gr.Label(label="Trạng thái")
111
+
112
+ def generate_content(prompt, file, content_type):
113
+ try:
114
+ status = "Đang xử lý..."
115
+ if file and os.path.exists(file):
116
+ mime_type, _ = mimetypes.guess_type(file)
117
+ if mime_type == "application/pdf":
118
+ file_content = process_pdf(file)
119
+ prompt = f"{prompt}\n\nDưới đây là nội dung của file tài liệu:\n\n{file_content}"
120
+ elif mime_type in (
121
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
122
+ "application/msword"):
123
+ file_content = process_docx(file)
124
+ prompt = f"{prompt}\n\nDưới đây là nội dung của file tài liệu:\n\n{file_content}"
125
+ else:
126
+ raise ValueError("Định dạng file không được hỗ trợ.")
127
+
128
+ if not content_type:
129
+ raise ValueError("Vui lòng chọn một loại nội dung")
130
+
131
+ script_content = create_content(prompt, content_type, "Tiếng Việt")
132
+ docx_path = "script.docx"
133
+ create_docx(script_content, docx_path)
134
+
135
+ status = "Đã tạo nội dung thành công!"
136
+ return script_content, docx_path, status
137
+ except Exception as e:
138
+ status = f"Đã xảy ra lỗi: {str(e)}"
139
+ return "", None, status
140
+
141
+ async def confirm_content(content):
142
+ docx_path = "script.docx"
143
+ create_docx(content, docx_path)
144
+
145
+ audio_path = await async_text_to_speech(content, "alloy", "Tiếng Việt")
146
+ return docx_path, audio_path, "Nội dung đã được xác nhận và âm thanh đã được tạo!"
147
+
148
+ content_button.click(generate_content,
149
+ inputs=[prompt, file_upload, content_type],
150
+ outputs=[content_output, download_docx, status_message])
151
+
152
+ confirm_button.click(lambda x: asyncio.run(confirm_content(x)),
153
+ inputs=[content_output],
154
+ outputs=[download_docx, download_audio, status_message])
155
+
156
+ with gr.Tab("Tạo Âm thanh"):
157
+ text_input = gr.Textbox(label="Nhập văn bản để chuyển đổi")
158
+ voice_select = gr.Dropdown(label="Chọn giọng đọc",
159
+ choices=VOICES) # Dropdown cho voice_select
160
+ audio_button = gr.Button("Tạo Âm thanh")
161
+ audio_output = gr.Audio(label="Âm thanh tạo ra")
162
+ download_audio = gr.File(label="Tải xuống file âm thanh",
163
+ interactive=False)
164
+
165
+ def text_to_speech_func(text, voice):
166
+ audio_path = text_to_speech(text, voice, "Tiếng Việt")
167
+ return audio_path, audio_path
168
+
169
+ audio_button.click(text_to_speech_func,
170
+ inputs=[text_input, voice_select],
171
+ outputs=[audio_output, download_audio])
172
+
173
+ with gr.Tab