RealtimeVoiceChat - 약 500ms 지연 시간의 실시간 AI 음성 채팅
(github.com/KoljaB)- 브라우저 마이크를 이용해 AI와 자연스러운 음성 대화를 실시간으로 나눌 수 있는 시스템
- STT → LLM → TTS 흐름을 통해 사용자의 음성을 텍스트로 바꾸고, AI 응답을 다시 음성으로 변환해 재생
- 핵심 구성요소는 FastAPI 서버, WebSocket 스트리밍, Pod 기반 음성 처리 모듈, 다양한 LLM 백엔드
- Docker 기반 배포 환경이 제공되며, GPU 사용 시 더욱 낮은 지연시간과 성능 향상을 기대할 수 있음
- 사용자 인터럽트 감지, 모델 교체, 음성 선택 등 고급 설정 변경 가능성이 뛰어난 커스터마이징 환경을 제공
실시간 AI 음성 채팅
- 이 프로젝트는 실시간 양방향 음성 대화를 위해 설계된 클라이언트-서버 아키텍처임
- 사용자는 브라우저에서 말을 하고, AI가 응답을 음성으로 반환함
- 인터럽트 처리, 부분 텍스트 응답 표시, 다양한 TTS 선택이 가능함
주요 동작 흐름
- 음성 입력: 브라우저에서 사용자의 음성을 캡처
- 스트리밍 전송: 오디오 청크를 WebSocket을 통해 Python 백엔드로 전송
-
음성 인식:
RealtimeSTT
가 음성을 텍스트로 변환 - LLM 처리: 텍스트를 LLM에 전달하여 응답 생성
-
음성 변환:
RealtimeTTS
가 응답 텍스트를 음성으로 변환 - 응답 재생: 생성된 음성을 브라우저로 다시 스트리밍
- 인터럽트 감지: 사용자의 끼어들기를 자동으로 감지 및 처리
주요 기능
- 실시간 음성 대화 및 부분 전사/응답 미리보기
- 낮은 지연시간을 위한 오디오 청크 기반 스트리밍
- 정적/동적 침묵 탐지(turn detection) 지원
- 다양한 LLM 백엔드: Ollama 기본, OpenAI 선택 가능
- 여러 TTS 엔진 지원: Kokoro, Coqui, Orpheus
- 웹 인터페이스 제공: Web Audio API 기반의 Vanilla JS UI
- Docker Compose 기반 배포 제공
기술 스택
- 백엔드: Python 3.x, FastAPI
- 프론트엔드: HTML, CSS, JavaScript (Web Audio API)
- 통신: WebSockets
- 컨테이너화: Docker, Docker Compose
-
AI/ML 라이브러리:
-
RealtimeSTT
,RealtimeTTS
,transformers
,torch
,torchaudio
-
ollama
,openai
-
-
오디오 처리:
numpy
,scipy
시스템 요구사항 및 권장사항
- 운영체제: Linux에서 Docker 사용 권장 (GPU 통합 유리)
- Python 3.9+, CUDA 12.1 이상 NVIDIA GPU 권장
- Docker 사용 시 NVIDIA Container Toolkit 필수
- Ollama 또는 OpenAI API Key 필요시 설정
설치 방법
옵션 A: Docker 설치 (권장)
- 리포지토리 클론 후
docker compose build
-
docker compose up -d
로 앱 및 Ollama 시작 - 별도로 Ollama 모델 다운로드 (예:
docker compose exec ollama ollama pull ...
) - 서비스 종료:
docker compose down
- 재시작:
docker compose up -d
옵션 B: 수동 설치
- Python venv 설정 후 의존성 설치
- CUDA 버전에 맞는 PyTorch 수동 설치
-
server.py
실행하여 FastAPI 서버 시작
실행 방법
- 브라우저에서
http://localhost:8000
접속 - 마이크 권한 허용 후 "Start" 클릭
- "Stop"으로 종료, "Reset"으로 대화 초기화
설정 변경 안내
-
TTS 엔진/음성 변경:
server.py
,audio_module.py
에서 수정 -
LLM 모델/백엔드 변경:
server.py
,llm_module.py
에서 설정 -
STT 모델/침묵 기준 변경:
transcribe.py
,turndetect.py
-
SSL 설정 가능:
server.py
에서 HTTPS 사용 여부 및 인증서 설정
라이선스
- MIT 라이선스 기반으로 공개됨
- Coqui 등 외부 엔진은 별도 라이선스 적용
Hacker News 의견
-
RealtimeVoiceChat을 개발한 이유는 대부분의 음성 AI 상호작용에서 지연 시간이 불만족스러웠기 때문임. 이 시스템은 실시간, 로컬 음성 대화를 위해 설계된 오픈 소스 시스템임
- 자연스러운 대화 속도에 가까워지는 것이 목표임
- WebSockets를 통한 오디오 청크 스트리밍, Whisper 기반의 RealtimeSTT, Coqui XTTSv2/Kokoro 같은 엔진을 지원하는 RealtimeTTS를 사용하여 약 500ms의 응답 지연 시간을 달성함
- Ollama를 통해 24B Mistral과 같은 더 큰 로컬 모델을 실행할 때도 가능함
- 주요 특징: 로컬 LLMs를 위해 설계됨 (주로 Ollama, OpenAI 커넥터 포함), 대화 중단 가능, 사용자의 생각을 끊지 않기 위한 스마트 턴 감지, 의존성 관리를 쉽게 하기 위한 Dockerized 설정 제공
- STT/TTS 모델로 인해 성능을 위해 CUDA 지원 GPU가 필요함
- 접근 방식, 성능, 잠재적 최적화 또는 좋은 로컬 음성 AI 경험을 위한 필수 기능에 대한 피드백을 듣고 싶음
- 코드: https://github.com/KoljaB/RealtimeVoiceChat
-
이러한 도구의 사용자로서, 빠르긴 하지만 자연스럽게 말할 때의 멈춤을 허용하지 않음
- 대화 중 우리는 생각하거나 다른 이유로 긴 멈춤과 짧은 멈춤을 가짐
- 이러한 도구에서는 우리가 멈추면 AI가 바로 말을 시작함
- 몇 주 전 트위터에서 AI가 사람이 실제로 말을 끝낼 때까지 기다리는 데모를 봄. 멈춤 길이는 문제가 되지 않음
- 이 문제가 얼마나 복잡한지는 모르겠음. 아마도 또 다른 AI가 입력을 분석하여 멈춤인지 아닌지를 결정해야 할 것임
-
매우 멋짐! 중단 기능이 "와우" 순간이었음 (새로운 것은 아니지만 오픈 소스에서 이렇게 잘 구현된 것을 보는 것은 놀라움)
- 중단 기능에 대한 질문: "Mmk", "Yes", "Of course", "기침" 등은 어떻게 처리하는지 궁금함
- OpenAI의 음성 채팅에서의 아첨 외에도, 소음이 AI의 응답을 멈추게 하고 다시 시작할 좋은 방법이 없다는 점이 싫음
- 빠르게 응답을 멈추고 좋은 이유로 멈추는 것이 어려운 문제임
-
약 1년 전 이 주제에 대해 연구를 했음. 몇 가지 재미있는 사실을 배움
- 인간 간의 대화에서 화자 간의 중간 지연 시간은 0밀리초임. 즉, 약 절반의 시간 동안 한 화자가 다른 화자를 중단하여 지연이 음수가 됨
- 인간은 알려진 AI와 대화할 때 지연에 신경 쓰지 않음. AI가 생각할 시간이 필요하다고 가정함. 대부분의 사용자는 1000ms 지연을 허용 가능하다고 보고 500ms 지연을 예외적으로 여김
- 모든 음성 비서는 약 300ms의 최소 지연 시간을 가짐. 이는 모두 침묵 감지를 사용하여 응답을 시작할 때를 결정하기 때문이며, 약 300ms의 침묵이 화자의 일반적인 멈춤과 확실히 구별되기 위해 필요함
- Alexa는 느린 화자를 위해 이 대기 시간을 늘리는 설정을 가지고 있음
- 이 데모 비디오에서 AI가 그를 중단하지 않는 것을 볼 수 있음. 이는 인간과의 상호작용처럼 느껴지지 않게 만듦 (음성의 어색한 억양도 포함)
- 인간은 문장을 실시간으로 처리하며, 문장의 의미를 이해할 만큼 충분히 들었다고 확신할 때 응답함
-
훌륭함. 소스를 살펴보니, 저자가 Silero VAD 대신 맞춤형 턴 감지 전략을 구현한 것이 흥미로움. 왜 이렇게 했는지, 어떤 이점을 관찰했는지 궁금함
- 음성 에이전트 공간의 상태에 대해 궁금한 사람들을 위해 Daily(웹RTC 회사)가 훌륭한 가이드와 많은 유틸리티가 포함된 오픈 소스 프레임워크를 제공함
- 참고: 나는 Cartesia에서 일하며, 많은 음성 에이전트 사용 사례를 서비스하고 있음. Daily는 친구임
-
LLMs가 더 짧은 응답을 위해 조정되어야 한다고 느끼기 시작함. 짧은 문장을 입력하면 긴 문단의 텍스트를 출력함
- 때로는 좋은 텍스트이지만, 모든 입력 문장이 미니 에세이 응답을 필요로 하지는 않음
- 매우 멋진 프로젝트임. AI의 대화 성향을 변경하기 위해 프롬프트를 미세 조정할 수 있을 것임
-
아무도 언급하지 않은 것이 놀라움. 인간처럼 상호작용하며, 충분한 컨텍스트가 있을 때 많은 상황에서 나를 중단함. 매우 낮은 지연 시간을 가짐
- 처음 사용했을 때 꽤 충격적인 경험이었음
-
꽤 좋음. SOTA 음성으로 들리면 훨씬 더 좋을 것임
-
인상적임! 현재 사용 가능한 오픈 소스 중 최고의 음성 합성 품질이라고 생각함
- 최종 목표는 텍스트 토큰이 전혀 없는, 계속 실행되는 파형 대 파형 모델일 것임
-
비슷한 것을 작업 중이었는데 이것을 발견함. 훌륭한 작업임. 데모를 좋아함