import gradio as gr
from transformers import pipeline
# Load models
text_emotion_model = pipeline("text-classification", model="j-hartmann/emotion-english-distilroberta-base")
audio_emotion_model = pipeline("audio-classification", model="superb/wav2vec2-base-superb-er")
# Emoji mapping
emoji_map = {
"joy": "😊", "happy": "😊", "anger": "😠", "angry": "😠",
"sadness": "😢", "sad": "😢", "fear": "😨", "calm": "😌",
"surprise": "😲", "disgust": "🤢", "neutral": "😐", "boredom": "🥱",
"optimism": "🙂"
}
# Format output
def format_emotion(label, score):
emoji = emoji_map.get(label.lower(), "❓")
return f"{emoji} {label.title()} ({int(score * 100)}%)"
# Main prediction function
def detect_emotion(mode, text, audio):
if mode == "Text" and text:
result = text_emotion_model(text)[0]
return f"🗣️ Text Emotion:
{format_emotion(result['label'], result['score'])}"
elif mode == "Audio" and audio:
result = audio_emotion_model(audio)[0]
return f"🎧 Audio Emotion:
{format_emotion(result['label'], result['score'])}"
return "⚠️ Please provide valid input."
# Clear inputs
def clear_all():
return "Text", "", None, ""
# Build UI
with gr.Blocks() as demo:
gr.Markdown("## 🎭 Emotion Detection App (Text or Audio)")
mode = gr.Radio(["Text", "Audio"], label="Choose Input Mode", value="Text")
text_input = gr.Textbox(label="💬 Enter your text", visible=True)
audio_input = gr.Audio(type="filepath", label="🎤 Record or Upload Audio", visible=False)
output = gr.HTML(label="🎯 Output", value="")
detect_btn = gr.Button("🔍 Detect Emotion")
clear_btn = gr.Button("❌ Clear Inputs")
# Show/hide inputs based on mode
def toggle_inputs(mode):
return (
gr.update(visible=(mode == "Text")),
gr.update(visible=(mode == "Audio"))
)
mode.change(fn=toggle_inputs, inputs=mode, outputs=[text_input, audio_input])
detect_btn.click(fn=detect_emotion, inputs=[mode, text_input, audio_input], outputs=output)
clear_btn.click(fn=clear_all, inputs=[], outputs=[mode, text_input, audio_input, output])
demo.launch()