17 điểm bởi GN⁺ 2025-05-06 | 2 bình luận | Chia sẻ qua WhatsApp
  • Hệ thống cho phép trò chuyện bằng giọng nói tự nhiên với AI theo thời gian thực bằng micro trên trình duyệt
  • Thông qua luồng STT → LLM → TTS, giọng nói của người dùng được chuyển thành văn bản, sau đó phản hồi của AI lại được chuyển thành giọng nói để phát
  • Các thành phần cốt lõi gồm máy chủ FastAPI, streaming WebSocket, mô-đun xử lý giọng nói dựa trên Pod và nhiều backend LLM khác nhau
  • Cung cấp môi trường triển khai dựa trên Docker, và khi dùng GPU có thể kỳ vọng độ trễ thấp hơn cùng hiệu năng tốt hơn
  • Cung cấp môi trường tùy biến mạnh, cho phép thay đổi các thiết lập nâng cao như phát hiện ngắt lời của người dùng, đổi model, chọn giọng nói

Chat thoại AI thời gian thực

  • Dự án này là một kiến trúc client-server được thiết kế cho hội thoại giọng nói hai chiều theo thời gian thực
  • Người dùng nói trong trình duyệt và AI sẽ trả phản hồi bằng giọng nói
  • Hỗ trợ xử lý ngắt lời, hiển thị phản hồi văn bản từng phần và nhiều lựa chọn TTS khác nhau

Luồng hoạt động chính

  1. Nhập giọng nói: Ghi lại giọng nói của người dùng trong trình duyệt
  2. Truyền streaming: Gửi các audio chunk tới backend Python qua WebSocket
  3. Nhận dạng giọng nói: RealtimeSTT chuyển giọng nói thành văn bản
  4. Xử lý LLM: Gửi văn bản tới LLM để tạo phản hồi
  5. Chuyển thành giọng nói: RealtimeTTS chuyển văn bản phản hồi thành giọng nói
  6. Phát phản hồi: Streaming âm thanh đã tạo trở lại trình duyệt
  7. Phát hiện ngắt lời: Tự động phát hiện và xử lý việc người dùng xen vào

Tính năng chính

  • Hội thoại giọng nói thời gian thựcxem trước bản chép lời/phản hồi từng phần
  • Streaming dựa trên audio chunk để đạt độ trễ thấp
  • Hỗ trợ phát hiện im lặng tĩnh/động (turn detection)
  • Nhiều backend LLM: mặc định là Ollama, có thể chọn OpenAI
  • Hỗ trợ nhiều engine TTS: Kokoro, Coqui, Orpheus
  • Cung cấp giao diện web: UI Vanilla JS dựa trên Web Audio API
  • Cung cấp triển khai dựa trên Docker Compose

Tech stack

  • Backend: Python 3.x, FastAPI
  • Frontend: HTML, CSS, JavaScript (Web Audio API)
  • Giao tiếp: WebSockets
  • Container hóa: Docker, Docker Compose
  • Thư viện AI/ML:
    • RealtimeSTT, RealtimeTTS, transformers, torch, torchaudio
    • ollama, openai
  • Xử lý âm thanh: numpy, scipy

Yêu cầu và khuyến nghị hệ thống

  • Hệ điều hành: khuyến nghị dùng Docker trên Linux (thuận lợi cho tích hợp GPU)
  • Khuyến nghị Python 3.9+, GPU NVIDIA với CUDA 12.1 trở lên
  • Bắt buộc có NVIDIA Container Toolkit khi dùng Docker
  • Cần cấu hình Ollama hoặc OpenAI API Key nếu cần

Cách cài đặt

Tùy chọn A: Cài bằng Docker (khuyến nghị)

  1. Clone repository rồi chạy docker compose build
  2. Khởi động app và Ollama bằng docker compose up -d
  3. Tải model Ollama riêng (ví dụ: docker compose exec ollama ollama pull ...)
  4. Dừng dịch vụ: docker compose down
  5. Khởi động lại: docker compose up -d

Tùy chọn B: Cài đặt thủ công

  1. Thiết lập Python venv rồi cài các dependency
  2. Cài thủ công PyTorch phù hợp với phiên bản CUDA
  3. Chạy server.py để khởi động máy chủ FastAPI

