elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Python (Moderador: Danielㅤ)
| | |-+  [APORTE] Recepcionista telefónica con IA local en Python (Asterisk AudioSocket + Ollama + Parakeet)
0 Usuarios y 4 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [APORTE] Recepcionista telefónica con IA local en Python (Asterisk AudioSocket + Ollama + Parakeet)  (Leído 47 veces)
jupacalo

Desconectado Desconectado

Mensajes: 1


Ver Perfil
[APORTE] Recepcionista telefónica con IA local en Python (Asterisk AudioSocket + Ollama + Parakeet)
« en: Hoy a las 13:39 »

Hola a todos. Comparto un proyecto que tengo funcionando en producción, por si a alguien le sirve o le da ideas.

Tenía una línea fija de negocio llena de llamadas comerciales y, cuando estaba trabajando, se me escapaban las de clientes. Así que monté una recepcionista con IA que contesta esa línea, todo en local y sin pagar nada por minuto:

Línea fija → Grandstream HT813 (adaptador FXO) → FreePBX 17 en una máquina virtual.
Asterisk AudioSocket: el dialplan manda el audio de la llamada por TCP a un servicio en Python con asyncio, en un PC con tarjeta gráfica.
Voz a texto: Parakeet TDT 0.6B v3 con whisper.cpp en una AMD RX 6800 por Vulkan, 50-200 ms por frase.
IA: qwen2.5:14b en Ollama, en streaming troceado por frases. La primera frase está lista en 0,6-1,1 s.
Voz: Piper, en CPU.
Avisos: resumen de cada llamada por Telegram.
Lo que hace: contesta, toma recados, cuelga a los comerciales y, en horario, me pasa la llamada al móvil por Tailscale (sin abrir puertos). Si no lo cojo, vuelve a atender.

Lo que más me costó, por si a alguien le ahorra tiempo:

No fiarse de la IA para las acciones. Los comerciales evidentes se filtran con expresiones regulares antes de que la IA vea nada ("¿hablo con el titular de la línea?" es la frase que más los delata). Para colgar o pasar la llamada, la IA dice una frase exacta y es Python quien actúa al detectarla en la respuesta del bot.
La caché del prompt importa más que el modelo. Con gemma3:12b había unos 3 s de silencio en cada turno porque releía todas las instrucciones; qwen2.5:14b reutiliza la caché de Ollama y contesta en menos de 1 s.
Intentos de manipularla. Hubo quien llamó para que "ignorara sus instrucciones". Las frases típicas se cortan con una respuesta fija sin pasar por la IA, y al tercer intento cuelga.
Dos modelos en la misma gráfica se pisan. Si otro servicio usa un modelo distinto, Ollama saca de la VRAM el del teléfono y la siguiente llamada espera unos 18 s. Solución: el mismo modelo y el mismo contexto para todo.
El eco de la línea. El bot oía su propio saludo y se contestaba a sí mismo. Ahora compara lo que oye con lo que está diciendo; si coinciden más del 60 % de las palabras, lo descarta:

Código
  1. def es_eco(self, texto: str, duracion: float) -> bool:
  2.    """¿Lo oído es el propio bot devuelto por la línea? Si la mayoría de sus palabras
  3.    son las que el bot estaba diciendo a la vez, es eco."""
  4.    def palabras(t):
  5.        t = unicodedata.normalize("NFD", t.lower())
  6.        t = "".join(c for c in t if unicodedata.category(c) != "Mn")   # sin tildes
  7.        return [p for p in re.findall(r"[a-zñ]+", t) if len(p) >= 3]
  8.    oido = palabras(texto)
  9.    if len(oido) < 2:
  10.        return False
  11.    desde = time.time() - duracion - 1.5        # cuándo empezó la frase oída
  12.    dicho = set(palabras(self.sonando))         # lo que está sonando ahora
  13.    for ini, fin, t in self.sonado:             # y lo que sonó hace poco
  14.        if fin >= desde - 0.5:
  15.            dicho.update(palabras(t))
  16.    return sum(p in dicho for p in oido) / len(oido) >= 0.6
  17.  

Con la transcripción "Hola, me llamamos a TV. Ahora estamos fuera de nuestro horario…" (que era su propio saludo mal transcrito) da 0,8 y se descarta. "Quería un presupuesto para un portero automático" da 0 y pasa.

Si alguien quiere probarla llamando, que me escriba por privado y le paso el número. Encantado de responder dudas sobre cualquier parte.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como obtener la dirección ip local en Python [solucionado]
Scripting
Yeison.Eng 2 12,845 Último mensaje 31 Diciembre 2010, 19:49 pm
por Yeison.Eng
[python]aporte comodines ip
Scripting
daryo 0 2,654 Último mensaje 2 Mayo 2013, 02:34 am
por daryo
[APORTE]Web-crawler Python
Scripting
Señor X 0 6,403 Último mensaje 20 Noviembre 2014, 17:53 pm
por Señor X
Tramposo aporte de python y vbs
Scripting
tincopasan 1 3,194 Último mensaje 11 Julio 2016, 20:47 pm
por MCKSys Argentina
Alguien usando LLM gratuitos como ollama + mistral?
Programación General
Parado_larga_duracion_ESP 0 3,153 Último mensaje 19 Febrero 2024, 16:39 pm
por Parado_larga_duracion_ESP
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines