17 puntos por GN⁺ 2025-05-06 | 2 comentarios | Compartir por WhatsApp
  • Sistema que permite mantener conversaciones de voz naturales con una IA en tiempo real usando el micrófono del navegador
  • A través del flujo STT → LLM → TTS, convierte la voz del usuario en texto y luego transforma la respuesta de la IA nuevamente en voz para reproducirla
  • Sus componentes principales son servidor FastAPI, streaming por WebSocket, módulo de procesamiento de voz basado en Pods y varios backends de LLM
  • Incluye un entorno de despliegue basado en Docker, y al usar GPU se puede esperar una latencia aún menor y mejor rendimiento
  • Ofrece un entorno muy personalizable con gran capacidad para cambiar configuraciones avanzadas, como detección de interrupciones del usuario, cambio de modelo y selección de voz

Chat de voz con IA en tiempo real

  • Este proyecto está diseñado con una arquitectura cliente-servidor para conversaciones de voz bidireccionales en tiempo real
  • El usuario habla desde el navegador y la IA devuelve la respuesta en voz
  • Permite manejo de interrupciones, visualización parcial de respuestas en texto y varias opciones de TTS

Flujo principal de funcionamiento

  1. Entrada de voz: captura la voz del usuario desde el navegador
  2. Transmisión en streaming: envía fragmentos de audio al backend en Python mediante WebSocket
  3. Reconocimiento de voz: RealtimeSTT convierte la voz en texto
  4. Procesamiento con LLM: envía el texto al LLM para generar una respuesta
  5. Conversión a voz: RealtimeTTS convierte el texto de respuesta en audio
  6. Reproducción de la respuesta: vuelve a transmitir el audio generado al navegador
  7. Detección de interrupciones: detecta y procesa automáticamente cuando el usuario interrumpe

Funciones principales

  • Conversación de voz en tiempo real y transcripción parcial / vista previa de respuestas
  • Streaming basado en fragmentos de audio para baja latencia
  • Soporte para detección de silencio estática/dinámica (turn detection)
  • Varios backends de LLM: Ollama por defecto, OpenAI opcional
  • Soporte para múltiples motores TTS: Kokoro, Coqui, Orpheus
  • Interfaz web incluida: UI en Vanilla JS basada en Web Audio API
  • Despliegue con Docker Compose

Stack tecnológico

  • Backend: Python 3.x, FastAPI
  • Frontend: HTML, CSS, JavaScript (Web Audio API)
  • Comunicación: WebSockets
  • Contenerización: Docker, Docker Compose
  • Bibliotecas de AI/ML:
    • RealtimeSTT, RealtimeTTS, transformers, torch, torchaudio
    • ollama, openai
  • Procesamiento de audio: numpy, scipy

Requisitos y recomendaciones del sistema

  • Sistema operativo: se recomienda usar Docker en Linux (mejor integración con GPU)
  • Python 3.9+ y se recomienda GPU NVIDIA con CUDA 12.1 o superior
  • Si usas Docker, NVIDIA Container Toolkit es obligatorio
  • Configurar Ollama o una API Key de OpenAI si es necesario

Instalación

Opción A: instalación con Docker (recomendada)

  1. Clonar el repositorio y luego ejecutar docker compose build
  2. Iniciar la app y Ollama con docker compose up -d
  3. Descargar por separado el modelo de Ollama (por ejemplo: docker compose exec ollama ollama pull ...)
  4. Detener los servicios: docker compose down
  5. Reiniciar: docker compose up -d

Opción B: instalación manual

  1. Configurar un entorno virtual de Python e instalar las dependencias
  2. Instalar manualmente PyTorch según la versión de CUDA
  3. Ejecutar server.py para iniciar el servidor FastAPI

Cómo usarlo

  • Abrir http://localhost:8000 en el navegador
  • Permitir el acceso al micrófono y hacer clic en "Start"
  • Finalizar con "Stop" y reiniciar la conversación con "Reset"

Guía para cambiar configuraciones

  • Cambiar motor/voz de TTS: modificar server.py y audio_module.py
  • Cambiar modelo/backend de LLM: configurar en server.py y llm_module.py
  • Cambiar modelo STT/criterio de silencio: transcribe.py, turndetect.py
  • Posibilidad de configurar SSL: en server.py se define el uso de HTTPS y los certificados

Licencia

  • Publicado bajo licencia MIT
  • Motores externos como Coqui están sujetos a licencias separadas

2 comentarios

 
nicewook 2025-05-10

El video de demostración original es impresionante.

  1. Tenía el deseo de que la conversación se sintiera natural, y a este nivel parece que lo cumple bastante bien.
  2. También quería poder ver la conversación en texto en tiempo real mientras hablaba, y esta parte también está muy bien.
  3. Estaría bueno que la IA no me interrumpiera y hablara después de escucharme lo suficiente. Por ejemplo, cuando no esté segura, que haga preguntas como "¿Ya terminaste de hablar?", "¿Puedo hablar ahora?" y luego empiece su propia intervención.
  4. También estaría bueno que hubiera algo que ayudara a que ni la IA ni la persona se interrumpan entre sí.
 