Cách chạy

  • Truy cập http://localhost:8000 trên trình duyệt
  • Cấp quyền micro rồi nhấn "Start"
  • Nhấn "Stop" để dừng, "Reset" để khởi tạo lại cuộc hội thoại

Hướng dẫn thay đổi cấu hình

  • Đổi engine/giọng TTS: chỉnh trong server.py, audio_module.py
  • Đổi model/backend LLM: cấu hình trong server.py, llm_module.py
  • Đổi model STT/ngưỡng im lặng: transcribe.py, turndetect.py
  • Có thể cấu hình SSL: thiết lập việc dùng HTTPS và chứng chỉ trong server.py

Giấy phép

  • Được phát hành theo giấy phép MIT
  • Các engine bên ngoài như Coqui áp dụng giấy phép riêng

2 bình luận

 
nicewook 2025-05-10

Video demo của bài gốc rất ấn tượng.

  1. Tôi vốn mong muốn có được một cuộc trò chuyện tự nhiên, và đến mức này thì có vẻ đã đáp ứng khá nhiều rồi.
  2. Tôi cũng muốn vừa trò chuyện vừa có thể xem văn bản theo thời gian thực, và phần này cũng rất hay.
  3. Sẽ tốt hơn nếu AI không ngắt lời tôi mà lắng nghe đủ rồi mới nói. Ví dụ khi chưa chắc chắn thì hỏi kiểu như "Bạn nói xong chưa?", "Tôi có thể nói được chưa?" rồi mới bắt đầu phần hội thoại của mình.
  4. Sẽ hay nếu có gì đó giúp cả AI lẫn con người không ngắt lời nhau
 
