Spaces:
Sleeping
Sleeping
File size: 2,250 Bytes
82d84c7 e8589a9 82d84c7 e8589a9 82d84c7 79312d0 82d84c7 40e71b1 82d84c7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
import os
import gradio as gr
from transformers import pipeline
from llama_index import SimpleDirectoryReader, GPTVectorStoreIndex
from llama_index.llm_predictor import HuggingFaceLLMPredictor, LLMPredictor
# Optional OpenAI import remains for default predictor
import openai
# --- Whisper ASR setup ---
asr = pipeline(
"automatic-speech-recognition",
model="openai/whisper-small",
device=0,
chunk_length_s=30,
)
# --- LlamaIndex utils import ---
from utils.llama_index_utils import get_llm_predictor, build_index, query_symptoms
# --- System prompt ---
SYSTEM_PROMPT = """
You are a medical assistant helping a user narrow down to the most likely ICD-10 code.
At each turn, EITHER ask one focused clarifying question (e.g. “Is your cough dry or productive?”)
or, if you have enough info, output a final JSON with fields:
{"diagnoses":[…], "confidences":[…]}.
"""
def transcribe_and_respond(audio, history):
# 1) Transcribe audio → text
user_text = asr(audio)["text"]
history = history or []
history.append(("user", user_text))
# 2) Build unified prompt for LLM
messages = [("system", SYSTEM_PROMPT)] + history
prompt = "\n".join(f"{role.capitalize()}: {text}" for role, text in messages)
prompt += "\nAssistant:"
# 3) Select predictor (OpenAI or Mistral/local)
predictor = get_llm_predictor()
resp = predictor.predict(prompt)
# 4) If JSON-style output, treat as final
if resp.strip().startswith("{"):
result = query_symptoms(resp)
history.append(("assistant", f"Here is your diagnosis: {result}"))
return "", history
# 5) Otherwise, it's a follow-up question
history.append(("assistant", resp))
return "", history
# --- Build Gradio app ---
with gr.Blocks() as demo:
gr.Markdown("## Symptom to ICD-10 Diagnoser (audio & chat)")
chatbot = gr.Chatbot(label="Conversation")
mic = gr.Microphone(label="Describe your symptoms")
state = gr.State([])
mic.submit(
fn=transcribe_and_respond,
inputs=[mic, state],
outputs=[mic, chatbot, state]
)
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
server_port=7860,
mcp_server=True
)
|