mrbeliever commited on
Commit
9c8b8ae
·
verified ·
1 Parent(s): 06280e2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +70 -41
app.py CHANGED
@@ -241,12 +241,38 @@ language_dict = {
241
  # Organize voices by language
242
  language_groups = {}
243
  for voice_name, voice_code in language_dict.items():
244
- # Extract language from voice name (e.g., 'English' from 'English-Jenny (Female)')
245
  language = voice_name.split('-')[0].strip()
246
  if language not in language_groups:
247
  language_groups[language] = []
248
  language_groups[language].append(voice_name)
249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
250
  async def text_to_speech_edge(text, voice):
251
  communicate = edge_tts.Communicate(text, voice)
252
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
@@ -255,49 +281,52 @@ async def text_to_speech_edge(text, voice):
255
  return tmp_path
256
 
257
  def main():
258
- st.title("Text-to-Speech Converter")
259
- st.write("Enter text and select a language and voice to generate an MP3 audio file.")
260
-
261
- # Input text area
262
- input_text = st.text_area("Input Text", height=150, placeholder="Enter the text you want to convert to speech...")
263
 
264
- # Language dropdown
265
- languages = sorted(language_groups.keys())
266
- selected_language = st.selectbox("Select Language", languages)
267
 
268
- # Voice dropdown (filtered by selected language)
269
- voices = language_groups.get(selected_language, [])
270
- selected_voice = st.selectbox("Select Voice", voices)
 
 
 
 
 
271
 
272
- if st.button("Generate Audio"):
273
- if input_text and selected_voice:
274
- with st.spinner("Generating audio..."):
275
- # Get the voice code from the selected voice
276
- voice_code = language_dict.get(selected_voice, "en-US-JennyNeural")
277
- # Run the async function
278
- try:
279
- loop = asyncio.new_event_loop()
280
- asyncio.set_event_loop(loop)
281
- audio_path = loop.run_until_complete(text_to_speech_edge(input_text, voice_code))
282
-
283
- # Display audio player
284
- st.audio(audio_path, format="audio/mp3")
285
-
286
- # Provide download link
287
- with open(audio_path, "rb") as file:
288
- st.download_button(
289
- label="Download MP3",
290
- data=file,
291
- file_name="output.mp3",
292
- mime="audio/mp3"
293
- )
294
-
295
- # Clean up temporary file
296
- os.unlink(audio_path)
297
- except Exception as e:
298
- st.error(f"Error generating audio: {str(e)}")
299
- else:
300
- st.warning("Please enter text and select a voice.")
301
 
302
  if __name__ == "__main__":
303
  main()
 
241
  # Organize voices by language
242
  language_groups = {}
243
  for voice_name, voice_code in language_dict.items():
 
244
  language = voice_name.split('-')[0].strip()
245
  if language not in language_groups:
246
  language_groups[language] = []
247
  language_groups[language].append(voice_name)
248
 
249
+ # CSS for centering elements
250
+ st.markdown("""
251
+ <style>
252
+ .main {
253
+ display: flex;
254
+ flex-direction: column;
255
+ align-items: center;
256
+ justify-content: center;
257
+ text-align: center;
258
+ }
259
+ .stButton > button {
260
+ display: block;
261
+ margin-left: auto;
262
+ margin-right: auto;
263
+ }
264
+ .stAudio {
265
+ display: flex;
266
+ justify-content: center;
267
+ }
268
+ .stDownloadButton > button {
269
+ display: block;
270
+ margin-left: auto;
271
+ margin-right: auto;
272
+ }
273
+ </style>
274
+ """, unsafe_allow_html=True)
275
+
276
  async def text_to_speech_edge(text, voice):
277
  communicate = edge_tts.Communicate(text, voice)
278
  with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
 
281
  return tmp_path
282
 
283
  def main():
284
+ # Center the title and description
285
+ st.markdown("<h1 style='text-align: center;'>Text-to-Speech Converter</h1>", unsafe_allow_html=True)
286
+ st.markdown("<p style='text-align: center;'>Enter text and select a language and voice to generate an MP3 audio file.</p>", unsafe_allow_html=True)
 
 
287
 
288
+ # Input text area, centered
289
+ with st.container():
290
+ input_text = st.text_area("Input Text", height=150, placeholder="Enter the text you want to convert to speech...", key="input_text")
291
 
292
+ # Side-by-side dropdowns for language and voice
293
+ col1, col2 = st.columns(2)
294
+ with col1:
295
+ languages = sorted(language_groups.keys())
296
+ selected_language = st.selectbox("Select Language", languages, index=languages.index("English") if "English" in languages else 0)
297
+ with col2:
298
+ voices = language_groups.get(selected_language, [])
299
+ selected_voice = st.selectbox("Select Voice", voices, index=0)
300
 
301
+ # Center the button
302
+ with st.container():
303
+ if st.button("Generate Audio"):
304
+ if input_text and selected_voice:
305
+ with st.spinner("Generating audio..."):
306
+ voice_code = language_dict.get(selected_voice, "en-US-JennyNeural")
307
+ try:
308
+ loop = asyncio.new_event_loop()
309
+ asyncio.set_event_loop(loop)
310
+ audio_path = loop.run_until_complete(text_to_speech_edge(input_text, voice_code))
311
+
312
+ # Display audio player, centered
313
+ st.audio(audio_path, format="audio/mp3")
314
+
315
+ # Provide download link, centered
316
+ with open(audio_path, "rb") as file:
317
+ st.download_button(
318
+ label="Download MP3",
319
+ data=file,
320
+ file_name="output.mp3",
321
+ mime="audio/mp3"
322
+ )
323
+
324
+ # Clean up temporary file
325
+ os.unlink(audio_path)
326
+ except Exception as e:
327
+ st.error(f"Error generating audio: {str(e)}")
328
+ else:
329
+ st.warning("Please enter text and select a voice.")
330
 
331
  if __name__ == "__main__":
332
  main()