import os import io import streamlit as st from groq import Groq # Set up Groq client using the environment variable for API key. client = Groq(api_key=os.environ.get("GROQ_API_KEY")) # Define the speaker options and their descriptions. speaker_options = { "Liam": "A male voice", "Dorothy": "A female voice", "Josh": "A male voice", "Arnold": "A male voice", "Matilda": "A female voice", "Brian": "A narration voice", "Alice": "A news voice", "Bill": "A narration voice", "Callum": "A character voice", "Charlie": "A conversational voice", "Charlotte": "A character voice", "Chris": "A conversational voice", "Daniel": "A news voice", "Eric": "A voice", "George": "A narration voice", "Jessica": "A voice", "Laura": "A voice", "Lily": "A narration voice", "Sarah": "A news voice", "Will": "A voice" } # Build the Streamlit UI. st.title("Conversation Script Generator Using Groq API") # Layout two columns for speaker selection. col1, col2 = st.columns(2) with col1: left_speaker = st.selectbox( "Left Speaker", options=list(speaker_options.keys()), format_func=lambda x: f"{x}: {speaker_options[x]}" ) with col2: right_speaker = st.selectbox( "Right Speaker", options=list(speaker_options.keys()), format_func=lambda x: f"{x}: {speaker_options[x]}" ) # Text area for overall conversation theme. theme = st.text_area("Overall Theme of the Conversation", height=100) # Optional additional details. additional_details = st.text_area("Additional Conversation Details (Optional)", height=100) # When the user clicks the button, build the prompt and make the API call. if st.button("Generate Conversation"): # Build the prompt message for Groq API. prompt = ( f""" Objective: Generate a highly engaging and comedic iMessage chat script formatted for video generation. The script should use distinct left and right voices, follow a structured format, and maintain a brain rot hook to keep the audience engaged. The story should be wacky, over-the-top, and meme-inspired while staying coherent. 1. FORMAT STRUCTURE (Regex-like Guide) 1.1 Contact Name (Title) At the beginning of the script, define the contact name (the name that appears at the top of the iMessage screen). php-template Copy Edit : Example: ruby Copy Edit Amir Uber Eats๐Ÿ”๐Ÿšš๐Ÿ—ฟ:Amir Uber Eats๐Ÿ”๐Ÿšš๐Ÿ—ฟ 1.2 Dialogue Format Every dialogue line should follow this structure: php-template Copy Edit : > [] โ†’ Either Left: or Right: Left: represents the left speaker (User). Right: represents the right speaker (Other character). โ†’ The voice actor name (which should remain consistent for left and right). > โ†’ A separator between the speaker name and their dialogue. โ†’ The actual speech text, containing humor, slang, or randomness. [] (Optional) โ†’ Emotional or sound-based cues (e.g., [shocked], [fart2], [get_out]). Example: vbnet Copy Edit Left: Chinmay> Sir this is your Uber Eats order [shocked] Right: Alex> BRO WHY IS THERE A RAT IN MY BURGER?!! [shocked] ๐Ÿ€๐Ÿ” Left: Chinmay> Extra protein sir ๐Ÿ˜Ž 1.3 Bracketed Cues & Sound Effects Use brackets [] to include sound effects, reactions, or video cues. Common Examples: [shocked] โ†’ Indicates the character is shocked. [get_out] โ†’ Indicates the end of the conversation or dramatic exit. [fart2] โ†’ Represents a comedic fart sound. [suspense_music] โ†’ A cue for background music. [explosion] โ†’ A big moment or reveal. [slow_zoom] โ†’ A slow zoom-in effect for emphasis. Example: css Copy Edit Right: Alex> WHY DID MY HOUSE JUST EXPLODE?!!! [explosion] ๐Ÿ’€๐Ÿ’€๐Ÿ’€ 1.4 Image Placeholders Images should be inserted where necessary using: php-template Copy Edit : img: โ†’ Describe the image clearly for easy attachment later. Example: vbnet Copy Edit Left: img:burnt_food_delivery Right: Alex> BRO WHY IS MY PIZZA LOOKING LIKE CHARCOAL?!! [shocked] 1.5 Special Sections (Cantina App / Roast Bot) Incorporate Roast Bot mechanics where the character opens an app mid-conversation to ask for a roast. Format: vbnet Copy Edit Cantina: Roast bot:Roast bot pfp == Let me open the cantina app to talk to Roast bot Then, the roast bot provides a response. Example: vbnet Copy Edit Cantina: Roast bot:Roast bot pfp == Alex> Let me open the cantina app to talk to Roast bot Right: Alex> This guy just delivered my food and scammed me ๐Ÿ˜ก Left: Antoni> Tell him this: "Sir, you pay less than a dollar tip and expect a five-star service?" Right: Alex> YOU DID ME DIRTY BRO ๐Ÿ˜ญ๐Ÿ˜ญ 2. STORY GENERATION GUIDELINES 2.1 Catchy โ€œBrain Rotโ€ Hook The first few lines must be highly engaging, over-the-top, and create curiosity. Examples: "BRO I JUST ORDERED UBER EATS AND THIS GUY SHOWED UP IN A SPACESHIP???" ๐Ÿš€๐Ÿ‘€ "WHY DID MY DAD JUST SAY HE WANTS TO PLAY GTA WITH ME???" ๐ŸŽฎ๐Ÿ’€ "SIR WHY IS MY LAWYER ALSO MY UBER DRIVER?!" ๐Ÿ‘จโ€โš–๏ธ๐Ÿš—๐Ÿ’จ This hook should create an instant โ€œWTF?!โ€ reaction and force the reader to keep watching. 2.2 Story Progression (Random but Coherent) The storyline must escalate in craziness but still have a logical flow. Use sudden twists and reveals to keep the audience engaged. End with a memorable punchline, twist, or dramatic exit. Example Storyline Flow: Crazy Hook: โ€œBRO WHY IS MY PIZZA DELIVERY GUY ALSO MY LAWYER???โ€ ๐Ÿ•๐Ÿ‘จโ€โš–๏ธ Escalation: The lawyer admits he took the case without reading it. Insane Event: The customer confesses to stealing a fighter jet. Twist: Lawyer says, โ€œOh I do that every day, sir.โ€ ๐Ÿ˜Ž Final Joke/Twist: The lawyer wins the case in 5 seconds and gets a $2 tip. 2.3 Humor & Slang Use casual meme-inspired language (brain rot humor). Include exaggerated reactions (e.g., "BROOO ๐Ÿ’€๐Ÿ’€๐Ÿ’€", "NO WAY", "HELP ME"). Use text formatting like uppercase for dramatic lines. Example: vbnet Copy Edit Right: Alex> BRO WTF IS THIS BURGER?! [shocked] Left: Chinmay> Sir, it's called a **mystery meat special** ๐Ÿ˜Ž Right: Alex> MYSTERY??? FROM WHAT ANIMAL?!?! Left: Chinmay> ๐Ÿ˜ถ 3. PARAMETERS & CUSTOMIZATION OPTIONS When prompting the AI, specify the following: Left and Right Voice Actors โ†’ Who will play each side (e.g., AI voice "John" for left, "Jake" for right). Story Theme โ†’ Choose a base premise (e.g., "Uber Eats Disaster", "Courtroom Chaos", "Dad Discovers GTA"). Left Actor={left_speaker} Right Actor={right_speaker} Theme={theme} """ ) if additional_details.strip(): prompt += f"Additional Details: {additional_details}\n" # Display the generated prompt for debugging. st.write("### Generated Prompt") st.code(prompt) # Prepare the message payload for the Groq API call. messages = [ { "role": "user", "content": prompt, } ] # Model selection: adjust as needed. model = "llama-3.3-70b-versatile" try: # Make the chat completion call using Groq. chat_completion = client.chat.completions.create( messages=messages, model=model, ) # Extract the generated conversation from the API response. result_text = chat_completion.choices[0].message.content if not result_text: st.error("The API call did not return any content.") else: st.success("Conversation generated successfully!") # Display the result inside a text area. st.write("### Generated Conversation Script") st.text_area("", result_text, height=300) # Create a downloadable TXT file. txt_bytes = result_text.encode("utf-8") txt_io = io.BytesIO(txt_bytes) st.download_button( label="Download Script as TXT", data=txt_io, file_name="conversation_script.txt", mime="text/plain" ) except Exception as e: st.error(f"An error occurred while calling the API: {e}")