import gradio as gr import requests import logging import json import os # Configure logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logger = logging.getLogger(__name__) # Load the JSON file containing use cases with open("voice_description_indian.json", "r") as file: usecases = json.load(file) def get_api_token(): username = os.getenv('USERNAME') password = os.getenv('PASSWORD') if not username or not password: raise ValueError("Environment variables USERNAME and PASSWORD must be set.") url = 'https://slabstech-dhwani-server.hf.space/v1/token' headers = {'accept': 'application/json', 'Content-Type': 'application/json'} payload = {"username": username, "password": password} response = requests.post(url, json=payload, headers=headers) if response.status_code == 200: return response.json().get('access_token') else: logger.error(f"Failed to get API token: {response.text}") return None def get_audio(input_text, usecase_id): try: api_token = get_api_token() if not api_token: return "Error: Failed to obtain API token." # Retrieve the selected use case usecase = next((uc for uc in usecases["usecases"] if uc["id"] == usecase_id), None) if not usecase: return f"Error: Use case with ID {usecase_id} not found." voice_description = usecase.get("voice_description") if not voice_description: return "Error: Missing voice description in the use case JSON." logger.info(f"Voice Description: {voice_description}") logger.info(f"Input Text: {input_text}") url = f"https://slabstech-dhwani-server.hf.space/v1/audio/speech" headers = { "Authorization": f"Bearer {api_token}", "accept": "application/json" } params = { "input": input_text, "voice": voice_description, "model": "ai4bharat/indic-parler-tts", "response_format": "mp3", "speed": 1.0 } response = requests.post(url, headers=headers, params=params) if response.status_code == 200: logger.info(f"API request successful. Status code: {response.status_code}") audio_file_path = f"{usecase_id}_output.mp3" with open(audio_file_path, "wb") as audio_file: audio_file.write(response.content) logger.info(f"Audio file saved to: {audio_file_path}") return audio_file_path else: logger.error(f"API request failed. Status code: {response.status_code}, {response.text}") return None except Exception as e: logger.error(f"Exception in get_audio: {e}") return None demo = gr.Interface( fn=get_audio, inputs=[ gr.Textbox(label="Enter Text", placeholder="Type your text here..."), gr.Dropdown( label="Select Use Case", choices=[f"{uc['id']}: {uc['voice_description']}" for uc in usecases["usecases"]], type="index" ) ], outputs=gr.Audio(label="Generated Audio"), ) if __name__ == "__main__": try: demo.launch(show_error=True) except Exception as e: logger.error(f"Failed to launch Gradio demo: {e}")