|
import gradio as gr |
|
import json |
|
from gtts import gTTS |
|
import os |
|
import random |
|
|
|
|
|
with open('poem.txt', 'r', encoding='utf-8') as f: |
|
poem_data = f.read() |
|
|
|
with open('explanations.json', 'r', encoding='utf-8') as f: |
|
explanations = json.load(f) |
|
|
|
|
|
stanzas = poem_data.strip().split("Stanza") |
|
stanza_map = {str(i): s.strip() for i, s in enumerate(stanzas[1:], start=1)} |
|
|
|
|
|
def generate_poem(objects): |
|
starters = [ |
|
f"In the world of the {objects[0]}, stories unfold,", |
|
f"The {objects[0]} stands tall and bold.", |
|
f"A {objects[0]} whispers under the sky,", |
|
f"Where the {objects[0]} and {objects[1]} lie." |
|
] |
|
middles = [ |
|
f"The {objects[1]} flows with tales unknown,", |
|
f"Near the {objects[1]}, seeds are sown.", |
|
f"And the {objects[1]} sings a gentle tune,", |
|
f"Under stars and a watching moon." |
|
] |
|
endings = [ |
|
"In quiet places, poems are made,", |
|
"With every breeze, old memories fade.", |
|
"Such beauty lives in things so small,", |
|
"They write their poems after all." |
|
] |
|
return f"{random.choice(starters)}\n{random.choice(middles)}\n{random.choice(endings)}" |
|
|
|
|
|
def handle_input(user_input, poem_topic): |
|
user_input = user_input.lower() |
|
response = "" |
|
|
|
if "read stanza" in user_input: |
|
for i in range(1, 4): |
|
if str(i) in user_input: |
|
response = f"Stanza {i}:\n{stanza_map[str(i)]}" |
|
break |
|
elif "explain" in user_input: |
|
for i in range(1, 4): |
|
if str(i) in user_input: |
|
response = f"Explanation:\n{explanations[str(i)]['explanation']}" |
|
break |
|
elif "poetic devices" in user_input or "devices" in user_input: |
|
for i in range(1, 4): |
|
if str(i) in user_input: |
|
devices = ", ".join(explanations[str(i)]["devices"]) |
|
response = f"Poetic Devices in stanza {i}: {devices}" |
|
break |
|
elif "poet" in user_input: |
|
response = explanations["poet"] |
|
elif poem_topic: |
|
objs = [x.strip() for x in poem_topic.split("and") if x.strip()] |
|
if len(objs) < 2: |
|
objs.append("dreams") |
|
poem = generate_poem(objs[:2]) |
|
response = f"Here's a poem about {', '.join(objs[:2])}:\n\n{poem}" |
|
else: |
|
response = "Please ask me to read or explain a stanza, or generate a poem." |
|
|
|
tts = gTTS(response) |
|
tts.save("poembot_response.mp3") |
|
|
|
return response, "poembot_response.mp3" |
|
|
|
iface = gr.Interface( |
|
fn=handle_input, |
|
inputs=[ |
|
gr.Textbox(label="π€ Ask me something (e.g., 'Read stanza 1')"), |
|
gr.Textbox(label="π¨ Make a poem about (e.g., 'cloud and time')"), |
|
], |
|
outputs=[ |
|
gr.Textbox(label="π Response"), |
|
gr.Audio(label="π Voice Response", autoplay=True) |
|
], |
|
title="PoemBot - Voice Poetry Assistant", |
|
description="Ask me to read stanzas, explain, find poetic devices or create poems from your words!" |
|
) |
|
|
|
iface.launch() |