|
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}") |
|
|