Spaces:
Running
Running
import gradio as gr | |
import requests | |
import logging | |
import json | |
import traceback | |
# Configure logging | |
logging.basicConfig( | |
level=logging.DEBUG, | |
format='%(asctime)s - %(levelname)s - %(message)s', | |
handlers=[ | |
logging.FileHandler("app_debug.log"), | |
logging.StreamHandler() | |
] | |
) | |
logger = logging.getLogger(__name__) | |
# Load the JSON file containing use cases | |
with open("voice_description_indian.json", "r") as file: | |
usecases = json.load(file) | |
logger.debug(f"Loaded {len(usecases['usecases'])} use cases from JSON file") | |
# Function to obtain an access token | |
def get_access_token(username, password): | |
try: | |
url_token = "https://slabstech-dhwani-server.hf.space/v1/token" | |
payload = {"username": username, "password": password} | |
response_token = requests.post(url_token, json=payload) | |
response_token.raise_for_status() | |
token_data = response_token.json() | |
if 'token' in token_data: | |
token = token_data['token'] | |
elif 'access_token' in token_data: | |
token = token_data['access_token'] | |
else: | |
logger.error("Token not found in response. Full response: %s", response_token.text) | |
return None | |
logger.debug("Successfully acquired access token") | |
return token | |
except requests.exceptions.HTTPError as e: | |
logger.error(f"Token request HTTP error: {e.response.status_code} - {e.response.text}") | |
return None | |
# Function to send text input to the API and retrieve the audio file | |
def get_audio(input_text, usecase_id, token): | |
try: | |
logger.info(f"Starting audio generation request") | |
logger.debug(f"Inputs - Text: '{input_text}', UseCase ID: {usecase_id}") | |
# Use case validation | |
logger.debug(f"Looking up use case ID: {usecase_id}") | |
usecase = next((uc for uc in usecases["usecases"] if str(uc["id"]) == str(usecase_id)), None) | |
if not usecase: | |
logger.error(f"Use case {usecase_id} not found in available options") | |
return f"Error: Invalid use case ID {usecase_id}" | |
logger.debug(f"Found use case: {usecase['voice_description']}") | |
# API request | |
url_audio = "https://slabstech-dhwani-server.hf.space/v1/audio/speech" | |
headers = { | |
"accept": "application/json", | |
"Authorization": f"Bearer {token}" | |
} | |
# Construct URL with query parameters | |
query_params = { | |
"input": input_text, | |
"voice": usecase["voice_description"], | |
"model": "ai4bharat/indic-parler-tts", | |
"response_format": "mp3", | |
"speed": 1 | |
} | |
url_audio_with_params = f"{url_audio}?input={input_text}&voice={usecase['voice_description']}&model=ai4bharat%2Findic-parler-tts&response_format=mp3&speed=1" | |
logger.debug(f"Sending request to {url_audio_with_params}") | |
response_audio = requests.post(url_audio_with_params, headers=headers, stream=True) | |
try: | |
response_audio.raise_for_status() | |
except requests.exceptions.HTTPError as e: | |
logger.error(f"Audio API HTTP error: {e.response.status_code} - {e.response.text}") | |
return f"API Error: {e.response.status_code} - {e.response.text}" | |
# File handling | |
audio_file_path = f"usecase_{usecase['id']}_output.mp3" # Short and meaningful filename | |
logger.debug(f"Saving audio to: {audio_file_path}") | |
try: | |
with open(audio_file_path, "wb") as audio_file: | |
for chunk in response_audio.iter_content(chunk_size=1024): | |
if chunk: | |
audio_file.write(chunk) | |
logger.info(f"Successfully saved audio file: {audio_file_path}") | |
return audio_file_path | |
except IOError as e: | |
logger.error(f"File save error: {str(e)}") | |
return f"Error saving file: {str(e)}" | |
except Exception as e: | |
logger.error(f"Unexpected error: {str(e)}\n{traceback.format_exc()}") | |
return f"Critical error: {str(e)}" | |
# Gradio interface | |
with gr.Blocks() as demo: | |
with gr.Row(): | |
username_input = gr.Textbox(label="Username") | |
password_input = gr.Textbox(label="Password", type="password") | |
input_text = gr.Textbox(label="Input Text") | |
usecase_dropdown = gr.Dropdown( | |
label="Use Case", | |
choices=[f"{uc['id']}: {uc['voice_description']}" for uc in usecases["usecases"]], | |
) | |
generate_button = gr.Button("Generate Audio") | |
audio_output = gr.Audio(label="Output") | |
def process_request(input_text, usecase_entry, username, password): | |
logger.debug(f"Processing request - User: {username}, Selection: {usecase_entry}") | |
# Extract use case ID from the selected entry | |
usecase_id = usecase_entry.split(":")[0].strip() | |
# Obtain access token | |
token = get_access_token(username, password) | |
if not token: | |
return "Error: Unable to authenticate" | |
return get_audio(input_text, usecase_id, token) | |
generate_button.click( | |
fn=process_request, | |
inputs=[input_text, usecase_dropdown, username_input, password_input], | |
outputs=audio_output | |
) | |
if __name__ == "__main__": | |
demo.launch(share=True) | |