GN⁺ 2025-05-06
Ý kiến trên Hacker News
  • Lý do phát triển RealtimeVoiceChat là vì độ trễ trong phần lớn các tương tác AI giọng nói là chưa thỏa đáng. Đây là một hệ thống mã nguồn mở được thiết kế cho hội thoại giọng nói cục bộ theo thời gian thực

    • Mục tiêu là tiến gần hơn đến tốc độ hội thoại tự nhiên
    • Hệ thống đạt độ trễ phản hồi khoảng 500ms bằng cách dùng streaming các đoạn âm thanh qua WebSockets, RealtimeSTT dựa trên Whisper, và RealtimeTTS hỗ trợ các engine như Coqui XTTSv2/Kokoro
    • Điều này vẫn khả thi ngay cả khi chạy các mô hình cục bộ lớn hơn như Mistral 24B thông qua Ollama
    • Tính năng chính: được thiết kế cho local LLMs (chủ yếu là Ollama, có kèm OpenAI connector), có thể ngắt lời trong hội thoại, phát hiện lượt nói thông minh để không cắt ngang mạch suy nghĩ của người dùng, và cung cấp thiết lập Dockerized để giúp quản lý dependency dễ dàng hơn
    • Do các mô hình STT/TTS, hệ thống cần GPU hỗ trợ CUDA để có hiệu năng tốt
    • Tác giả muốn nhận phản hồi về cách tiếp cận, hiệu năng, các tối ưu hóa tiềm năng, hoặc những tính năng thiết yếu để mang lại trải nghiệm AI giọng nói cục bộ tốt
    • Mã nguồn: https://github.com/KoljaB/RealtimeVoiceChat
  • Với tư cách là người dùng của các công cụ như vậy, tôi thấy chúng nhanh, nhưng không cho phép các khoảng ngừng tự nhiên khi nói

    • Trong hội thoại, chúng ta có những khoảng ngừng dài và ngắn để suy nghĩ hoặc vì các lý do khác
    • Với các công cụ này, hễ chúng ta dừng lại là AI bắt đầu nói ngay
    • Vài tuần trước tôi thấy trên Twitter một bản demo trong đó AI chờ đến khi con người thực sự nói xong. Độ dài của khoảng ngừng không thành vấn đề
    • Tôi không biết vấn đề này phức tạp đến mức nào. Có lẽ cần thêm một AI khác để phân tích đầu vào và quyết định đó là một khoảng ngừng hay chưa
  • Rất tuyệt! Tính năng ngắt lời là một khoảnh khắc "wow" (không phải mới, nhưng thật đáng ngạc nhiên khi thấy nó được triển khai tốt đến vậy trong mã nguồn mở)

    • Một câu hỏi về tính năng ngắt lời: tôi tò mò nó xử lý các kiểu như "Mmk", "Yes", "Of course", "ho", v.v. như thế nào
    • Ngoài sự nịnh nọt trong voice chat của OpenAI, tôi không thích việc tiếng ồn có thể làm dừng phản hồi của AI và không có cách hay để bắt đầu lại
    • Việc dừng phản hồi thật nhanh, nhưng chỉ dừng vì lý do chính đáng, là một bài toán khó
  • Khoảng 1 năm trước tôi đã nghiên cứu về chủ đề này. Tôi học được vài điều thú vị

    • Trong hội thoại giữa người với người, độ trễ trung vị giữa các lượt nói là 0 mili giây. Tức là khoảng một nửa thời gian, một người nói chen vào người kia nên độ trễ trở thành âm
    • Con người không quá bận tâm đến độ trễ khi nói chuyện với một AI mà họ biết rõ là AI. Họ cho rằng AI cần thời gian để suy nghĩ. Phần lớn người dùng xem độ trễ 1000ms là chấp nhận được, còn 500ms là đặc biệt tốt
    • Mọi trợ lý giọng nói đều có độ trễ tối thiểu khoảng 300ms. Nguyên nhân là tất cả đều dùng phát hiện khoảng lặng để xác định khi nào bắt đầu phản hồi, và cần khoảng 300ms im lặng để phân biệt chắc chắn với các khoảng ngừng thông thường của người nói
    • Alexa có một thiết lập để tăng thời gian chờ này cho những người nói chậm
    • Trong video demo này có thể thấy AI không chen lời anh ấy. Điều này khiến nó không mang lại cảm giác tương tác với con người (cùng với ngữ điệu hơi gượng của giọng nói)
    • Con người xử lý câu nói theo thời gian thực, và phản hồi khi họ tự tin rằng đã nghe đủ để hiểu ý nghĩa của câu
  • Rất hay. Xem qua source thì tôi thấy thú vị khi tác giả đã triển khai một chiến lược phát hiện lượt nói tùy chỉnh thay vì dùng Silero VAD. Tôi tò mò vì sao lại làm vậy và đã quan sát thấy những lợi ích gì

    • Với những ai tò mò về hiện trạng của mảng voice agent, Daily (công ty WebRTC) cung cấp một framework mã nguồn mở rất tốt kèm nhiều utility và hướng dẫn hữu ích
    • Lưu ý: tôi làm ở Cartesia và đang phục vụ nhiều use case voice agent. Daily là bạn của chúng tôi
  • Tôi bắt đầu cảm thấy LLMs nên được tinh chỉnh để đưa ra phản hồi ngắn hơn. Bạn nhập vào một câu ngắn mà nó lại xuất ra cả một đoạn văn dài

    • Đôi khi đó là văn bản tốt, nhưng không phải câu đầu vào nào cũng cần một câu trả lời kiểu tiểu luận mini
    • Đây là một dự án rất tuyệt. Có lẽ có thể tinh chỉnh prompt để thay đổi xu hướng hội thoại của AI
  • Tôi ngạc nhiên là chưa ai nhắc đến điều này. Nó tương tác giống con người, và trong nhiều tình huống còn chen lời tôi khi đã có đủ ngữ cảnh. Độ trễ rất thấp

    • Lần đầu dùng tôi thấy khá sốc
  • Khá tốt. Sẽ còn tuyệt hơn nhiều nếu nghe như giọng nói SOTA

  • Ấn tượng đấy! Tôi nghĩ đây là chất lượng tổng hợp giọng nói tốt nhất trong số các lựa chọn mã nguồn mở hiện có

    • Mục tiêu cuối cùng sẽ là một mô hình waveform-to-waveform chạy liên tục, hoàn toàn không có text token ở giữa
  • Tôi cũng đang làm thứ gì đó tương tự thì phát hiện ra cái này. Làm rất tốt. Tôi thích bản demo