import gradio as gr import requests import json import os API_KEY = os.getenv("API_KEY") if not API_KEY: raise ValueError("API_KEY environment variable must be set") def process_audio_stream(audio_path, max_tokens): """ Process audio with streaming response via HTTP """ if not audio_path: yield "Please upload or record an audio file first." return try: # Read and prepare audio file with open(audio_path, 'rb') as audio_file: files = { 'audio_file': ('audio.wav', audio_file, 'audio/wav') } data = { 'prompt': "", 'max_tokens': max_tokens } headers = { 'X-API-Key': API_KEY } # Make streaming request response = requests.post( 'https://nexa-omni.nexa4ai.com/process-audio/', files=files, data=data, headers=headers, stream=True ) if response.status_code != 200: yield f"Error: Server returned status code {response.status_code}" return # Initialize response response_text = "" token_count = 0 # Process the streaming response for line in response.iter_lines(): if line: line = line.decode('utf-8') if line.startswith('data: '): try: data = json.loads(line[6:]) # Skip 'data: ' prefix if data["status"] == "generating": if token_count < 3 and data["token"] in [" ", " \n", "\n", "<|im_start|>", "assistant"]: token_count += 1 continue response_text += data["token"] gr.update(value=response_text) yield response_text elif data["status"] == "complete": break elif data["status"] == "error": yield f"Error: {data['error']}" break except json.JSONDecodeError: continue except Exception as e: yield f"Error processing request: {str(e)}" # Create Gradio interface with specific queue configurations demo = gr.Interface( fn=process_audio_stream, inputs=[ gr.Audio( type="filepath", label="Upload or Record Audio", sources=["upload", "microphone"] ), gr.Slider( minimum=50, maximum=200, value=50, step=1, label="Max Tokens" ) ], outputs=gr.Textbox(label="Response", interactive=False), title="NEXA OmniAudio-2.6B", description=f""" OmniAudio-2.6B is a compact audio-language model optimized for edge deployment. Model Repo: NexaAIDev/OmniAudio-2.6B Blog: OmniAudio-2.6B Blog Upload an audio file and optionally provide a prompt to analyze the audio content.""", examples=[ ["example_audios/voice_qa.mp3", 200], ["example_audios/voice_in_conversation.mp3", 200], ["example_audios/creative_content_generation.mp3", 200], ["example_audios/record_summary.mp3", 200], ["example_audios/change_tone.mp3", 200], ] ) if __name__ == "__main__": # Configure the queue for better streaming performance demo.queue( max_size=20, ).launch( server_name="0.0.0.0", server_port=7860, )