Update app.py
Browse files
app.py
CHANGED
@@ -9,10 +9,14 @@ import gradio as gr
|
|
9 |
from docx import Document
|
10 |
from content_generation import create_content, CONTENT_TYPES
|
11 |
from openai import OpenAI
|
|
|
12 |
|
13 |
# Khởi tạo client OpenAI với API key từ biến môi trường
|
14 |
client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY'))
|
15 |
|
|
|
|
|
|
|
16 |
def create_docx(content, output_path):
|
17 |
"""
|
18 |
Tạo file docx từ nội dung.
|
@@ -41,6 +45,24 @@ def process_docx(file_path):
|
|
41 |
text += para.text
|
42 |
return text
|
43 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
def interface():
|
45 |
with gr.Blocks() as app:
|
46 |
gr.Markdown("# Ứng dụng Tạo Nội dung và Video")
|
@@ -53,6 +75,8 @@ def interface():
|
|
53 |
content_type = gr.Radio(label="Chọn loại nội dung",
|
54 |
choices=CONTENT_TYPES,
|
55 |
value=None) # Giá trị mặc định là không có gì được chọn
|
|
|
|
|
56 |
content_button = gr.Button("Tạo Nội dung")
|
57 |
|
58 |
with gr.Column():
|
@@ -60,6 +84,8 @@ def interface():
|
|
60 |
confirm_button = gr.Button("Xác nhận nội dung")
|
61 |
download_docx = gr.File(label="Tải xuống file DOCX", interactive=False)
|
62 |
status_message = gr.Label(label="Trạng thái")
|
|
|
|
|
63 |
|
64 |
def generate_content(prompt, file, content_type):
|
65 |
try:
|
@@ -94,13 +120,22 @@ def interface():
|
|
94 |
docx_path = "script.docx"
|
95 |
create_docx(content, docx_path)
|
96 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
content_button.click(generate_content,
|
98 |
inputs=[prompt, file_upload, content_type],
|
99 |
outputs=[content_output, download_docx, status_message])
|
100 |
|
101 |
-
|
102 |
-
|
|
|
103 |
|
|
|
104 |
|
105 |
# Khởi chạy ứng dụng
|
106 |
if __name__ == "__main__":
|
|
|
9 |
from docx import Document
|
10 |
from content_generation import create_content, CONTENT_TYPES
|
11 |
from openai import OpenAI
|
12 |
+
from gradio_client import Client, handle_file # Thêm thư viện để gọi API
|
13 |
|
14 |
# Khởi tạo client OpenAI với API key từ biến môi trường
|
15 |
client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY'))
|
16 |
|
17 |
+
# Đường dẫn đến thư mục chứa các file âm thanh
|
18 |
+
VOICES_DIR = "voices"
|
19 |
+
|
20 |
def create_docx(content, output_path):
|
21 |
"""
|
22 |
Tạo file docx từ nội dung.
|
|
|
45 |
text += para.text
|
46 |
return text
|
47 |
|
48 |
+
def text_to_speech(content, voice_file):
|
49 |
+
"""
|
50 |
+
Chuyển đổi nội dung thành giọng nói bằng API.
|
51 |
+
"""
|
52 |
+
try:
|
53 |
+
client = Client("thinhlpg/vixtts-demo")
|
54 |
+
result = client.predict(
|
55 |
+
prompt=content,
|
56 |
+
language="vi",
|
57 |
+
audio_file_pth=handle_file(voice_file), # Sử dụng file âm thanh được chọn
|
58 |
+
normalize_text=True,
|
59 |
+
api_name="/predict"
|
60 |
+
)
|
61 |
+
# Chỉ lấy phần tử đầu tiên (filepath) từ kết quả trả về
|
62 |
+
return result[0]
|
63 |
+
except Exception as e:
|
64 |
+
return f"Lỗi khi chuyển đổi văn bản thành giọng nói: {str(e)}"
|
65 |
+
|
66 |
def interface():
|
67 |
with gr.Blocks() as app:
|
68 |
gr.Markdown("# Ứng dụng Tạo Nội dung và Video")
|
|
|
75 |
content_type = gr.Radio(label="Chọn loại nội dung",
|
76 |
choices=CONTENT_TYPES,
|
77 |
value=None) # Giá trị mặc định là không có gì được chọn
|
78 |
+
voice_files = [os.path.join(VOICES_DIR, f) for f in os.listdir(VOICES_DIR) if f.endswith(".wav")]
|
79 |
+
voice_selector = gr.Dropdown(label="Chọn giọng đọc", choices=voice_files) # Dropdown để chọn file âm thanh
|
80 |
content_button = gr.Button("Tạo Nội dung")
|
81 |
|
82 |
with gr.Column():
|
|
|
84 |
confirm_button = gr.Button("Xác nhận nội dung")
|
85 |
download_docx = gr.File(label="Tải xuống file DOCX", interactive=False)
|
86 |
status_message = gr.Label(label="Trạng thái")
|
87 |
+
convert_to_speech_button = gr.Button("Chuyển đổi thành giọng nói")
|
88 |
+
audio_output = gr.Audio(label="Synthesised Audio", autoplay=True) # Phát tự động
|
89 |
|
90 |
def generate_content(prompt, file, content_type):
|
91 |
try:
|
|
|
120 |
docx_path = "script.docx"
|
121 |
create_docx(content, docx_path)
|
122 |
|
123 |
+
def convert_content_to_speech(content, voice_file):
|
124 |
+
audio_path = text_to_speech(content, voice_file)
|
125 |
+
if os.path.exists(audio_path):
|
126 |
+
return audio_path # Chỉ trả về filepath để phát audio
|
127 |
+
else:
|
128 |
+
return None
|
129 |
+
|
130 |
content_button.click(generate_content,
|
131 |
inputs=[prompt, file_upload, content_type],
|
132 |
outputs=[content_output, download_docx, status_message])
|
133 |
|
134 |
+
convert_to_speech_button.click(convert_content_to_speech,
|
135 |
+
inputs=[content_output, voice_selector],
|
136 |
+
outputs=[audio_output])
|
137 |
|
138 |
+
return app
|
139 |
|
140 |
# Khởi chạy ứng dụng
|
141 |
if __name__ == "__main__":
|