Luigi commited on
Commit
fa15b27
·
1 Parent(s): 52ecdb7

update app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +64 -57
src/streamlit_app.py CHANGED
@@ -1,86 +1,93 @@
1
  import os
 
 
 
 
 
 
2
  import streamlit as st
3
 
4
  # Base folder where TTS samples are stored
5
- BASE_DIR = "tts_smaples"
6
-
7
- @st.cache_data
8
- def get_providers_and_voices(base_dir: str):
9
- """
10
- Scan the base_dir for subfolders (providers) and .wav files under each.
11
- Returns a dict: { provider_name: [voice_filename1.wav, ...], ... }
12
- """
13
- providers = {}
14
- if not os.path.isdir(base_dir):
15
- return providers
16
- for provider in sorted(os.listdir(base_dir)):
17
- prov_path = os.path.join(base_dir, provider)
18
- if os.path.isdir(prov_path):
19
- # List only .wav files
20
- voices = [f for f in sorted(os.listdir(prov_path)) if f.lower().endswith(".wav")]
21
- if voices:
22
- providers[provider] = voices
23
- return providers
24
-
25
  def main():
26
- st.set_page_config(page_title="TTS Samples Player", layout="centered")
 
27
  st.title("🎵 TTS Samples Player")
28
  st.markdown(
29
  """
30
  Select a TTS engine provider and a voice to play the corresponding WAV sample.
 
31
  Ensure your `tts_smaples/` folder with subfolders (e.g., `azure/`, `google/`, etc.) is present in the repo.
32
  """
33
  )
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  providers = get_providers_and_voices(BASE_DIR)
36
  if not providers:
37
  st.warning(f"No providers found in `{BASE_DIR}`. Please ensure the folder exists with subfolders containing .wav files.")
38
  return
39
 
40
- # Let user pick a provider
 
41
  provider_list = list(providers.keys())
42
- provider = st.selectbox("Select TTS Provider", options=provider_list)
43
 
44
- # List voices for the chosen provider
45
  voices = providers.get(provider, [])
46
  if not voices:
47
- st.info(f"No .wav files found under provider `{provider}`.")
48
  return
49
 
50
- voice = st.selectbox("Select Voice", options=voices)
51
 
52
- if voice:
53
- file_path = os.path.join(BASE_DIR, provider, voice)
54
- if os.path.isfile(file_path):
55
- try:
56
- # Read as bytes
57
- audio_bytes = open(file_path, "rb").read()
58
- st.audio(audio_bytes, format="audio/wav")
59
- st.markdown(f"**Playing**: `{provider}/{voice}`")
60
- except Exception as e:
61
- st.error(f"Error loading audio file `{file_path}`: {e}")
62
- else:
63
- st.error(f"File not found: `{file_path}`")
64
 
65
- # Optionally, show all providers in expanders with buttons:
66
- with st.expander("Browse all providers/voices"):
67
- for prov, voice_files in providers.items():
68
- with st.expander(prov, expanded=False):
69
- for vf in voice_files:
70
- col1, col2 = st.columns([3,1])
71
- col1.write(vf)
72
- play_btn = col2.button(f"Play", key=f"{prov}_{vf}")
73
- if play_btn:
74
- path = os.path.join(BASE_DIR, prov, vf)
75
- if os.path.isfile(path):
76
- try:
77
- data = open(path, "rb").read()
78
- st.audio(data, format="audio/wav")
79
- st.write(f"**Playing**: `{prov}/{vf}`")
80
- except Exception as ex:
81
- st.error(f"Error: {ex}")
82
- else:
83
- st.error(f"Not found: {path}")
 
84
 
85
  if __name__ == "__main__":
86
  main()
 
1
  import os
2
+ # Fix Streamlit permission issues by redirecting HOME and XDG_CONFIG_HOME to writable path
3
+ cwd = os.getcwd()
4
+ os.environ.setdefault('XDG_CONFIG_HOME', cwd)
5
+ # Some Streamlit operations use HOME; override HOME to cwd
6
+ os.environ.setdefault('HOME', cwd)
7
+
8
  import streamlit as st
