CareCompanion / app.py
Pdro-ruiz's picture
Update app.py
d536a33 verified
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()