|
|
|
from groq import Groq |
|
from openai import OpenAI |
|
import os |
|
|
|
|
|
GROQ_API_KEY = os.environ.get("GROQ_API_KEY") |
|
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY") |
|
|
|
|
|
openai_client = OpenAI(api_key=OPENAI_API_KEY) |
|
|
|
|
|
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 vẫn thể hiện sự chuyên sâu, am hiểu chủ đề. |
|
Cấu trúc: |
|
- Mở đầu bằng một câu hỏi kích thích tư duy hoặc câu chuyện mở màn thu hút. |
|
- Triển khai các luận điểm theo trình tự logic, sử dụng ngôn ngữ mạnh mẽ, ví dụ minh họa hoặc câu nói nổi tiếng. |
|
- Chuyển tiếp mượt mà giữa các ý, tạo sự liền mạch. |
|
- Kết thúc với một thông điệp sâu sắc, để lại ấn tượng và khơi dậy suy ngẫm. |
|
Mục tiêu: Cung cấp kiến thức giá trị, giữ chân thính giả và khuyến khích họ suy nghĩ sâu về chủ đề. |
|
""", |
|
"giới thiệu": """ |
|
Tone giọng: Chuyên nghiệp, ngắn gọn nhưng truyền cảm. |
|
Cấu trúc: |
|
- Mở đầu với một câu khẳng định rõ ràng, mạnh mẽ về đối tượng hoặc sản phẩm. |
|
- Giải thích ngắn gọn về mục tiêu của nội dung, nhấn mạnh tầm quan trọng hoặc sự khác biệt. |
|
- Kết thúc bằng lời kêu gọi hành động, khuyến khích người nghe tìm hiểu thêm hoặc thực hiện bước tiếp theo. |
|
Mục tiêu: Đưa ra thông tin cô đọng và hấp dẫn, lôi cuốn người nghe muốn khám phá sâu hơn. |
|
""", |
|
"triết lý sống": """ |
|
Tone giọng: Truyền cảm hứng, sâu sắc, có tính chiêm nghiệm. |
|
Cấu trúc: |
|
- Bắt đầu bằng một câu hỏi hoặc ẩn dụ kích thích suy ngẫm về cuộc sống. |
|
- Triển khai luận điểm chặt chẽ, kết hợp cảm xúc với ví dụ thực tế hoặc những câu nói triết lý nổi tiếng. |
|
- Kết thúc bằng thông điệp sâu sắc, để lại cho người nghe sự suy ngẫm. |
|
Mục tiêu: Khơi gợi suy nghĩ sâu sắc về cuộc sống và truyền cảm hứng cho người nghe tìm ra giá trị hoặc ý nghĩa trong câu chuyện. |
|
""", |
|
"phổ biến kiến thức thống kê": """ |
|
Mục đích: Trình bày và phổ biến thông tin thống kê chính thống, dựa trên Báo cáo tình hình kinh tế - xã hội Việt Nam, giúp người nghe hiểu và sử dụng hiệu quả các số liệu thống kê. |
|
|
|
Tone giọng: |
|
- Thân thiện, truyền cảm, rõ ràng, dễ hiểu. |
|
- Mang tính phổ biến thông tin, thể hiện sự chính thống. |
|
- Giọng nữ, chuẩn Hà Nội, tạo sự dễ chịu và tiếp cận dễ dàng cho người nghe. |
|
|
|
Thời lượng: Khoảng 7 phút. |
|
|
|
Hình thức thể hiện: |
|
- Giọng đọc kèm hình ảnh của người đọc, xen kẽ với biểu đồ, đồ thị, và bảng số liệu minh họa. |
|
|
|
Cấu trúc: |
|
1. **Mở đầu**: |
|
- Bắt đầu bằng một câu hỏi hoặc tình huống thực tế để thu hút sự chú ý, ví dụ: |
|
"Bạn có biết rằng Báo cáo tình hình kinh tế - xã hội Việt Nam là nguồn thông tin chính thống giúp các cơ quan và chính quyền các cấp đánh giá, dự báo tình hình và hoạch định chiến lược?" |
|
2. **Triển khai nội dung chính**: |
|
- Khái quát các động thái, xu hướng kinh tế - xã hội của Việt Nam dựa trên các số liệu trong báo cáo. |
|
- Chia nhỏ thông tin theo từng lĩnh vực, như: |
|
- (1) Sản xuất nông, lâm nghiệp và thủy sản. |
|
- (2) Sản xuất công nghiệp. |
|
- (3) Tình hình đăng ký doanh nghiệp. |
|
- (4) Đầu tư. |
|
- (5) Thu, chi ngân sách Nhà nước. |
|
- (6) Thương mại, giá cả, vận tải và du lịch. |
|
- (7) Một số tình hình xã hội. |
|
- Minh họa bằng các biểu đồ, đồ thị và bảng số liệu cụ thể. |
|
|
|
3. **Kết thúc**: |
|
- Kết thúc bằng một thông điệp khuyến khích người nghe sử dụng thông tin thống kê, ví dụ: |
|
"Báo cáo tình hình kinh tế - xã hội cung cấp bức tranh tổng thể, giúp bạn đưa ra các quyết định thông minh và hiệu quả hơn." |
|
|
|
Mục tiêu: Giúp người nghe hiểu rõ giá trị của báo cáo thống kê kinh tế - xã hội, cũng như khuyến khích họ sử dụng thông tin chính thống để hỗ trợ quá trình ra quyết định đúng đắn. |
|
""" |
|
} |
|
|
|
def create_content(prompt, content_type, language): |
|
content_type_instructions = CONTENT_TYPE_INSTRUCTIONS.get(content_type, "") |
|
general_instructions = f""" |
|
Hãy nghiên cứu kỹ lưỡng yêu cầu của người dùng để tạo ra một kịch bản sáng tạo và hiệu quả. Sử dụng giọng điệu tự nhiên, trò chuyện và cung cấp bối cảnh hoặc giải thích cần thiết để làm cho nội dung dễ tiếp cận với khán giả. |
|
|
|
Bắt đầu bằng cách giới thiệu chủ đề một cách tự nhiên, dẫn dắt người nghe vào nội dung chính mà không cần phải nói rõ đây là tóm tắt. Nếu văn bản đầu vào không có tiêu đề cụ thể, hãy mở đầu bằng cách khéo léo tóm lược ý chính để thu hút sự chú ý của khán giả. |
|
|
|
Bao gồm các định nghĩa và thuật ngữ rõ ràng cùng với ví dụ minh họa cho tất cả các vấn đề chính được đề cập. |
|
|
|
Không sử dụng bất kỳ placeholder nào trong ngoặc vuông như [Host] hoặc [Guest]. Kịch bản của bạn sẽ được chuyển thành âm thanh, vì vậy hãy thiết kế nó để phù hợp với việc đọc to, giữ nhịp điệu tự nhiên và liền mạch. |
|
|
|
Chỉ có một người nói duy nhất: chính bạn. Giữ đúng chủ đề và đảm bảo mạch câu chuyện hấp dẫn xuyên suốt. |
|
|
|
Kết thúc bằng việc tóm tắt tự nhiên những bài học và hiểu biết chính từ nội dung đã thảo luận. Hãy nhắc lại các điểm chính một cách thoải mái, giống như trong một cuộc trò chuyện thông thường. |
|
|
|
Kịch bản podcast nên có độ dài khoảng 4000 từ, còn kịch bản giới thiệu là 3000 từ, kịch bản triết lý sống là khoảng 1000 từ, kịch bản Phổ biến kiến thức thống kê là 3500 từ. |
|
|
|
Tuân thủ các hướng dẫn cụ thể cho thể loại {content_type}, như được mô tả dưới đây: |
|
{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} |
|
] |
|
) |
|
|
|
|
|
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}" |