16P by GN⁺ 8일전 | ★ favorite | 댓글 2개
  • 브라우저 마이크를 이용해 AI와 자연스러운 음성 대화를 실시간으로 나눌 수 있는 시스템
  • STT → LLM → TTS 흐름을 통해 사용자의 음성을 텍스트로 바꾸고, AI 응답을 다시 음성으로 변환해 재생
  • 핵심 구성요소는 FastAPI 서버, WebSocket 스트리밍, Pod 기반 음성 처리 모듈, 다양한 LLM 백엔드
  • Docker 기반 배포 환경이 제공되며, GPU 사용 시 더욱 낮은 지연시간과 성능 향상을 기대할 수 있음
  • 사용자 인터럽트 감지, 모델 교체, 음성 선택 등 고급 설정 변경 가능성이 뛰어난 커스터마이징 환경을 제공

실시간 AI 음성 채팅

  • 이 프로젝트는 실시간 양방향 음성 대화를 위해 설계된 클라이언트-서버 아키텍처
  • 사용자는 브라우저에서 말을 하고, AI가 응답을 음성으로 반환
  • 인터럽트 처리, 부분 텍스트 응답 표시, 다양한 TTS 선택이 가능함

주요 동작 흐름

  1. 음성 입력: 브라우저에서 사용자의 음성을 캡처
  2. 스트리밍 전송: 오디오 청크를 WebSocket을 통해 Python 백엔드로 전송
  3. 음성 인식: RealtimeSTT가 음성을 텍스트로 변환
  4. LLM 처리: 텍스트를 LLM에 전달하여 응답 생성
  5. 음성 변환: RealtimeTTS가 응답 텍스트를 음성으로 변환
  6. 응답 재생: 생성된 음성을 브라우저로 다시 스트리밍
  7. 인터럽트 감지: 사용자의 끼어들기를 자동으로 감지 및 처리

주요 기능

  • 실시간 음성 대화부분 전사/응답 미리보기
  • 낮은 지연시간을 위한 오디오 청크 기반 스트리밍
  • 정적/동적 침묵 탐지(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 설치 (권장)

  1. 리포지토리 클론 후 docker compose build
  2. docker compose up -d로 앱 및 Ollama 시작
  3. 별도로 Ollama 모델 다운로드 (예: docker compose exec ollama ollama pull ...)
  4. 서비스 종료: docker compose down
  5. 재시작: docker compose up -d

옵션 B: 수동 설치

  1. Python venv 설정 후 의존성 설치
  2. CUDA 버전에 맞는 PyTorch 수동 설치
  3. 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 등 외부 엔진은 별도 라이선스 적용

원문의 데모영상이 인상적입니다.

  1. 자연스러운 대화가 되었으면 하는 욕구가 있었는데 이정도면 상당히 충족되는 듯 합니다.
  2. 대화를 하면서 실시간으로 텍스트로도 보고 싶었는데 이 부분도 좋네요.
  3. AI가 나의 말을 끊지 않고 충분히 들은 다음 말을 하면 좋겠네요. 예를 들어 확실하지 않을때는 "다 말한거야?", "내가 말해도 될까?" 하는 식으로 질문을 하고 자신의 대화를 시작하는 방식
  4. AI도 사람도 서로의 말을 끊지 않도록 유도하는 것이 있으면 좋겠네요
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 음성으로 들리면 훨씬 더 좋을 것임

  • 인상적임! 현재 사용 가능한 오픈 소스 중 최고의 음성 합성 품질이라고 생각함

    • 최종 목표는 텍스트 토큰이 전혀 없는, 계속 실행되는 파형 대 파형 모델일 것임
  • 비슷한 것을 작업 중이었는데 이것을 발견함. 훌륭한 작업임. 데모를 좋아함