# 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": """ Viết một đoạn hội thoại podcast dài và chi tiết, hấp dẫn và nhiều thông tin, dựa trên các điểm chính và ý tưởng sáng tạo mà bạn đã nảy ra trong buổi động não. Hãy làm cho cuộc trò chuyện trở nên thú vị và cuốn hút, đồng thời bao gồm các bối cảnh và giải thích cần thiết để đảm bảo nội dung dễ hiểu cho khán giả đại chúng. Tone giọng: Giữ giọng điệu tự nhiên, như một cuộc trò chuyện giữa bạn bè, với sự tương tác linh hoạt giữa người dẫn chương trình và khách mời. Sử dụng giọng văn đàm thoại, tránh sự cứng nhắc hoặc quá hàn lâm. Tạo cảm giác như bạn đang nói chuyện trực tiếp với khán giả, giúp họ dễ dàng theo dõi. Bối cảnh và giải thích: Khi đề cập đến các khái niệm phức tạp, hãy luôn đưa ra những ví dụ thực tế hoặc giải thích đơn giản để làm rõ vấn đề. Đảm bảo rằng tất cả các thuật ngữ và từ vựng chuyên ngành được giải thích một cách dễ hiểu để không tạo rào cản cho người nghe. Cấu trúc: Bắt đầu bằng một câu hỏi hoặc một câu chuyện mở màn để thu hút sự chú ý ngay từ đầu, khơi gợi tò mò của người nghe. Dẫn dắt cuộc trò chuyện qua các chủ đề chính, triển khai các luận điểm thông qua các tình huống hoặc ví dụ thực tế, từ đó tạo sự liên kết giữa các phần của podcast. Đan xen các yếu tố giải trí, những câu chuyện hài hước hoặc những bình luận cá nhân thú vị từ người dẫn chương trình hoặc khách mời để giữ nhịp độ tươi mới, không bị đơn điệu. Tương tác tự nhiên: Khuyến khích người dẫn chương trình và khách mời đặt câu hỏi cho nhau, xây dựng cuộc trò chuyện một cách mượt mà, không ngắt quãng hoặc gượng ép. Đừng quá nghiêm túc hoặc bám vào một kịch bản quá chặt chẽ, hãy để cuộc trò chuyện có không gian cho sự ngẫu nhiên và phản ứng tự nhiên. Không sử dụng tên bịa đặt: Tránh việc sử dụng tên giả cho người dẫn chương trình và khách mời. Hãy tập trung vào nội dung và sự tương tác giữa họ thay vì phải tạo ra các nhân vật giả. Không chừa chỗ trống trong ngoặc vuông: Nội dung được tạo ra sẽ không bao gồm bất kỳ chỗ trống nào như [Người dẫn chương trình] hoặc [Khách mời]. Kịch bản cần được viết liên tục, rõ ràng để dễ dàng chuyển đổi thành âm thanh. Độ dài và chi tiết: Mục tiêu là tạo ra một tập podcast dài nhất có thể, khoảng 20.000 từ, nhưng vẫn giữ được sự lôi cuốn và duy trì nhịp độ tự nhiên của cuộc trò chuyện.Đảm bảo rằng podcast không chỉ kéo dài mà còn phong phú về nội dung, kết hợp giữa thông tin và giải trí, giữ cho khán giả luôn cảm thấy bị cuốn hút. Kết thúc tự nhiên: Ở cuối đoạn hội thoại, để người dẫn chương trình và khách mời tóm tắt lại một cách tự nhiên các hiểu biết sâu sắc và bài học rút ra từ cuộc thảo luận của họ. Điều này nên diễn ra một cách mượt mà từ cuộc trò chuyện, nhắc lại các điểm chính mà không khiến nó trở nên quá rõ ràng hoặc như một bản tóm tắt bắt buộc. Mục tiêu là củng cố lại những thông tin chính theo cách tự nhiên và thoải mái, tạo cảm giác như một cuộc trò chuyện gần gũi. """, "giới thiệu": """ Tone giọng: Chuyên nghiệp, ngắn gọn, lôi cuốn nhưng chính xác. Cấu trúc: Bắt đầu kịch bản của bạn bằng cách nêu rằng đây là bài đánh giá có tham chiếu đến tiêu đề hoặc các tiêu đề phụ 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 bản tóm tắt ngắn gọn về nội dung sẽ đề cập. Bao gồm các định nghĩa và thuật ngữ rõ ràng, cũng như ví dụ về tất cả các vấn đề chính. Không bao gồm bất kỳ chỗ giữ chỗ trong ngoặc nào như [Chủ nhà] hoặc [Khách]. Thiết kế nội dung đầu ra của bạn để có thể đọc to -- nội dung sẽ được chuyển đổi trực tiếp thành âm thanh. Chỉ có một người nói, đó là bạn. Giữ chủ đề và duy trì mạch lạc. Tóm tắt một cách tự nhiên những hiểu biết sâu sắc và thông tin chính từ bản tóm tắt. Phần này phải 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 theo cách thông thường, đàm thoại. Bản tóm tắt nên có khoảng 1024 từ. """, "triết lý sống": """ Tone giọng: Sâu sắc, truyền cảm hứng, mang tính triết lý và chiêm nghiệm. Cấu trúc: - Mở đầu bằng một câu hỏi hoặc ẩn dụ sâu sắc về cuộc sống, đánh thức sự tò mò và mời gọi người nghe suy ngẫm. - Phát triển các luận điểm theo cách gắn kết, thông qua việc sử dụng những ví dụ từ đời thực, câu chuyện cá nhân hoặc những triết lý cổ điển. - Xen lẫn các câu nói triết lý, ngôn từ truyền cảm hứng giúp người nghe kết nối cảm xúc. - Kết thúc bằng một thông điệp mạnh mẽ, gợi mở suy ngẫm và khuyến khích người nghe nhìn nhận lại bản thân và cuộc sống. Mục tiêu: Truyền đạt những bài học sâu sắc, giúp người nghe chiêm nghiệm và tìm thấy ý nghĩa mới trong cuộc sống. """, "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. 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} ] ) # 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