Spaces:
Running
Running
| import gradio as gr | |
| import subprocess | |
| import os | |
| import tempfile | |
| def speak_text_via_festival(text): | |
| """ | |
| Uses Festival to speak the given text and returns the path to the generated audio file. | |
| """ | |
| if not text: | |
| return None | |
| # Create a temporary WAV file for Festival output | |
| # Using tempfile to ensure unique and safely managed temporary files | |
| with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as temp_audio_file: | |
| audio_filepath = temp_audio_file.name | |
| try: | |
| # Command to make Festival speak and output to a WAV file | |
| # (audio_mode 'wav) makes it output to a file instead of direct playback | |
| # (utt.save.wave utt "filename.wav") saves the utterance | |
| festival_command = f""" | |
| (set! utt (SayText "{text}")) | |
| (utt.save.wave utt "{audio_filepath}") | |
| """ | |
| process = subprocess.Popen(['festival', '--pipe'], | |
| stdin=subprocess.PIPE, | |
| stdout=subprocess.PIPE, | |
| stderr=subprocess.PIPE, | |
| text=True) | |
| stdout, stderr = process.communicate(input=festival_command) | |
| if process.returncode != 0: | |
| print(f"Error speaking text with Festival: {stderr}") | |
| if os.path.exists(audio_filepath): | |
| os.remove(audio_filepath) # Clean up partial file | |
| return None | |
| # Gradio's gr.Audio component expects a path to the audio file | |
| return audio_filepath | |
| except FileNotFoundError: | |
| print("Error: Festival executable not found. Make sure Festival is installed and in your PATH.") | |
| if os.path.exists(audio_filepath): | |
| os.remove(audio_filepath) | |
| return None | |
| except Exception as e: | |
| print(f"An unexpected error occurred: {e}") | |
| if os.path.exists(audio_filepath): | |
| os.remove(audio_filepath) | |
| return None | |
| # Define the Gradio Interface | |
| iface = gr.Interface( | |
| fn=speak_text_via_festival, | |
| inputs=gr.Textbox(lines=2, label="Enter text for Festival TTS:"), | |
| outputs=gr.Audio(label="Generated Audio", type="filepath", autoplay=True), | |
| title="Festival TTS with Gradio", | |
| description="Enter text to synthesize speech using the local Festival system." | |
| ) | |
| # Launch the Gradio app | |
| if __name__ == "__main__": | |
| iface.launch() | |