File size: 3,299 Bytes
4f7f63d
 
 
 
 
 
fea0f2c
4f7f63d
 
 
d536a33
fea0f2c
 
 
 
 
 
 
36ff13e
d536a33
4f7f63d
 
 
 
d536a33
 
 
 
 
4f7f63d
 
d536a33
 
 
 
 
 
 
4f7f63d
 
 
 
 
 
 
 
 
 
 
 
d536a33
4f7f63d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d536a33
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
76
77
78
79
80
81
82
83
84
import gradio as gr
import spacy
from faster_whisper import WhisperModel
from gtts import gTTS
from transformers import pipeline
import os
import sys
from tools.asesoramiento_tool import asesorar_consulta
from tools.triaje_tool import triaje_primer_tool

# Configuración y carga del modelo de lenguaje especializado
model_dir = os.path.join(os.path.dirname(__file__), "models")
os.makedirs(model_dir, exist_ok=True)
model_path = os.path.join(model_dir, "en_core_sci_md")

if not os.path.exists(model_path):
    os.system(f"{sys.executable} -m spacy download en_core_sci_md --target {model_dir}")
nlp = spacy.load(model_path)

# Cargar modelos de speech-to-text y text-generation
whisper_model = WhisperModel("tiny", device="cpu", compute_type="int8")
health_nlp = pipeline("text-generation", model="mistralai/Mixtral-8x7B-Instruct-v0.1")

def speech_to_text(audio_path):
    try:
        segments, _ = whisper_model.transcribe(audio_path, language="es")
        return " ".join([segment.text for segment in segments])
    except Exception as e:
        return f"Error en la transcripción: {str(e)}"

def text_to_speech(text):
    try:
        tts = gTTS(text, lang="es")
        audio_file = "response.mp3"
        tts.save(audio_file)
        return audio_file
    except Exception as e:
        return None

def process_input(audio, mode="asesoramiento"):
    if audio is None:
        return None, "Por favor, graba algo."
    
    query = speech_to_text(audio)
    
    if mode == "asesoramiento":
        resultado = asesorar_consulta(query)
        respuesta = resultado["respuesta"]
    elif mode == "triaje":
        doc = nlp(query.lower())
        # Se mejora la extracción utilizando una lista ampliada de entidades y posibles sinónimos
        symptoms = [ent.text for ent in doc.ents if ent.label_ in ["SYMPTOM", "DISEASE"]]
        data = {
            "sintomas": " ".join(symptoms) if symptoms else query,
            "intensidad": "moderada",
            "duracion": "6",
            "antecedentes": ""
        }
        resultado = triaje_primer_tool(data)
        respuesta = f"Puntaje: {resultado['score']}. {resultado['recomendacion']}"
    elif mode == "mistral":
        prompt = f"Evalúa: {query}. Sugiere pasos a seguir."
        respuesta = health_nlp(prompt, max_length=150)[0]["generated_text"]
        respuesta += "\n\n*Nota: Este es un asistente de IA y no sustituye el consejo de un profesional médico.*"
    else:
        respuesta = "Modo no reconocido."
    
    audio_response = text_to_speech(respuesta)
    return audio_response, f"Pregunta: {query}\nRespuesta: {respuesta}"

with gr.Blocks(title="Agente Médico Speech-to-Speech") as demo:
    gr.Markdown("# Agente Médico\nHabla y elige un modo: Asesoramiento, Triaje o Mistral.")
    with gr.Row():
        audio_input = gr.Audio(source="microphone", type="filepath", label="Habla aquí")
        mode_select = gr.Radio(["asesoramiento", "triaje", "mistral"], label="Modo", value="asesoramiento")
    with gr.Row():
        audio_output = gr.Audio(label="Respuesta en audio")
        text_output = gr.Textbox(label="Transcripción y Respuesta")
    btn = gr.Button("Procesar")
    
    btn.click(fn=process_input, inputs=[audio_input, mode_select], outputs=[audio_output, text_output])

demo.launch()