17 pontos por GN⁺ 2025-05-06 | 2 comentários | Compartilhar no WhatsApp
  • Sistema que permite conversas de voz naturais com IA em tempo real usando o microfone do navegador
  • Por meio do fluxo STT → LLM → TTS, converte a voz do usuário em texto e depois transforma a resposta da IA novamente em voz para reprodução
  • Os principais componentes são servidor FastAPI, streaming via WebSocket, módulo de processamento de voz baseado em Pods e diversos backends de LLM
  • Um ambiente de implantação baseado em Docker é fornecido, e com GPU é possível esperar latência ainda menor e melhor desempenho
  • Oferece um ambiente altamente customizável, com grande flexibilidade para alterar configurações avançadas como detecção de interrupção do usuário, troca de modelo e seleção de voz

Chat de voz com IA em tempo real

  • Este projeto foi projetado com uma arquitetura cliente-servidor para conversas de voz bidirecionais em tempo real
  • O usuário fala no navegador, e a IA retorna a resposta em voz
  • Suporta tratamento de interrupções, exibição parcial do texto de resposta e diferentes opções de TTS

Fluxo principal de funcionamento

  1. Entrada de voz: captura a fala do usuário no navegador
  2. Transmissão por streaming: envia chunks de áudio ao backend em Python via WebSocket
  3. Reconhecimento de fala: RealtimeSTT converte a voz em texto
  4. Processamento pelo LLM: envia o texto ao LLM para gerar uma resposta
  5. Conversão em voz: RealtimeTTS transforma o texto de resposta em fala
  6. Reprodução da resposta: faz streaming do áudio gerado de volta para o navegador
  7. Detecção de interrupção: detecta e trata automaticamente quando o usuário interrompe

Principais recursos

  • Conversa por voz em tempo real e prévia parcial de transcrição/resposta
  • Streaming baseado em chunks de áudio para baixa latência
  • Suporte a detecção de silêncio estática/dinâmica (turn detection)
  • Diversos backends de LLM: Ollama por padrão, com OpenAI opcional
  • Suporte a vários motores de TTS: Kokoro, Coqui, Orpheus
  • Interface web disponível: UI em Vanilla JS baseada em Web Audio API
  • Implantação baseada em Docker Compose

Stack tecnológica

  • Backend: Python 3.x, FastAPI
  • Frontend: HTML, CSS, JavaScript (Web Audio API)
  • Comunicação: WebSockets
  • Conteinerização: Docker, Docker Compose
  • Bibliotecas de IA/ML:
    • RealtimeSTT, RealtimeTTS, transformers, torch, torchaudio
    • ollama, openai
  • Processamento de áudio: numpy, scipy

Requisitos e recomendações do sistema

  • Sistema operacional: recomendado usar Docker no Linux (melhor integração com GPU)
  • Python 3.9+, recomenda-se GPU NVIDIA com CUDA 12.1 ou superior
  • Ao usar Docker, o NVIDIA Container Toolkit é obrigatório
  • Configure Ollama ou uma OpenAI API Key quando necessário

Como instalar

Opção A: Instalação com Docker (recomendada)

  1. Clone o repositório e execute docker compose build
  2. Inicie o app e o Ollama com docker compose up -d
  3. Baixe separadamente o modelo do Ollama (ex.: docker compose exec ollama ollama pull ...)
  4. Encerrar os serviços: docker compose down
  5. Reiniciar: docker compose up -d

Opção B: Instalação manual

  1. Configure um Python venv e instale as dependências
  2. Instale manualmente o PyTorch compatível com sua versão do CUDA
  3. Execute server.py para iniciar o servidor FastAPI

Como executar

  • Acesse http://localhost:8000 no navegador
  • Permita o acesso ao microfone e clique em "Start"
  • Use "Stop" para encerrar e "Reset" para reinicializar a conversa

Guia de alteração de configurações

  • Alterar motor/voz de TTS: edite server.py e audio_module.py
  • Alterar modelo/backend de LLM: configure em server.py e llm_module.py
  • Alterar modelo de STT/critérios de silêncio: transcribe.py, turndetect.py
  • Configuração de SSL disponível: em server.py, defina uso de HTTPS e certificados

Licença

  • Disponibilizado sob a licença MIT
  • Motores externos como Coqui seguem licenças próprias

2 comentários

 
nicewook 2025-05-10

O vídeo de demonstração do original é impressionante.

  1. Eu tinha esse desejo de que a conversa fosse natural, e nesse nível parece que isso é atendido de forma bem satisfatória.
  2. Eu também queria poder acompanhar a conversa em texto em tempo real, e essa parte também ficou muito boa.
  3. Seria bom se a IA ouvisse o suficiente sem me interromper e só depois falasse. Por exemplo, quando não tiver certeza, fazer perguntas como "Você terminou de falar?", "Posso falar agora?" e então começar a própria fala.
  4. Também seria bom se houvesse algo que incentivasse tanto a IA quanto a pessoa a não interromperem um ao outro
 
