Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import os | |
| import google.generativeai as genai | |
| import requests | |
| import json | |
| # ------------------- MODEL MANAGER ------------------- | |
| def get_available_gemini_models(api_key): | |
| url = "https://generativelanguage.googleapis.com/v1beta/models" | |
| response = requests.get(f"{url}?key={api_key}") | |
| if response.status_code == 200: | |
| models = response.json().get("models", []) | |
| return [m["name"] for m in models if "generateContent" in m.get("supportedGenerationMethods", [])] | |
| return [] | |
| def pick_best_gemini_model(models): | |
| preferred = [ | |
| "gemini-1.5-pro", | |
| "gemini-1.5-flash", | |
| "gemini-1.0-pro-vision-latest", | |
| "gemini-1.5-flash-002", | |
| "gemini-2.5-pro", | |
| "gemini-2.5-flash" | |
| ] | |
| for name in preferred: | |
| for model in models: | |
| if name in model: | |
| return model | |
| return models[0] if models else None | |
| def pick_best_groq_model(models): | |
| # prioritize based on Groq's known models | |
| preferred = ["llama3-70b-8192", "llama3-8b-8192", "mixtral-8x7b-32768", "gemma-7b-it"] | |
| for name in preferred: | |
| for model in models: | |
| if name in model: | |
| return model | |
| return models[0] if models else None | |
| # ------------------- MAIN FUNCTION ------------------- | |
| def generate_reply(user_input, api_key, model_type): | |
| if model_type == "Gemini": | |
| genai.configure(api_key=api_key) | |
| models = get_available_gemini_models(api_key) | |
| selected_model = pick_best_gemini_model(models) | |
| if not selected_model: | |
| return "β No compatible Gemini model found." | |
| model = genai.GenerativeModel(selected_model) | |
| try: | |
| response = model.generate_content(user_input) | |
| return response.text if hasattr(response, "text") else str(response) | |
| except Exception as e: | |
| return f"β Gemini API Error: {str(e)}" | |
| elif model_type == "Groq": | |
| client = Groq(api_key=api_key) | |
| try: | |
| models = [m.id for m in client.models.list().data] | |
| selected_model = pick_best_groq_model(models) | |
| if not selected_model: | |
| return "β No compatible Groq model found." | |
| response = client.chat.completions.create( | |
| model=selected_model, | |
| messages=[{"role": "user", "content": user_input}], | |
| ) | |
| return response.choices[0].message.content | |
| except Exception as e: | |
| return f"β Groq API Error: {str(e)}" | |
| else: | |
| return "β Invalid model type." | |
| # ------------------- GRADIO UI ------------------- | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## π Voice-to-LLM Assistant") | |
| with gr.Row(): | |
| api_key = gr.Textbox(label="π API Key (Gemini / Groq)", type="password") | |
| model_type = gr.Dropdown(choices=["Gemini", "Groq"], label="π€ Choose Model Type", value="Gemini") | |
| mic_input = gr.Audio(type="filepath", label="π€ Speak Now", interactive=True) | |
| transcribed_text = gr.Textbox(label="π Transcribed Text") | |
| response_text = gr.Textbox(label="π‘ AI Response") | |
| def transcribe_and_generate(audio, api_key, model_type): | |
| import whisper | |
| model = whisper.load_model("base") | |
| result = model.transcribe(audio) | |
| text = result["text"] | |
| reply = generate_reply(text, api_key, model_type) | |
| return text, reply | |
| btn = gr.Button("π Generate") | |
| btn.click(fn=transcribe_and_generate, inputs=[mic_input, api_key, model_type], outputs=[transcribed_text, response_text]) | |
| demo.launch() | |