GV-a / content_generation.py
TDN-M's picture
Upload 8 files
1e06115 verified
raw
history blame
7.43 kB
# content_generation.py
from groq import Groq
from openai import OpenAI
import os
# Lấy API key từ biến môi trường
GROQ_API_KEY = os.environ.get("GROQ_API_KEY")
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
# Khởi tạo client OpenAI
openai_client = OpenAI(api_key=OPENAI_API_KEY)
# 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_content(prompt, content_type, language):
"""
Tạo nội dung dựa trên prompt, loại nội dung và ngôn ngữ.
"""
content_type_instructions = CONTENT_TYPE_INSTRUCTIONS.get(content_type, "")
general_instructions = f"""
Viết một kịch bản dựa trên các ý chính và ý tưởng sáng tạo từ yêu cầu của người dùng. Sử dụng giọng điệu trò chuyện và bao gồm bất kỳ bối cảnh hoặc giải thích cần thiết nào để làm cho nội dung dễ tiếp cận với khán giả.
Bắt đầu kịch bản bằng cách nêu rõ đây là một bài tóm tắt, tham chiếu đến tiêu đề hoặc đề mục trong văn bản đầu vào. Nếu văn bản đầu vào không có tiêu đề, hãy đưa ra một tóm tắt ngắn gọn về nội dung được đề cập để mở đầu.
Bao gồm các định nghĩa và thuật ngữ rõ ràng, cùng với ví dụ cho tất cả các vấn đề chính.
Không bao gồm bất kỳ placeholder nào trong ngoặc vuông như [Host] hoặc [Guest]. Thiết kế đầu ra của bạn để được đọc to - nó sẽ được chuyển đổi trực tiếp thành âm thanh.
Chỉ có một người nói, bạn. Giữ đúng chủ đề và duy trì một luồng hấp dẫn.
Tóm tắt một cách tự nhiên những hiểu biết và bài học chính từ bài tóm tắt. Điều này nên diễn ra một cách tự nhiên từ cuộc trò chuyện, nhắc lại các điểm chính một cách thân mật, như trong một cuộc trò chuyện.
Bài tóm tắt nên có khoảng 3000 từ.
Hãy tuân theo những hướng dẫn cụ thể sau cho thể loại {content_type}:
{content_type_instructions}
Ngôn ngữ sử dụng: {language}
"""
try:
client = Groq(api_key=GROQ_API_KEY)
chat_completion = client.chat.completions.create(
model="mixtral-8x7b-32768",
messages=[
{"role": "system", "content": general_instructions},
{"role": "user", "content": prompt}
],
temperature=0.7,
max_tokens=8000
)
return chat_completion.choices[0].message.content
except Exception as e:
return f"Lỗi khi tạo nội dung: {str(e)}"
def extract_key_contents(script, num_contents=30):
"""
Trích xuất các ý chính từ script.
"""
try:
response = openai_client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": f"Bạn là một chuyên gia phân tích nội dung. Hãy trích xuất chính xác {num_contents} ý chính quan trọng nhất từ đoạn văn sau, mỗi ý không quá 20 từ."},
{"role": "user", "content": script}
]
)
# In response để kiểm tra
print("Response từ OpenAI:", response)
key_contents = response.choices[0].message.content.split('\n')
return key_contents[:num_contents]
except Exception as e:
print(f"Lỗi khi trích xuất nội dung: {str(e)}")
return []
def generate_image_prompt(content):
"""
Tạo prompt cho hình ảnh từ nội dung.
"""
try:
response = openai_client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are an expert at creating prompts for AI image generation. Create a short, concise prompt in English to visually describe the following content. The content may be in Vietnamese, but your prompt should always be in English."},
{"role": "user", "content": content}
]
)
return response.choices[0].message.content.strip()
except Exception as e:
print(f"Lỗi khi tạo prompt cho hình ảnh: {str(e)}")
return f"A visual representation of: {content}" # Fallback prompt nếu có lỗi