import gradio as gr import asyncio import time import os from tts import synthesize_and_play_audio from pydub import AudioSegment import shutil async def generate_tts(input_text, reference_audio_path, output_path="cloned.wav"): print(reference_audio_path) await synthesize_and_play_audio( input_text=input_text, reference_audio_path=reference_audio_path, model="voxtral-mini-tts-260213", api_key=os.getenv("MISTRAL_API_KEY"), output_path=output_path, no_play=True ) return output_path def gradio_tts(input_text, audio_choice, uploaded_audio=None): # If an audio file is uploaded, save it to a fixed path if uploaded_audio is not None: reference_audio = "uploadedreference.wav" shutil.copy(uploaded_audio, reference_audio) else: reference_audio = audio_choice output_path = "cloned.wav" try: generated_audio = asyncio.run(generate_tts(input_text, reference_audio, output_path)) return generated_audio except Exception as e: print(f"Error: {e}") return None with open("styles.css", "r") as f: css = f.read() examples = [ ["Frontier AI in your hands.", "sample.mp3"], ["Hello, world!", "voice.wav"], ["This is a test.", "4languages.mp3"], ] with gr.Blocks() as demo: gr.Markdown("## Voxtral TTS Demo", elem_classes="markdown") gr.Markdown("Voxtral TTS is a text-to-speech model that can clone voice from any reference audio. Learn more about [Voxtral TTS](https://huggingface.co/mistralai/Voxtral-3B-TTS-2603).", elem_classes="markdown") with gr.Tabs(): with gr.TabItem("Predefined Voices"): gr.Markdown("# Predefined Voices TTS", elem_classes="markdown") gr.Markdown("Enter text to synthesize and select a predefined voice.", elem_classes="markdown") with gr.Row(): with gr.Column(elem_classes="gradio-box"): input_text_predefined = gr.Textbox( label="Enter text to synthesize", placeholder="Frontier AI in your hands.", elem_classes="gradio-textbox" ) audio_choice = gr.Dropdown( label="Select a predefined voice", choices=["sample.mp3", "voice.wav", "4languages.mp3"], value="4languages.mp3", ) submit_btn_predefined = gr.Button("Generate Audio", elem_classes="gradio-button") with gr.Column(elem_classes="gradio-box"): output_audio_predefined = gr.Audio(label="Generated audio", elem_classes="gradio-audio") submit_btn_predefined.click( fn=lambda text, choice: gradio_tts(text, choice, None), inputs=[input_text_predefined, audio_choice], outputs=[output_audio_predefined], ) gr.Examples( examples=examples, inputs=[input_text_predefined, audio_choice], outputs=[output_audio_predefined], fn=lambda text, choice: gradio_tts(text, choice, None), cache_examples=True, ) with gr.TabItem("Voice Cloning"): gr.Markdown("# Voice Cloning TTS", elem_classes="markdown") gr.Markdown("Enter text to synthesize and upload your reference audio.", elem_classes="markdown") with gr.Row(): with gr.Column(elem_classes="gradio-box"): input_text_cloning = gr.Textbox( label="Enter text to synthesize", placeholder="Frontier AI in your hands.", elem_classes="gradio-textbox" ) uploaded_audio = gr.Audio( label="Upload your reference audio", type="filepath", sources=["upload"], elem_classes="gradio-audio" ) submit_btn_cloning = gr.Button("Generate Audio", elem_classes="gradio-button") with gr.Column(elem_classes="gradio-box"): output_audio_cloning = gr.Audio(label="Generated audio", elem_classes="gradio-audio") submit_btn_cloning.click( fn=lambda text, audio: gradio_tts(text, None, audio), inputs=[input_text_cloning, uploaded_audio], outputs=[output_audio_cloning], ) gr.Examples( examples=[ ["Frontier AI in your hands.", "sample.mp3"], ["Hello, world!", "voice.wav"], ], inputs=[input_text_cloning, uploaded_audio], outputs=[output_audio_cloning], fn=lambda text, audio: gradio_tts(text, None, audio), cache_examples=True, ) if __name__ == "__main__": demo.launch(share=False, css=css)