GN⁺ 2025-05-06
Opiniones de Hacker News
  • La razón para desarrollar RealtimeVoiceChat fue que la latencia en la mayoría de las interacciones de voz con IA resultaba insatisfactoria. Este sistema es de código abierto y está diseñado para conversaciones de voz locales en tiempo real

    • El objetivo es acercarse a una velocidad de conversación natural
    • Logra una latencia de respuesta de alrededor de 500 ms usando streaming de fragmentos de audio por WebSockets, RealtimeSTT basado en Whisper y RealtimeTTS compatible con motores como Coqui XTTSv2/Kokoro
    • También es posible al ejecutar modelos locales más grandes como Mistral 24B a través de Ollama
    • Características principales: diseñado para LLMs locales (principalmente Ollama, con conector para OpenAI), permite interrupciones, detección inteligente de turnos para no cortar el hilo de pensamiento del usuario, y ofrece una configuración con Docker para facilitar la gestión de dependencias
    • Por los modelos de STT/TTS, se requiere una GPU con soporte CUDA para obtener buen rendimiento
    • Le gustaría recibir comentarios sobre el enfoque, el rendimiento, posibles optimizaciones o las funciones esenciales para una buena experiencia de IA de voz local
    • Código: https://github.com/KoljaB/RealtimeVoiceChat
  • Como usuario de este tipo de herramientas, aunque es rápido, no permite las pausas naturales al hablar

    • En una conversación hacemos pausas largas y cortas, ya sea para pensar o por otras razones
    • En estas herramientas, si nos detenemos, la IA empieza a hablar de inmediato
    • Hace unas semanas vi en Twitter una demo donde la IA esperaba hasta que la persona realmente terminara de hablar. La duración de la pausa no importaba
    • No sé qué tan complejo sea este problema. Tal vez haga falta otra IA que analice la entrada para decidir si es una pausa o no
  • ¡Muy genial! La capacidad de interrupción fue el momento de "wow" (no porque sea algo nuevo, sino porque sorprende verlo tan bien implementado en código abierto)

    • Una pregunta sobre la interrupción: me pregunto cómo maneja cosas como "Mmk", "Yes", "Of course", "tos", etc.
    • Además de lo adulador que es el chat de voz de OpenAI, no me gusta que el ruido haga que la IA detenga su respuesta y que no haya una buena forma de reanudarla
    • Detener una respuesta rápidamente y detenerla por una buena razón es un problema difícil
  • Investigué este tema hace alrededor de un año. Aprendí algunos datos interesantes

    • En conversaciones entre humanos, la latencia media entre turnos de los hablantes es de 0 milisegundos. Es decir, aproximadamente la mitad del tiempo un hablante interrumpe al otro, así que la latencia se vuelve negativa
    • A los humanos no les molesta la latencia cuando hablan con una IA que saben que es IA. Asumen que la IA necesita tiempo para pensar. La mayoría de los usuarios considera aceptable una latencia de 1000 ms y ve 500 ms como algo excepcional
    • Todos los asistentes de voz tienen una latencia mínima de alrededor de 300 ms. Esto se debe a que todos usan detección de silencio para decidir cuándo empezar a responder, y se necesitan unos 300 ms de silencio para distinguirlo con certeza de una pausa normal del hablante
    • Alexa tiene una configuración para aumentar ese tiempo de espera en el caso de hablantes lentos
    • En este video demo se puede ver que la IA no lo interrumpe. Eso hace que no se sienta como una interacción humana (junto con la entonación extraña de la voz)
    • Los humanos procesan las oraciones en tiempo real y responden cuando están seguros de haber escuchado lo suficiente como para entender el significado de la oración
  • Excelente. Al revisar el código fuente, me pareció interesante que el autor implementara una estrategia personalizada de detección de turnos en vez de usar Silero VAD. Me pregunto por qué lo hizo así y qué ventajas observó

    • Para quienes tengan curiosidad sobre el estado del ecosistema de agentes de voz, Daily (la empresa de webRTC) ofrece una excelente guía y un framework de código abierto con muchas utilidades
    • Nota: trabajo en Cartesia, donde damos servicio a muchos casos de uso de agentes de voz. Daily es una empresa amiga
  • Estoy empezando a sentir que los LLMs deberían ajustarse para dar respuestas más cortas. Uno escribe una frase breve y obtiene párrafos largos de texto

    • A veces es buen texto, pero no toda frase de entrada necesita una respuesta en forma de mini ensayo
    • Es un proyecto muy genial. Probablemente se podría afinar el prompt para cambiar la tendencia conversacional de la IA
  • Me sorprende que nadie lo haya mencionado. Interactúa como un humano y me interrumpe en muchas situaciones cuando tiene suficiente contexto. Tiene una latencia muy baja

    • La primera vez que lo usé fue una experiencia bastante impactante
  • Está bastante bien. Sería mucho mejor si sonara como voz SOTA

  • ¡Impresionante! Creo que es la mejor calidad de síntesis de voz entre las opciones de código abierto disponibles actualmente

    • El objetivo final probablemente será un modelo continuo de waveform a waveform, sin tokens de texto en absoluto
  • Estaba trabajando en algo parecido y me topé con esto. Excelente trabajo. Me gustó la demo