File size: 6,051 Bytes
1e06115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b6fccee
1e06115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# 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):
    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...
    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