GN⁺ 2025-05-06
Comentários do Hacker News
  • O motivo para desenvolver o RealtimeVoiceChat foi que a latência na maioria das interações com IA por voz era insatisfatória. Este é um sistema open source projetado para conversas de voz locais em tempo real

    • O objetivo é chegar mais perto de uma velocidade de conversa natural
    • Alcança cerca de 500 ms de latência de resposta usando streaming de chunks de áudio via WebSockets, RealtimeSTT baseado em Whisper e RealtimeTTS com suporte a motores como Coqui XTTSv2/Kokoro
    • Isso também é possível ao executar modelos locais maiores, como o Mistral 24B, via Ollama
    • Principais recursos: projetado para LLMs locais (principalmente Ollama, com conector OpenAI incluído), possibilidade de interromper a conversa, detecção inteligente de turno para não cortar o raciocínio do usuário, configuração Dockerized para facilitar o gerenciamento de dependências
    • Por causa dos modelos de STT/TTS, é necessária uma GPU com suporte a CUDA para desempenho
    • Gostaria de ouvir feedback sobre a abordagem, desempenho, possíveis otimizações ou recursos essenciais para uma boa experiência local de IA por voz
    • Código: https://github.com/KoljaB/RealtimeVoiceChat
  • Como usuário desse tipo de ferramenta, ela é rápida, mas não permite pausas ao falar naturalmente

    • Em uma conversa, fazemos pausas longas e curtas para pensar ou por outros motivos
    • Nessas ferramentas, assim que paramos, a IA começa a falar imediatamente
    • Algumas semanas atrás vi no Twitter uma demo em que a IA esperava até a pessoa realmente terminar de falar. A duração da pausa não importava
    • Não sei o quão complexo é esse problema. Talvez seja necessário outra IA para analisar a entrada e decidir se é uma pausa ou não
  • Muito legal! O recurso de interrupção foi o momento de "uau" (não é algo novo, mas é surpreendente ver isso tão bem implementado em open source)

    • Uma dúvida sobre a interrupção: gostaria de saber como ele lida com "Mmk", "Yes", "Of course", "tosse" etc.
    • Além da bajulação no chat de voz da OpenAI, uma coisa que não gosto é que ruídos fazem a IA parar de responder e não há uma boa forma de retomar
    • Parar a resposta rapidamente e parar pelos motivos certos é um problema difícil
  • Pesquisei esse tema há cerca de 1 ano. Aprendi alguns fatos interessantes

    • Em conversas entre humanos, a latência mediana entre falantes é de 0 milissegundos. Ou seja, em cerca de metade do tempo um falante interrompe o outro, então a latência fica negativa
    • Humanos não se importam com latência quando conversam com uma IA conhecida. Eles assumem que a IA precisa de tempo para pensar. A maioria dos usuários considera aceitável uma latência de 1000 ms e vê 500 ms como excepcional
    • Todos os assistentes de voz têm uma latência mínima de cerca de 300 ms. Isso acontece porque todos usam detecção de silêncio para decidir quando começar a responder, e cerca de 300 ms de silêncio são necessários para distinguir com segurança isso de uma pausa comum do falante
    • A Alexa tem uma configuração para aumentar esse tempo de espera para falantes mais lentos
    • Nesta demo em vídeo dá para ver que a IA não o interrompe. Isso faz com que não pareça uma interação humana (incluindo a entonação estranha da voz)
    • Humanos processam frases em tempo real e respondem quando têm confiança de que já ouviram o suficiente para entender o significado da frase
  • Excelente. Olhando o código-fonte, achei interessante que o autor implementou uma estratégia personalizada de detecção de turno em vez de usar Silero VAD. Fiquei curioso sobre o motivo disso e quais vantagens ele observou

    • Para quem tem curiosidade sobre o estado do espaço de agentes de voz, a Daily (empresa de WebRTC) oferece um excelente guia e um framework open source com muitos utilitários
    • Observação: trabalho na Cartesia, atendendo muitos casos de uso de agentes de voz. A Daily é parceira
  • Estou começando a achar que os LLMs deveriam ser ajustados para respostas mais curtas. Você digita uma frase curta e recebe um parágrafo longo de texto

    • Às vezes é um bom texto, mas nem toda frase de entrada precisa de uma resposta em miniensaio
    • Projeto muito legal. Talvez seja possível ajustar finamente o prompt para mudar a tendência conversacional da IA
  • Surpreso que ninguém mencionou isso. Interage como um humano e me interrompe em muitas situações quando há contexto suficiente. Tem latência muito baixa

    • Foi uma experiência bem impactante quando usei pela primeira vez
  • Muito bom. Ficaria muito melhor se soasse como voz SOTA

  • Impressionante! Acho que é a melhor qualidade de síntese de voz entre os open source disponíveis hoje

    • O objetivo final provavelmente seria um modelo contínuo de waveform para waveform, sem nenhum token de texto
  • Eu estava trabalhando em algo parecido e encontrei isto. Excelente trabalho. Gostei da demo