import gradio as gr import openai import numpy as np import re import time import emoji import os from transformers import pipeline from deep_translator import GoogleTranslator # Initialize emotion detection model emotion_classifier = pipeline( "text-classification", model="j-hartmann/emotion-english-distilroberta-base", top_k=1 ) # Emotion to emoji mapping EMOTION_EMOJI_MAP = { "anger": "๐ ", "disgust": "๐คข", "fear": "๐จ", "joy": "๐", "neutral": "๐", "sadness": "๐ข", "surprise": "๐ฒ" } # OpenAI TTS voices VOICES = ["alloy", "echo", "fable", "onyx", "nova", "shimmer"] DEFAULT_SPEED = 1.0 def detect_emotion(text): """Detect emotion from text and return corresponding emoji""" if not text.strip(): return "๐" # Return pencil emoji for empty text # Handle case where text is too long truncated_text = text[:512] # Safe emotion detection try: result = emotion_classifier(truncated_text) emotion = result[0][0]['label'].lower() return EMOTION_EMOJI_MAP.get(emotion, "โ") except Exception: return "โ" # Question mark if detection fails def translate_text(text, target_lang="en"): """Translate text to target language""" if not text.strip(): return "" try: return GoogleTranslator(source='auto', target=target_lang).translate(text) except Exception: return text # Return original if translation fails def text_to_speech(api_key, text, voice, speed, translate, emotion_boost): """Convert text to speech with emotion detection""" # Validate inputs if not api_key.strip(): raise gr.Error("๐ Please enter your OpenAI API key") if not text.strip(): raise gr.Error("๐ Please enter some text") openai.api_key = api_key # Translation - FIXED: Check if translate is True (boolean) translated_text = text if translate is True: # Explicitly check if it's True translated_text = translate_text(text) # Emotion detection emoji_icon = detect_emotion(translated_text) # Emotion-based speed adjustment try: # Ensure values are numbers speed_val = float(speed) boost_val = float(emotion_boost) adjusted_speed = max(0.25, min(2.0, speed_val * boost_val)) except (TypeError, ValueError): adjusted_speed = DEFAULT_SPEED # Generate speech try: response = openai.audio.speech.create( model="tts-1", voice=voice, input=translated_text, speed=adjusted_speed ) # Create audio file timestamp = int(time.time()) filename = f"tts_output_{timestamp}.wav" response.stream_to_file(filename) return filename, emoji_icon, f"Speed: {adjusted_speed:.2f}x" except Exception as e: error_msg = f"โ ๏ธ Error: {str(e)}" if "rate limit" in str(e).lower(): error_msg += "\n๐จ You've hit the rate limit. Please try again later." raise gr.Error(error_msg) # Gradio UI Components with gr.Blocks(theme=gr.themes.Soft(), title="Advanced OpenAI TTS") as demo: gr.Markdown("#
๐ Powered by OpenAI TTS โข Emotion Detection โข Real-time Translation
โ ๏ธ Your API key is only used for TTS generation and not stored