Komal-patra's picture
update app.py
2e11734 verified
raw
history blame
4.46 kB
import gradio as gr
from langchain.chat_models import ChatOpenAI
from langchain.prompts import PromptTemplate
from langchain.chains.llm import LLMChain
from openai import OpenAI
import os
import requests
from PIL import Image as PILImage
from io import BytesIO
# Initialize the OpenAI API key
openai_api_key = os.environ['OPENAI_API_KEY']
# Initialize the OpenAI client
client = OpenAI(api_key=openai_api_key)
# Initialize the ChatOpenAI model
openai_llm = ChatOpenAI()
# Define the prompt template
prompt_template = PromptTemplate.from_template(
"""Imagine '{genre}' Album Cover and provide the detailed prompt for the Following album/song/lyrics: '{lyrics}' to create the realistic imaginery graphic for the album/music chorus by understanding and mimicing the emotional depth with the emotional tone of '{emotion}' .
Please ensure that the genre of the lyrics matches the provided genre parameter: 'Rock' for powerful guitar riffs, rebellious energy, and raw emotion; 'Pop' for catchy hooks, vibrant colors, and trendy aesthetics; 'Metal' for dark, intense imagery with heavy and aggressive tones; 'Folk' for earthy, acoustic elements with natural and rustic visuals; '80s' for retro-futuristic vibes, neon colors, and nostalgic references; 'Jazz' for smooth, elegant, and sophisticated visuals with a touch of improvisation; 'K-pop' for sleek, modern, and colorful designs with a polished, high-energy look; and 'Country' for rustic, heartfelt, and down-to-earth imagery often set in rural or natural environments.
For emotions, match the tone: 'Heartbreak' for visuals that convey loss, sadness, or longing; 'Fantasy' for dreamy, otherworldly, or surreal visuals; and 'Dark' for ominous, mysterious, or haunting imagery.
Consider the age and gender of the subject(s) in the lyrics to ensure the visuals align with their emotional experience, whether depicting a young woman in the throes of first love, an older man reflecting on past sorrows, or a child lost in a fantasy world.
The visual style should be photo-realistic, 8K resolution, hyper-detailed, and cinematic. Include elements such as high-contrast lighting, intricate detail, and realistic textures. Depending on the emotion, use glamour photography for 'Fantasy', stark contrasts for 'Dark', and soft, muted tones for 'Heartbreak'. The image should also reflect a high-fashion or art-inspired aesthetic, with influences from award-winning photography styles, cinematic lighting, and advanced rendering techniques to create a masterpiece that is both visually stunning and emotionally evocative.
If there is a person, do not show their faces.
"""
)
# Define the lyrics response chain
lyrics_response_chain = LLMChain(llm=openai_llm, prompt=prompt_template, verbose=True)
# Create a directory for saving images if it doesn't exist
os.makedirs("generated_images", exist_ok=True)
# Function to generate and save image based on lyrics, genre, and emotion
def generate_image(lyrics, genre, emotion):
try:
formatted_prompt = prompt_template.format(lyrics=lyrics, genre=genre, emotion=emotion)
response = lyrics_response_chain.run({'lyrics': lyrics, 'genre': genre, 'emotion': emotion})
# Generate the image using DALL-E 3
image_response = client.images.generate(
model="dall-e-3",
prompt=response,
size="1024x1024",
quality="hd",
n=1,
)
image_url = image_response.data[0].url
# Save the image locally
response = requests.get(image_url)
image = PILImage.open(BytesIO(response.content))
file_path = os.path.join("generated_images", "album_cover.png")
image.save(file_path)
return image_url
except Exception as e:
print(f"An error occurred: {e}")
return None
# Create Gradio interface
def gradio_interface():
lyrics_input = gr.Textbox(label="Lyrics", placeholder="Enter the song lyrics here...")
genre_input = gr.Dropdown(label="Genre", choices=['Rock', 'Pop', 'Metal', 'Folk', '80s', 'Jazz', 'K-pop', 'Country'])
emotion_input = gr.Dropdown(label="Emotion", choices=['Heartbreak', 'Fantasy', 'Dark'])
output_image = gr.Image(label="Generated Album Cover")
gr.Interface(fn=generate_image,
inputs=[lyrics_input, genre_input, emotion_input],
outputs=output_image,
title="Lyrics Canvas").launch()
# Run the Gradio interface
gradio_interface()