Spaces:
Running
Running
| import gradio as gr | |
| import tempfile | |
| from gtts import gTTS | |
| from gtts.lang import tts_langs | |
| # Get available languages for Google TTS | |
| google_langs = tts_langs() | |
| # Create descriptive names for all supported languages | |
| google_lang_descriptions = { | |
| "af": "Afrikaans", | |
| "ar": "Arabic", | |
| "bn": "Bengali", | |
| "bs": "Bosnian", | |
| "ca": "Catalan", | |
| "cs": "Czech", | |
| "cy": "Welsh", | |
| "da": "Danish", | |
| "de": "German", | |
| "el": "Greek", | |
| "en": "English", | |
| "eo": "Esperanto", | |
| "es": "Spanish", | |
| "et": "Estonian", | |
| "fi": "Finnish", | |
| "fr": "French", | |
| "gu": "Gujarati", | |
| "hi": "Hindi", | |
| "hr": "Croatian", | |
| "hu": "Hungarian", | |
| "id": "Indonesian", | |
| "is": "Icelandic", | |
| "it": "Italian", | |
| "ja": "Japanese", | |
| "jw": "Javanese", | |
| "kn": "Kannada", | |
| "ko": "Korean", | |
| "la": "Latin", | |
| "lv": "Latvian", | |
| "ml": "Malayalam", | |
| "mr": "Marathi", | |
| "my": "Myanmar", | |
| "ne": "Nepali", | |
| "nl": "Dutch", | |
| "no": "Norwegian", | |
| "pl": "Polish", | |
| "pt": "Portuguese", | |
| "ro": "Romanian", | |
| "ru": "Russian", | |
| "si": "Sinhala", | |
| "sk": "Slovak", | |
| "sq": "Albanian", | |
| "sr": "Serbian", | |
| "su": "Sundanese", | |
| "sv": "Swedish", | |
| "sw": "Swahili", | |
| "ta": "Tamil", | |
| "te": "Telugu", | |
| "th": "Thai", | |
| "tr": "Turkish", | |
| "uk": "Ukrainian", | |
| "ur": "Urdu", | |
| "vi": "Vietnamese", | |
| "zh-CN": "Chinese (Simplified)", | |
| "zh-TW": "Chinese (Traditional)" | |
| } | |
| # Add any missing languages dynamically from gtts.langs() and fallback to code itself if not in predefined list | |
| for lang_code in google_langs.keys(): | |
| if lang_code not in google_lang_descriptions: | |
| google_lang_descriptions[lang_code] = google_langs[lang_code] | |
| # Define voice options for English, as an example (others can be added as needed) | |
| google_voice_options = { | |
| "en": [("Australia", "com.au"), ("Canada", "ca"), ("United Kingdom", "co.uk"), | |
| ("United States", "com"), ("India", "co.in"), ("Ireland", "ie"), ("South Africa", "co.za")], | |
| # Add voice options for other languages if applicable | |
| } | |
| def google_tts(text, lang, tld=None): | |
| try: | |
| # Only include tld if it's provided (for languages like English) | |
| if tld: | |
| tts = gTTS(text=text, lang=lang, tld=tld, slow=False) | |
| else: | |
| tts = gTTS(text=text, lang=lang, slow=False) # No TLD for languages without specific variants | |
| with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as temp_audio: | |
| tts.save(temp_audio.name) | |
| temp_audio_path = temp_audio.name | |
| return temp_audio_path, f"Speech generated with Google TTS using {google_lang_descriptions.get(lang, lang)} language" | |
| except Exception as e: | |
| return None, f"Error in Google TTS speech generation: {str(e)}" | |
| # Gradio interface | |
| with gr.Blocks() as iface: | |
| gr.Markdown("# Google TTS Tool") | |
| text_input = gr.Textbox(label="Enter text for speech generation") | |
| # Create dropdown for descriptive language options | |
| google_lang_input = gr.Dropdown([google_lang_descriptions[key] for key in google_langs.keys()], label="Select Language", value="English") | |
| google_voice_input = gr.Dropdown([x[0] for x in google_voice_options.get("en", [])], label="Select Voice Variant", value="United States") | |
| speech_button = gr.Button("Generate Speech") | |
| speech_output = gr.Audio(label="Generated Speech") | |
| speech_message = gr.Textbox(label="Message") | |
| def generate_speech(text, google_lang_desc, google_voice_desc): | |
| # Convert descriptive language back to its code | |
| google_lang_code = [key for key, value in google_lang_descriptions.items() if value == google_lang_desc][0] | |
| # Find the tld (country code) based on the description (if applicable) | |
| google_voice_tld = dict(google_voice_options.get(google_lang_code, [("Default", None)])).get(google_voice_desc, None) | |
| return google_tts(text, google_lang_code, google_voice_tld) | |
| def update_google_voice_options(lang_desc): | |
| # Convert descriptive language back to its code | |
| google_lang_code = [key for key, value in google_lang_descriptions.items() if value == lang_desc][0] | |
| # Update the voice dropdown with corresponding voice options (if available) | |
| return gr.Dropdown(choices=[x[0] for x in google_voice_options.get(google_lang_code, [("Default", None)])], value="Default") | |
| speech_button.click(generate_speech, | |
| inputs=[text_input, google_lang_input, google_voice_input], | |
| outputs=[speech_output, speech_message]) | |
| google_lang_input.change(update_google_voice_options, inputs=[google_lang_input], outputs=[google_voice_input]) | |
| iface.launch() | |