AIXDesigns's picture
Update app.py
5b2bd22 verified
from transformers import pipeline
import gradio as gr
# Initialize models suitable for free tier
try:
# Try to load the primary model
generator = pipeline('text-generation', model='distilgpt2')
# Keep a backup model option ready
backup_model_name = 'gpt2'
except Exception as e:
print(f"Error loading primary model: {e}")
# Fallback to an even smaller model if needed
generator = pipeline('text-generation', model='gpt2')
backup_model_name = None
def generate_lyrics(theme, genre, rhyme_scheme="AABB", max_length=150):
"""Generate song lyrics based on input parameters"""
# A more structured prompt to guide the model towards a lyrical format
prompt = f"""Task: Write lyrics for a {genre} song.
Theme: {theme}
Rhyme: {rhyme_scheme}
Style: Poetic, emotional, with verses and a chorus.
[Verse 1]"""
try:
# Increase temperature for more creativity and reduce repetition
result = generator(prompt,
max_length=max_length,
num_return_sequences=1,
temperature=0.9, # Increased from 0.7
top_p=0.92, # Slightly increased
repetition_penalty=1.2) # Added to reduce repetition
# Extract the generated text
lyrics = result[0]['generated_text']
# Check if we got repetitive content
if lyrics.count("[Verse]") > 3 or lyrics.count("Start with:") > 1:
raise ValueError("Repetitive output detected")
except Exception as e:
print(f"Error with primary generation: {e}")
# Try with a simpler prompt
simple_prompt = f"A {genre} song about {theme}:\n\n[Verse 1]\n"
try:
# Try with different parameters
result = generator(simple_prompt,
max_length=max_length,
num_return_sequences=1,
temperature=1.0,
top_p=0.95,
repetition_penalty=1.5)
lyrics = result[0]['generated_text']
except Exception as e2:
print(f"Error with fallback generation: {e2}")
return f"Sorry, I couldn't generate lyrics at this time. Please try again with a different theme or genre."
# Better handling of output formatting
# Find the first occurrence of [Verse] and keep everything after it
verse_index = lyrics.find("[Verse]")
if verse_index != -1:
# Keep everything from [Verse] onwards
formatted_lyrics = lyrics[verse_index:].strip()
else:
# If [Verse] not found, try to find the actual content
lines = lyrics.split("\n")
# Skip empty lines and prompt-related lines
content_lines = []
skip_keywords = ["Write a", "Start with:", "rhyme scheme", "using the", "Task:", "Theme:", "Rhyme:", "Style:", "Lyrics:"]
for line in lines:
# Skip empty lines and lines containing prompt keywords
if not line.strip() or any(keyword in line for keyword in skip_keywords):
continue
content_lines.append(line)
formatted_lyrics = "\n".join(content_lines).strip()
# If we couldn't extract anything meaningful, use a generic message
if not formatted_lyrics or len(formatted_lyrics.split()) < 5:
return "I couldn't generate good lyrics with this theme. Please try a different theme or genre."
# Check for repetitive content
lines = formatted_lyrics.split("\n")
unique_lines = set(line.strip() for line in lines if line.strip())
# If we have very few unique lines compared to total lines, it's repetitive
if len(lines) > 5 and len(unique_lines) < len(lines) / 2:
return "The model generated repetitive content. Please try again with a different theme or genre."
return formatted_lyrics
# Custom CSS for better appearance
css = """
.container {
max-width: 900px;
margin: auto;
padding-top: 1.5rem;
}
.title {
text-align: center;
color: #7c3aed;
margin-bottom: 1rem;
}
.subtitle {
text-align: center;
color: #6b7280;
margin-bottom: 2rem;
}
.generate-btn {
background-color: #7c3aed !important;
}
.footer {
text-align: center;
margin-top: 2rem;
color: #6b7280;
font-size: 0.875rem;
}
"""
# Example themes for the interface
examples = [
["lost in the forest", "folk", "AABB", 150],
["falling in love", "pop", "ABAB", 150],
["overcoming challenges", "rock", "AABB", 180],
["city life", "rap", "ABAB", 200],
]
# Create Gradio interface with a custom theme
with gr.Blocks(css=css, theme="soft") as demo:
with gr.Column(elem_classes="container"):
gr.Markdown("# 🎵 AI Song Lyric Generator", elem_classes="title")
gr.Markdown("Create unique song lyrics with AI assistance", elem_classes="subtitle")
with gr.Row():
with gr.Column():
theme_input = gr.Textbox(
label="Theme or Topic",
placeholder="Enter a theme (e.g., lost in the forest)",
info="What should your song be about?"
)
genre_input = gr.Dropdown(
["pop", "rock", "folk", "rap"],
label="Music Genre",
value="pop",
info="Select the musical style"
)
rhyme_input = gr.Dropdown(
["AABB", "ABAB"],
label="Rhyme Scheme",
value="AABB",
info="AABB: consecutive lines rhyme, ABAB: alternating lines rhyme"
)
length_slider = gr.Slider(
50, 200, value=150,
label="Maximum Length",
info="Longer text = more content but may be less coherent"
)
generate_btn = gr.Button("✨ Generate Lyrics", elem_classes="generate-btn")
with gr.Column():
output = gr.Textbox(
label="Generated Lyrics",
lines=12,
show_copy_button=True
)
gr.Examples(
examples=examples,
inputs=[theme_input, genre_input, rhyme_input, length_slider],
outputs=output,
fn=generate_lyrics,
cache_examples=True,
)
gr.Markdown(
"""
### How to use
1. Enter a theme or topic for your song
2. Select a music genre
3. Choose a rhyme scheme
4. Adjust the length as needed
5. Click "Generate Lyrics" and enjoy your AI-created song!
---
*Note: This app uses a lightweight AI model (DistilGPT-2) optimized for Hugging Face Spaces.*
""",
elem_classes="footer"
)
generate_btn.click(
generate_lyrics,
inputs=[theme_input, genre_input, rhyme_input, length_slider],
outputs=output
)
# Launch the app
demo.launch()