File size: 5,449 Bytes
1e06115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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

# Cấu hình API keys (di chuyển sang config.py)
# GROQ_API_KEY = os.environ.get("GROQ_API_KEY")
# OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")

# Danh sách giọng đọc
VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"]

# Danh sách ngôn ngữ (chưa được sử dụng trong mã)
LANGUAGES = ["Tiếng Anh", "Tiếng Việt", "Tiếng Hindi"]

# ... (CONTENT_TYPES, CONTENT_TYPE_INSTRUCTIONS) 
# Danh sách loại nội dung và hướng dẫn mặc định cho từng loại
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

# Giao diện Gradio
def interface():
    with gr.Blocks() as app:
        # ... (Các tab khác)

        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)  # Dropdown cho voice_select
            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])

        # ... (Các tab khác)

    return app

# Khởi chạy ứng dụng
if __name__ == "__main__":
    app = interface()
    app.launch()