Spaces:
Sleeping
Sleeping
update app.py
Browse files- 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 |
-
|
|
|
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 |
-
#
|
|
|
41 |
provider_list = list(providers.keys())
|
42 |
-
provider = st.selectbox("
|
43 |
|
44 |
-
# List voices for the chosen provider
|
45 |
voices = providers.get(provider, [])
|
46 |
if not voices:
|
47 |
-
st.info(f"No .wav files
|
48 |
return
|
49 |
|
50 |
-
voice = st.selectbox("
|
51 |
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
st.error(f"File not found: `{file_path}`")
|
64 |
|
65 |
-
#
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
|
|
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()
|