Spaces:
Sleeping
Sleeping
import os | |
import streamlit as st | |
from huggingface_hub import InferenceApi | |
from dotenv import load_dotenv | |
import base64 | |
import requests | |
# Load environment variables from the .env file | |
load_dotenv() | |
# Set your Hugging Face API token from the environment variable | |
HUGGINGFACE_API_TOKEN = os.getenv("HUGGINGFACE_API_TOKEN") | |
# Function to get user input | |
def get_text(): | |
input_text = st.text_input("Enter text for speech generation:", key="input") | |
return input_text | |
# Function to select the language model | |
def select_language(): | |
language_options = { | |
"English": "google/tts_model_en", | |
"Spanish": "google/tts_model_es", | |
"German": "google/tts_model_de", | |
"French": "google/tts_model_fr", | |
"Italian": "google/tts_model_it", | |
} | |
selected_language = st.selectbox("Select Language", list(language_options.keys())) | |
return language_options[selected_language] | |
# Initialize Streamlit UI | |
st.set_page_config(page_title="Multilingual Text-to-Speech", page_icon="π") | |
st.header("Multilingual Text-to-Speech Demo") | |
# Get user input and language selection | |
user_input = get_text() | |
model_id = select_language() | |
# Function to play audio in Streamlit | |
def play_audio(audio_bytes): | |
b64 = base64.b64encode(audio_bytes).decode() | |
audio_html = f""" | |
<audio controls autoplay> | |
<source src="data:audio/wav;base64,{b64}" type="audio/wav"> | |
Your browser does not support the audio element. | |
</audio> | |
""" | |
st.markdown(audio_html, unsafe_allow_html=True) | |
# Create a button for generating speech | |
submit = st.button('Generate Speech') | |
# If the generate button is clicked and user input is not empty | |
if submit and user_input: | |
with st.spinner("Generating speech..."): | |
# Make a direct request to the API | |
url = f"https://api-inference.huggingface.co/models/{model_id}" | |
headers = {"Authorization": f"Bearer {HUGGINGFACE_API_TOKEN}"} | |
payload = {"inputs": user_input} | |
# Requesting raw response with the option to manually handle the audio | |
response = requests.post(url, headers=headers, json=payload, stream=True) | |
if response.status_code == 200: | |
audio_data = response.content | |
# Assuming the response is in audio/wav or another format | |
play_audio(audio_data) | |
else: | |
st.error(f"Error: {response.status_code} - {response.text}") | |
elif submit: | |
st.warning("Please enter some text.") # Warning for empty input | |
has context menu |