| |
| import gradio as gr |
| from TTS.api import TTS |
| import numpy as np |
| import time |
| import os |
| import matplotlib.pyplot as plt |
| from scipy.io import wavfile |
|
|
|
|
| os.environ["COQUI_TOS_AGREED"] = "1" |
|
|
| |
| model_name = TTS.list_models()[0] |
| tts = TTS(model_name) |
|
|
| |
| avilable_speakers = [ |
| "Daisy Studious", "Sofia Hellen", "Asya Anara", |
| "Eugenio Mataracı", "Viktor Menelaos", "Damien Black" |
| ] |
|
|
|
|
| |
| avilable_languages = [ |
| "US English", "Spanish (LatAm)" |
| ] |
|
|
| |
| selected_speaker = avilable_speakers[0] |
| selected_languages= avilable_languages[0] |
|
|
|
|
| |
| os.makedirs("output", exist_ok=True) |
| last_generated_audio = None |
| last_generated_text = "" |
|
|
| |
| def trim_text(text, max_length=30): |
| return text[:max_length] + '...' if len(text) > max_length else text |
|
|
|
|
| |
| def generate_speech_with_timestamps(text, speaker, language): |
| global last_generated_audio, last_generated_text |
| output_path = "output/generated_speech.wav" |
| start_time = time.time() |
|
|
| |
| tts.tts_to_file( |
| text=text, |
| speaker=speaker, |
| language= 'en' if language == "US English" else 'es', |
| file_path = output_path |
| ) |
|
|
|
|
| |
| end_time = time.time() |
| duration = round(end_time - start_time, 2) |
| last_generated_audio = output_path |
| last_generated_text = text |
|
|
|
|
| |
| samplerate, data = wavfile.read(output_path) |
| speech_length = len(data) / samplerate |
|
|
|
|
| |
| return output_path, len(text.split()), speaker, language, round(speech_length, 2), duration |
|
|
|
|
| |
| def generate_waveform(): |
| |
| global last_generated_audio, last_generated_text |
|
|
| |
| if not last_generated_audio or not os.path.exists(last_generated_audio): |
| return None, 'No valid audiofile to generate waveform' |
|
|
| |
| samplerate, data = wavfile.read(last_generated_audio) |
| time_axis = np.linspace(0, len(data)/ samplerate, num=len(data)) |
|
|
| |
| fig, ax = plt.subplots(figsize=(8,4), facecolor='#1E1E1E') |
|
|
| |
| ax.plot(time_axis, data, alpha=0.8, color=cyan, linewidth=1.2) |
|
|
| |
| ax.set_facecolor('#2E2E2E') |
| ax.grid(color='gray', linestyle='--', linewidth=0.5, alpha=0.5 ) |
| ax.spines['bottom'].set_color('white') |
| ax.spines['left'].set_color('white') |
| ax.tick_params(axix='x', colors='white') |
| ax.tick_params(axix='y', colors='white') |
| ax.set_xlabel('Time (seconds)', color='white') |
| ax.set_ylabel('Amplitude', color='white') |
|
|
| |
| |
| trimed_text = trim_text(last_generated_text) |
| ax.set_title(f'Waveform for text input: {trimed_}') |
|
|
| |
| waveform_image_path = "output/waveform.png" |
| plt.savefig(waveform_image_path, transparent=True) |
| plt.close() |
|
|
| return waveform_image_path, "Waveform generated successfully!" |
|
|
| |
| def generate_speech(text, speaker, language): |
| if not text: |
| return None, "Please enter some text to generate speech", "", gr.update(interactive = False) |
|
|
| audio_path, word_count, speaker_name, lang, speech_length, duration = generate_speech_with_timestamps(text, speaker, language) |
|
|
| |
| data_info = f"Word Count: {word_count}\nVoice: {speaker_name}\nLocalization: {lang}\nLength of Speech: {speech_length} seconds\nGeneration Duration: {duration} seconds" |
|
|
| return audio_path, data_info, "Speech generation successful!", gr.update(interactive=True) |
|
|
| |
| def setup_interface(): |
| with gr.Blocks() as app: |
| |
| gr.Markdown('# 🗣️ Text-to-Speech GenAI with Coqui TTS') |
| gr.Markdown('Convert text to speech using Coqui TTS with support for different languages and speakers.') |
|
|
|
|
| with gr.Row(): |
| with gr.Column(): |
|
|
| |
| text_input = gr.Textbox(label='', placeholder='Type your text here', lines=3) |
|
|
| with gr.Row(): |
| |
| speaker_dropdown = gr.Dropdown(choices=avilable_speakers, value=selected_speaker, label='Select Voice') |
| language_radio = gr.Radio(choices=avilable_languages, value=selected_languages, label = 'Select Localization') |
|
|
| with gr.Column(): |
| |
| data_info_display = gr.Textbox(label = 'Data Info', interactive=False, lines=5) |
| status_message = gr.Textbox(label = 'Status', interactive = False) |
|
|
|
|
| with gr.Row(): |
| with gr.Column(): |
| |
| audio_output = gr.Audio(label = 'Generated Speech', interactive = False) |
| generate_button = gr.Button('Generate Speech') |
|
|
|
|
| with gr.Column(): |
| |
| waveform_output = gr.Image(label = 'waveform') |
| generate_waveform_button = gr.Button('Generate Waveform', interactive = False) |
|
|
|
|
| generate_button.click( |
| generate_speech, |
| inputs=[text_input, speaker_dropdown, language_radio], |
| outputs=[audio_output, data_info_display, status_message, generate_waveform_button] |
| ) |
|
|
| generate_waveform_button.click( |
| generate_waveform, |
| outputs=[waveform_output, status_message] |
| ) |
|
|
| return app |
|
|
| |
| if __name__ == '__main__': |
| app = setup_interface() |
| app.launch(share=True) |