| import streamlit as st |
| from gtts import gTTS |
| import os |
| import base64 |
|
|
| |
| st.title("Text-to-Audio App") |
| st.text("This app converts your text input into audio using TTS.") |
|
|
| |
| text_input = st.text_area("Enter some text:") |
|
|
| if st.button("Generate Audio"): |
| if not text_input.strip(): |
| st.error("Please enter some text!") |
| else: |
| try: |
| |
| tts = gTTS(text=text_input, lang="en") |
| audio_file = "output.wav" |
| tts.save(audio_file) |
|
|
| |
| if os.path.exists(audio_file): |
| |
| with open(audio_file, "rb") as f: |
| audio_data = f.read() |
| audio_base64 = base64.b64encode(audio_data).decode() |
|
|
| |
| audio_html = f""" |
| <audio id="audio" controls style="width: 100%; margin-top: 10px;"> |
| <source src="data:audio/wav;base64,{audio_base64}" type="audio/wav"> |
| Your browser does not support the audio element. |
| </audio> |
| <div style="margin-top: 10px;"> |
| <label for="speed" style="font-weight: bold;">Playback Speed:</label> |
| <input type="range" id="speed" min="0.5" max="2.0" value="1.0" step="0.1" style="width: 50%; margin-left: 10px;"> |
| <span id="speed-value">1.0x</span> |
| </div> |
| <script> |
| const audio = document.getElementById("audio"); |
| const speedSlider = document.getElementById("speed"); |
| const speedValue = document.getElementById("speed-value"); |
| |
| // Update playback speed dynamically |
| speedSlider.addEventListener("input", () => {{ |
| const speed = parseFloat(speedSlider.value); |
| audio.playbackRate = speed; |
| speedValue.textContent = speed.toFixed(1) + "x"; |
| }}); |
| </script> |
| """ |
| st.components.v1.html(audio_html, height=200) |
|
|
| st.success("Audio generated successfully!") |
|
|
| |
| with open(audio_file, "rb") as f: |
| st.download_button( |
| label="Download Audio", |
| data=f.read(), |
| file_name="output.wav", |
| mime="audio/wav", |
| ) |
| else: |
| st.error("Audio file could not be generated.") |
| except Exception as e: |
| st.error(f"An error occurred: {e}") |
|
|