9
 
10
  # Base folder where TTS samples are stored
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  def main():
12
+ # Configure page for better mobile experience; sidebar collapses nicely on small screens
13
+ st.set_page_config(page_title="TTS Samples Player", layout="wide")
14
  st.title("🎵 TTS Samples Player")
15
  st.markdown(
16
  """
17
  Select a TTS engine provider and a voice to play the corresponding WAV sample.
18
+ Use the sidebar to select provider and voice for better mobile experience.
19
  Ensure your `tts_smaples/` folder with subfolders (e.g., `azure/`, `google/`, etc.) is present in the repo.
20
  """
21
  )
22
 
23
+ BASE_DIR = "tts_smaples"
24
+
25
+ @st.cache_data
26
+ def get_providers_and_voices(base_dir: str):
27
+ """
28
+ Scan the base_dir for subfolders (providers) and .wav files under each.
29
+ Returns a dict: { provider_name: [voice_filename1.wav, ...], ... }
30
+ """
31
+ providers = {}
32
+ if not os.path.isdir(base_dir):
33
+ return providers
34
+ for provider in sorted(os.listdir(base_dir)):
35
+ prov_path = os.path.join(base_dir, provider)
36
+ if os.path.isdir(prov_path):
37
+ voices = [f for f in sorted(os.listdir(prov_path)) if f.lower().endswith(".wav")]
38
+ if voices:
39
+ providers[provider] = voices
40
+ return providers
41
+
42
  providers = get_providers_and_voices(BASE_DIR)
43
  if not providers:
44
  st.warning(f"No providers found in `{BASE_DIR}`. Please ensure the folder exists with subfolders containing .wav files.")
45
  return
46
 
47
+ # Sidebar for selection (better for mobile)
48
+ st.sidebar.header("Select TTS Sample")
49
  provider_list = list(providers.keys())
50
+ provider = st.sidebar.selectbox("Provider", options=provider_list)
51
 
 
52
  voices = providers.get(provider, [])
53
  if not voices:
54
+ st.sidebar.info(f"No .wav files under provider `{provider}`.")
55
  return
56
 
57
+ voice = st.sidebar.selectbox("Voice", options=voices)
58
 
59
+ # Main area shows playback
60
+ st.markdown(f"### Playing: **{provider} / {voice}**")
61
+ file_path = os.path.join(BASE_DIR, provider, voice)
62
+ if os.path.isfile(file_path):
63
+ try:
64
+ audio_bytes = open(file_path, "rb").read()
65
+ st.audio(audio_bytes, format="audio/wav")
66
+ except Exception as e:
67
+ st.error(f"Error loading audio: {e}")
68
+ else:
69
+ st.error(f"File not found: `{file_path}`")
 
70
 
71
+ # Browse all providers and voices in collapsible sections
72
+ st.markdown("---")
73
+ st.markdown("#### Browse all samples")
74
+ for prov, voice_files in providers.items():
75
+ with st.expander(prov, expanded=False):
76
+ for vf in voice_files:
77
+ path = os.path.join(BASE_DIR, prov, vf)
78
+ btn_key = f"play_{prov}_{vf}"
79
+ cols = st.columns([3,1])
80
+ cols[0].write(vf)
81
+ if cols[1].button("Play", key=btn_key):
82
+ if os.path.isfile(path):
83
+ try:
84
+ data = open(path, "rb").read()
85
+ st.audio(data, format="audio/wav")
86
+ st.write(f"**Playing**: `{prov}/{vf}`")
87
+ except Exception as ex:
88
+ st.error(f"Error playing file: {ex}")
89
+ else:
90
+ st.error(f"File not found: {path}")
91
 
92
  if __name__ == "__main__":
93
  main()