|
import asyncio
|
|
import mimetypes
|
|
import os
|
|
|
|
import gradio as gr
|
|
|
|
from audio_processing import async_text_to_speech, text_to_speech
|
|
from content_generation import create_content, CONTENT_TYPES
|
|
from video_processing import create_video_func
|
|
|
|
|
|
|
|
|
|
|
|
|
|
VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"]
|
|
|
|
|
|
LANGUAGES = ["Tiếng Anh", "Tiếng Việt", "Tiếng Hindi"]
|
|
|
|
|
|
|
|
CONTENT_TYPES = ["podcast", "giới thiệu", "triết lý sống", "Phổ biến kiến thức thống kê"]
|
|
CONTENT_TYPE_INSTRUCTIONS = {
|
|
"podcast": """
|
|
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ủ đề.
|
|
Cấu trúc:
|
|
- Bắt đầu bằng một câu hỏi kích thích tư duy hoặc một câu chuyện mở màn gây tò mò.
|
|
- 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.
|
|
- Xây dựng các phần chuyển tiếp mượt mà giữa các ý.
|
|
- 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ả.
|
|
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ủ đề.
|
|
""",
|
|
"giới thiệu": """
|
|
Tone giọng: Chuyên nghiệp, gãy gọn nhưng vẫn có sự truyền cảm.
|
|
Cấu trúc:
|
|
- Bắt đầu với một câu khẳng định mạnh mẽ về đối tượng được giới thiệu.
|
|
- 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.
|
|
- 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.
|
|
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.
|
|
""",
|
|
"triết lý sống": """
|
|
Tone giọng: Sâu sắc, truyền cảm hứng, mang tính chiêm nghiệm.
|
|
Cấu trúc:
|
|
- Bắt đầu bằng một câu hỏi sâu sắc hoặc ẩn dụ về cuộc sống.
|
|
- 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ý.
|
|
- 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.
|
|
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.
|
|
""",
|
|
"Phổ biến kiến thức Thống kê": """
|
|
Tone giọng: Thân thiện, dễ hiểu, và mang tính giáo dục.
|
|
Cấu trúc:
|
|
- 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ú ý.
|
|
- Giải thích các khái niệm thống kê cơ bản một cách đơn giản và dễ hiểu, sử dụng ví dụ thực tế để minh họa.
|
|
- Đưa ra các ứng dụng thực tế của thống kê trong đời sống hàng ngày hoặc trong các lĩnh vực cụ thể.
|
|
- 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 kê vào cuộc sống.
|
|
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.
|
|
"""
|
|
}
|
|
|
|
def create_docx(content, output_path):
|
|
"""
|
|
Tạo file docx từ nội dung.
|
|
"""
|
|
doc = Document()
|
|
doc.add_paragraph(content)
|
|
doc.save(output_path)
|
|
|
|
def process_pdf(file_path):
|
|
"""
|
|
Xử lý file PDF và trích xuất nội dung.
|
|
"""
|
|
doc = fitz.open(file_path)
|
|
text = ""
|
|
for page in doc:
|
|
text += page.get_text()
|
|
return text
|
|
|
|
def process_docx(file_path):
|
|
"""
|
|
Xử lý file DOCX và trích xuất nội dung.
|
|
"""
|
|
doc = Document(file_path)
|
|
text = ""
|
|
for para in doc.paragraphs:
|
|
text += para.text
|
|
return text
|
|
|
|
|
|
def interface():
|
|
with gr.Blocks() as app:
|
|
|
|
|
|
with gr.Tab("Tạo Âm thanh"):
|
|
text_input = gr.Textbox(label="Nhập văn bản để chuyển đổi")
|
|
voice_select = gr.Dropdown(label="Chọn giọng đọc", choices=VOICES)
|
|
audio_button = gr.Button("Tạo Âm thanh")
|
|
audio_output = gr.Audio(label="Âm thanh tạo ra")
|
|
download_audio = gr.File(label="Tải xuống file âm thanh", interactive=False)
|
|
|
|
def text_to_speech_func(text, voice):
|
|
audio_path = text_to_speech(text, voice, "Tiếng Việt")
|
|
return audio_path, audio_path
|
|
|
|
audio_button.click(text_to_speech_func, inputs=[text_input, voice_select], outputs=[audio_output, download_audio])
|
|
|
|
|
|
|
|
return app
|
|
|
|
|
|
if __name__ == "__main__":
|
|
app = interface()
|
|
app.launch() |