Spaces:
Sleeping
Sleeping
| import os | |
| os.environ["NUMBA_DISABLE_CACHE"] = "1" | |
| import os | |
| import gradio as gr | |
| from docx import Document | |
| from TTS.api import TTS | |
| import tempfile | |
| import zipfile | |
| from io import BytesIO | |
| import re | |
| from pydub import AudioSegment | |
| final_audio = AudioSegment.empty() | |
| from pydub import AudioSegment | |
| from bark import generate_audio # Importing Bark | |
| # Voice model | |
| VOICE_MODEL = "tts_models/en/vctk/vits" | |
| # Embedded metadata (from your file) | |
| SPEAKER_METADATA = { | |
| 300: { "age": 23, "gender": "F", "accent": "American"}, | |
| 271: { "age": 19, "gender": "M", "accent": "Scottish"}, | |
| 287: { "age": 23, "gender": "M", "accent": "English"}, | |
| 262: { "age": 23, "gender": "F", "accent": "Scottish"}, | |
| 284: { "age": 20, "gender": "M", "accent": "Scottish"}, | |
| 297: { "age": 20, "gender": "F", "accent": "American"}, | |
| 227: { "age": 38, "gender": "M", "accent": "English"}, | |
| 246: { "age": 22, "gender": "M", "accent": "Scottish"}, | |
| 225: { "age": 23, "gender": "F", "accent": "English"}, | |
| 259: { "age": 23, "gender": "M", "accent": "English"}, | |
| 252: { "age": 22, "gender": "M", "accent": "Scottish"}, | |
| 231: { "age": 23, "gender": "F", "accent": "English"}, | |
| 266: { "age": 22, "gender": "F", "accent": "Irish"}, | |
| 241: { "age": 21, "gender": "M", "accent": "Scottish"}, | |
| 312: { "age": 19, "gender": "F", "accent": "Canadian"}, | |
| 329: { "age": 23, "gender": "F", "accent": "American"}, | |
| 232: { "age": 23, "gender": "M", "accent": "English"}, | |
| 305: { "age": 19, "gender": "F", "accent": "American"}, | |
| 311: { "age": 21, "gender": "M", "accent": "American"}, | |
| 301: { "age": 23, "gender": "F", "accent": "American"}, | |
| 304: { "age": 22, "gender": "M", "accent": "NorthernIrish"}, | |
| 310: { "age": 21, "gender": "F", "accent": "American"}, | |
| 260: { "age": 21, "gender": "M", "accent": "Scottish"}, | |
| 315: { "age": 18, "gender": "M", "accent": "American"}, | |
| 374: { "age": 28, "gender": "M", "accent": "Australian"}, | |
| 364: { "age": 23, "gender": "M", "accent": "Irish"}, | |
| 269: { "age": 20, "gender": "F", "accent": "English"}, | |
| 345: { "age": 22, "gender": "M", "accent": "American"}, | |
| 326: { "age": 26, "gender": "M", "accent": "Australian"}, | |
| 343: { "age": 27, "gender": "F", "accent": "Canadian"}, | |
| 230: { "age": 22, "gender": "F", "accent": "English"}, | |
| 376: { "age": 22, "gender": "M", "accent": "Indian"}, | |
| 240: { "age": 21, "gender": "F", "accent": "English"}, | |
| 298: { "age": 19, "gender": "M", "accent": "Irish"}, | |
| 272: { "age": 23, "gender": "M", "accent": "Scottish"}, | |
| 248: { "age": 23, "gender": "F", "accent": "Indian"}, | |
| 264: { "age": 23, "gender": "F", "accent": "Scottish"}, | |
| 250: { "age": 22, "gender": "F", "accent": "English"}, | |
| 292: { "age": 23, "gender": "M", "accent": "NorthernIrish"}, | |
| 237: { "age": 22, "gender": "M", "accent": "Scottish"}, | |
| 363: { "age": 22, "gender": "M", "accent": "Canadian"}, | |
| 313: { "age": 24, "gender": "F", "accent": "Irish"}, | |
| 285: { "age": 21, "gender": "M", "accent": "Scottish"}, | |
| 268: { "age": 23, "gender": "F", "accent": "English"}, | |
| 302: { "age": 20, "gender": "M", "accent": "Canadian"}, | |
| 261: { "age": 26, "gender": "F", "accent": "NorthernIrish"}, | |
| 336: { "age": 18, "gender": "F", "accent": "SouthAfrican"}, | |
| 288: { "age": 22, "gender": "F", "accent": "Irish"}, | |
| 226: { "age": 22, "gender": "M", "accent": "English"}, | |
| 277: { "age": 23, "gender": "F", "accent": "English"}, | |
| 360: { "age": 19, "gender": "M", "accent": "American"}, | |
| 257: { "age": 24, "gender": "F", "accent": "English"}, | |
| 254: { "age": 21, "gender": "M", "accent": "English"}, | |
| 339: { "age": 21, "gender": "F", "accent": "American"}, | |
| 323: { "age": 19, "gender": "F", "accent": "SouthAfrican"}, | |
| 255: { "age": 19, "gender": "M", "accent": "Scottish"}, | |
| 249: { "age": 22, "gender": "F", "accent": "Scottish"}, | |
| 293: { "age": 22, "gender": "F", "accent": "NorthernIrish"}, | |
| 244: { "age": 22, "gender": "F", "accent": "English"}, | |
| 245: { "age": 25, "gender": "M", "accent": "Irish"}, | |
| 361: { "age": 19, "gender": "F", "accent": "American"}, | |
| 314: { "age": 26, "gender": "F", "accent": "SouthAfrican"}, | |
| 308: { "age": 18, "gender": "F", "accent": "American"}, | |
| 229: { "age": 23, "gender": "F", "accent": "English"}, | |
| 341: { "age": 26, "gender": "F", "accent": "American"}, | |
| 275: { "age": 23, "gender": "M", "accent": "Scottish"}, | |
| 263: { "age": 22, "gender": "M", "accent": "Scottish"}, | |
| 253: { "age": 22, "gender": "F", "accent": "Welsh"}, | |
| 299: { "age": 25, "gender": "F", "accent": "American"}, | |
| 316: { "age": 20, "gender": "M", "accent": "Canadian"}, | |
| 282: { "age": 23, "gender": "F", "accent": "English"}, | |
| 362: { "age": 29, "gender": "F", "accent": "American"}, | |
| 294: { "age": 33, "gender": "F", "accent": "American"}, | |
| 274: { "age": 22, "gender": "M", "accent": "English"}, | |
| 279: { "age": 23, "gender": "M", "accent": "English"}, | |
| 281: { "age": 29, "gender": "M", "accent": "Scottish"}, | |
| 286: { "age": 23, "gender": "M", "accent": "English"}, | |
| 258: { "age": 22, "gender": "M", "accent": "English"}, | |
| 247: { "age": 22, "gender": "M", "accent": "Scottish"}, | |
| 351: { "age": 21, "gender": "F", "accent": "NorthernIrish"}, | |
| 283: { "age": 24, "gender": "F", "accent": "Irish"}, | |
| 334: { "age": 18, "gender": "M", "accent": "American"}, | |
| 333: { "age": 19, "gender": "F", "accent": "American"}, | |
| 295: { "age": 23, "gender": "F", "accent": "Irish"}, | |
| 330: { "age": 26, "gender": "F", "accent": "American"}, | |
| 335: { "age": 25, "gender": "F", "accent": "NewZealand"}, | |
| 228: { "age": 22, "gender": "F", "accent": "English"}, | |
| 267: { "age": 23, "gender": "F", "accent": "English"}, | |
| 273: { "age": 18, "gender": "F", "accent": "English"} | |
| } | |
| # Bark prompts (example) | |
| BARK_PROMPTS = [ | |
| "Shy girl", | |
| "Old man", | |
| "Excited child", | |
| "Angry woman" | |
| ] | |
| def list_speaker_choices(metadata): | |
| """Helper function to list speakers from metadata (for VCTK and Coqui)""" | |
| return [f"Speaker {sid} | {meta['gender']} | {meta['accent']}" for sid, meta in SPEAKER_METADATA.items()] | |
| def get_speaker_id_from_label(label): | |
| """Extract speaker ID from label string""" | |
| return label.split('|')[0].strip() | |
| def generate_audio(sample_text, speaker_label, engine): | |
| """Generate audio based on engine choice""" | |
| speaker_id = get_speaker_id_from_label(speaker_label) | |
| model = None | |
| # Engine selection logic | |
| if engine == "bark": | |
| model = TTS("bark_model_path") # Replace with actual path for Bark model | |
| elif engine == "coqui": | |
| model = TTS("tts_models/multilingual/multi-dataset/xtts_v2") # Replace with actual path for Coqui model | |
| elif engine == "vctk": | |
| model = TTS(VOICE_MODEL) # Replace with actual path for VCTK model | |
| # Temporary file creation for output audio | |
| with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as tmp_wav: | |
| model.tts_to_file(text=sample_text, speaker="p"+speaker_id, file_path=tmp_wav.name) | |
| return tmp_wav.name | |
| # --- UI Components --- | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## 📄 TTS Voice Generator with Multiple Engines") | |
| # Engine dropdown | |
| engine_dropdown = gr.Dropdown( | |
| label="Select TTS Engine", | |
| choices=["bark", "coqui", "vctk"], | |
| value="vctk" | |
| ) | |
| # Speaker/Prompt dropdown (dynamic) | |
| speaker_dropdown = gr.Dropdown(label="Select Speaker", visible=False) | |
| prompt_dropdown = gr.Dropdown(label="Select Prompt", visible=False) | |
| # Sample text box | |
| sample_textbox = gr.Textbox(label="Enter Sample Text (Max 500 characters)", max_lines=5) | |
| sample_audio = gr.Audio(label="Sample Output Audio", type="filepath") | |
| # Define metadata choices for speakers (Coqui and VCTK) | |
| speaker_choices_vctk_coqui = list_speaker_choices(SPEAKER_METADATA) | |
| speaker_dropdown.choices = speaker_choices_vctk_coqui # Use metadata for VCTK/Coqui speakers | |
| # Define Bark prompts (choose from predefined prompts) | |
| prompt_dropdown.choices = BARK_PROMPTS | |
| # Dynamically update dropdown visibility based on engine selection | |
| def update_dropdowns(engine): | |
| if engine == "bark": | |
| speaker_dropdown.visible = False | |
| prompt_dropdown.visible = True | |
| elif engine == "coqui" or engine == "vctk": | |
| speaker_dropdown.visible = True | |
| prompt_dropdown.visible = False | |
| return gr.update(visible=speaker_dropdown.visible), gr.update(visible=prompt_dropdown.visible) | |
| # Trigger dropdown visibility changes | |
| engine_dropdown.change(update_dropdowns, inputs=engine_dropdown, outputs=[speaker_dropdown, prompt_dropdown]) | |
| # Button to generate audio from sample text | |
| generate_button = gr.Button("Generate Audio") | |
| generate_button.click( | |
| fn=generate_audio, | |
| inputs=[sample_textbox, speaker_dropdown, engine_dropdown], | |
| outputs=[sample_audio] | |
| ) | |
| # Button to clear the sample text and audio | |
| def clear_sample(): | |
| return "", None | |
| clear_button = gr.Button("Clear") | |
| clear_button.click(fn=clear_sample, inputs=[], outputs=[sample_textbox, sample_audio]) | |
| if __name__ == "__main__": | |
| demo.launch() | |