audio / app.py
pm6six's picture
Update app.py
5665cf6 verified
import streamlit as st
from gtts import gTTS
import os
import base64
# Streamlit app UI
st.title("Text-to-Audio App")
st.text("This app converts your text input into audio using TTS.")
# User input
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:
# Generate speech using gTTS
tts = gTTS(text=text_input, lang="en")
audio_file = "output.wav"
tts.save(audio_file)
# Check if file exists
if os.path.exists(audio_file):
# Encode audio file to base64
with open(audio_file, "rb") as f:
audio_data = f.read()
audio_base64 = base64.b64encode(audio_data).decode()
# Embed custom HTML audio player with speed adjustment
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!")
# Provide download option
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}")