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__":
|