17 คะแนน โดย GN⁺ 2025-05-06 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • ระบบที่ใช้ไมโครโฟนของเบราว์เซอร์เพื่อให้สามารถ สนทนาเสียงกับ AI ได้อย่างเป็นธรรมชาติ แบบเรียลไทม์
  • ใช้ลำดับการทำงาน STT → LLM → TTS เพื่อแปลงเสียงของผู้ใช้เป็นข้อความ และแปลงคำตอบของ AI กลับเป็นเสียงเพื่อเล่น
  • องค์ประกอบหลักคือ เซิร์ฟเวอร์ FastAPI, การสตรีมผ่าน WebSocket, โมดูลประมวลผลเสียงแบบอิง Pod และแบ็กเอนด์ LLM ที่หลากหลาย
  • มี สภาพแวดล้อมการดีพลอยแบบอิง Docker ให้ใช้งาน และหากใช้ GPU ก็สามารถคาดหวังความหน่วงที่ต่ำลงและประสิทธิภาพที่ดีขึ้นได้
  • มีสภาพแวดล้อมที่ปรับแต่งได้สูง รองรับ การตรวจจับการขัดจังหวะของผู้ใช้ การสลับโมเดล และการเลือกเสียง รวมถึงการเปลี่ยนการตั้งค่าขั้นสูง

แชตเสียง AI แบบเรียลไทม์

  • โปรเจกต์นี้เป็น สถาปัตยกรรมแบบไคลเอนต์-เซิร์ฟเวอร์ ที่ออกแบบมาสำหรับ การสนทนาเสียงสองทางแบบเรียลไทม์
  • ผู้ใช้พูดผ่านเบราว์เซอร์ และ AI จะ ตอบกลับเป็นเสียง
  • รองรับการจัดการการขัดจังหวะ การแสดงข้อความตอบกลับบางส่วน และการเลือก TTS ได้หลายแบบ

ลำดับการทำงานหลัก

  1. รับเสียงเข้า: จับเสียงของผู้ใช้จากเบราว์เซอร์
  2. ส่งแบบสตรีมมิง: ส่งออดิโอชังก์ไปยังแบ็กเอนด์ Python ผ่าน WebSocket
  3. รู้จำเสียงพูด: RealtimeSTT แปลงเสียงเป็นข้อความ
  4. ประมวลผลด้วย LLM: ส่งข้อความไปยัง LLM เพื่อสร้างคำตอบ
  5. แปลงเป็นเสียง: RealtimeTTS แปลงข้อความคำตอบเป็นเสียง
  6. เล่นคำตอบกลับ: สตรีมเสียงที่สร้างแล้วกลับไปยังเบราว์เซอร์
  7. ตรวจจับการขัดจังหวะ: ตรวจจับและจัดการการพูดแทรกของผู้ใช้โดยอัตโนมัติ

ฟีเจอร์หลัก

  • การสนทนาเสียงแบบเรียลไทม์ และ พรีวิวการถอดเสียง/คำตอบบางส่วน
  • การสตรีมแบบอิงออดิโอชังก์เพื่อ ความหน่วงต่ำ
  • รองรับ การตรวจจับความเงียบแบบคงที่/แบบไดนามิก (turn detection)
  • แบ็กเอนด์ LLM ที่หลากหลาย: ใช้ Ollama เป็นค่าเริ่มต้น และเลือก OpenAI ได้
  • รองรับหลาย TTS engine: Kokoro, Coqui, Orpheus
  • มีเว็บอินเทอร์เฟซ: UI แบบ Vanilla JS ที่อิง Web Audio API
  • รองรับการดีพลอยด้วย 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

ความต้องการของระบบและคำแนะนำ

  • ระบบปฏิบัติการ: แนะนำให้ใช้ Docker บน Linux (เหมาะกับการรวม GPU มากกว่า)
  • แนะนำ Python 3.9+ และ NVIDIA GPU ที่รองรับ CUDA 12.1 ขึ้นไป
  • หากใช้ Docker จำเป็นต้องมี NVIDIA Container Toolkit
  • ต้องตั้งค่า Ollama หรือ OpenAI API Key หากจำเป็น

วิธีติดตั้ง

ตัวเลือก A: ติดตั้งด้วย Docker (แนะนำ)

  1. โคลนรีโพซิทอรีแล้วรัน docker compose build
  2. เริ่มแอปและ Ollama ด้วย docker compose up -d
  3. ดาวน์โหลดโมเดล Ollama แยกต่างหาก (เช่น docker compose exec ollama ollama pull ...)
  4. ปิดบริการ: docker compose down
  5. เริ่มใหม่: docker compose up -d

ตัวเลือก B: ติดตั้งแบบแมนนวล

  1. ตั้งค่า Python venv แล้วติดตั้ง dependency
  2. ติดตั้ง PyTorch ด้วยตนเองให้ตรงกับเวอร์ชัน CUDA
  3. รัน server.py เพื่อเริ่มเซิร์ฟเวอร์ FastAPI

วิธีใช้งาน

  • เปิด http://localhost:8000 ในเบราว์เซอร์
  • อนุญาตสิทธิ์ไมโครโฟนแล้วคลิก "Start"
  • คลิก "Stop" เพื่อจบ และ "Reset" เพื่อรีเซ็ตบทสนทนา

คำแนะนำการเปลี่ยนการตั้งค่า

  • เปลี่ยน TTS engine/เสียง: แก้ไขที่ server.py, audio_module.py
  • เปลี่ยนโมเดล/แบ็กเอนด์ LLM: ตั้งค่าที่ server.py, llm_module.py
  • เปลี่ยนโมเดล STT/เกณฑ์ความเงียบ: transcribe.py, turndetect.py
  • รองรับการตั้งค่า SSL: ตั้งค่าการใช้ HTTPS และใบรับรองได้ใน server.py

ใบอนุญาต

  • เผยแพร่ภายใต้ใบอนุญาต MIT
  • เอนจินภายนอกอย่าง Coqui ใช้ใบอนุญาตแยกต่างหาก

2 ความคิดเห็น

 
nicewook 2025-05-10

วิดีโอเดโมต้นฉบับน่าประทับใจมาก

  1. ผมอยากให้มันคุยได้อย่างเป็นธรรมชาติอยู่แล้ว และระดับนี้ก็ดูเหมือนจะตอบโจทย์ได้มากทีเดียว
  2. ระหว่างคุยก็อยากเห็นเป็นข้อความแบบเรียลไทม์ไปด้วย ซึ่งส่วนนี้ก็ดีมากครับ
  3. อยากให้ AI ฟังผมให้จบโดยไม่ขัดจังหวะก่อนแล้วค่อยพูด เช่น ถ้ายังไม่แน่ใจก็ถามในทำนองว่า "พูดจบหรือยัง?", "ผมพูดได้หรือยัง?" แล้วค่อยเริ่มพูดในส่วนของตัวเอง
  4. น่าจะดีถ้ามีอะไรที่ช่วยชี้นำไม่ให้ทั้ง AI และคนพูดแทรกกันและกัน
 
GN⁺ 2025-05-06
ความเห็นบน Hacker News
  • เหตุผลที่พัฒนา RealtimeVoiceChat คือเวลาหน่วงของการโต้ตอบกับ AI เสียงส่วนใหญ่ยังไม่น่าพอใจ ระบบนี้เป็นโอเพนซอร์สที่ออกแบบมาสำหรับการสนทนาด้วยเสียงแบบเรียลไทม์บนเครื่อง

    • เป้าหมายคือทำให้ใกล้เคียงกับจังหวะการสนทนาที่เป็นธรรมชาติ
    • ใช้การสตรีม audio chunk ผ่าน WebSockets, RealtimeSTT ที่อิง Whisper และ RealtimeTTS ที่รองรับเอนจินอย่าง Coqui XTTSv2/Kokoro เพื่อให้ได้เวลาหน่วงการตอบสนองราว 500ms
    • ทำได้แม้ตอนรันโมเดลโลคัลขนาดใหญ่กว่าอย่าง 24B Mistral ผ่าน Ollama
    • คุณสมบัติหลัก: ออกแบบมาสำหรับ local LLMs (โดยหลักคือ Ollama และมี OpenAI connector), ขัดจังหวะการสนทนาได้, ตรวจจับจังหวะการพูดอัจฉริยะเพื่อไม่ตัดความคิดของผู้ใช้, และมีการตั้งค่าแบบ Dockerized เพื่อให้ง่ายต่อการจัดการ dependency
    • เนื่องจากโมเดล STT/TTS จึงต้องใช้ GPU ที่รองรับ CUDA เพื่อประสิทธิภาพ
    • อยากรับฟังความคิดเห็นเกี่ยวกับแนวทาง ประสิทธิภาพ การปรับแต่งที่เป็นไปได้ หรือฟีเจอร์จำเป็นสำหรับประสบการณ์ AI เสียงแบบโลคัลที่ดี
    • โค้ด: https://github.com/KoljaB/RealtimeVoiceChat
  • ในฐานะผู้ใช้เครื่องมือแบบนี้ มันเร็วก็จริง แต่ไม่ยอมให้มีช่วงหยุดเวลาพูดตามธรรมชาติ

    • ระหว่างสนทนาเรามีทั้งช่วงหยุดสั้นและหยุดยาว ไม่ว่าจะเพื่อคิดหรือด้วยเหตุผลอื่น
    • แต่ในเครื่องมือพวกนี้พอเราหยุด AI ก็เริ่มพูดทันที
    • เมื่อไม่กี่สัปดาห์ก่อนเห็นเดโมบน Twitter ที่ AI รอจนกว่าคนจะพูดจบจริง ๆ ไม่ว่าช่วงหยุดจะยาวแค่ไหน
    • ไม่แน่ใจว่าปัญหานี้ซับซ้อนแค่ไหน อาจต้องมี AI อีกตัวมาวิเคราะห์อินพุตเพื่อตัดสินว่านี่เป็นแค่การหยุดหรือพูดจบแล้ว
  • เจ๋งมาก! ฟีเจอร์ขัดจังหวะคือช่วง "ว้าว" (ไม่ใช่ของใหม่ แต่การได้เห็นโอเพนซอร์สทำได้ดีขนาดนี้น่าทึ่งมาก)

    • มีคำถามเรื่องฟีเจอร์ขัดจังหวะ: อยากรู้ว่าจัดการกับ "Mmk", "Yes", "Of course", "ไอ" ฯลฯ ยังไง
    • นอกจากความประจบประแจงของแชตเสียง OpenAI แล้ว สิ่งที่ไม่ชอบคือเสียงรบกวนทำให้ AI หยุดตอบ แล้วก็ไม่มีวิธีดี ๆ ในการเริ่มใหม่
    • การหยุดตอบให้เร็วและหยุดด้วยเหตุผลที่เหมาะสมเป็นปัญหาที่ยาก
  • เคยทำวิจัยเรื่องนี้เมื่อประมาณ 1 ปีก่อน และได้เรียนรู้ข้อเท็จจริงน่าสนใจหลายอย่าง

    • ในบทสนทนาระหว่างมนุษย์ ค่าหน่วงมัธยฐานระหว่างผู้พูดคือ 0 มิลลิวินาที กล่าวคือประมาณครึ่งหนึ่งของเวลาผู้พูดคนหนึ่งจะพูดแทรกอีกคนจนค่าหน่วงติดลบ
    • มนุษย์ไม่ได้กังวลเรื่องค่าหน่วงนักเมื่อคุยกับ AI ที่รู้ว่าเป็น AI เพราะถือว่า AI ต้องใช้เวลาคิด ผู้ใช้ส่วนใหญ่มองว่าค่าหน่วง 1000ms ยังยอมรับได้ และ 500ms ถือว่ายอดเยี่ยม
    • ผู้ช่วยเสียงทุกตัวมีค่าหน่วงขั้นต่ำราว 300ms เพราะทั้งหมดใช้การตรวจจับความเงียบเพื่อตัดสินว่าจะเริ่มตอบเมื่อไร และต้องมีความเงียบราว 300ms เพื่อให้แยกจากการหยุดตามปกติของผู้พูดได้อย่างชัดเจน
    • Alexa มีการตั้งค่าให้เพิ่มเวลารอนี้สำหรับผู้พูดช้า
    • ในวิดีโอเดโมนี้จะเห็นว่า AI ไม่พูดแทรกเขา ซึ่งทำให้มันไม่รู้สึกเหมือนการโต้ตอบกับมนุษย์ (รวมถึงน้ำเสียงที่ฟังแปลกด้วย)
    • มนุษย์ประมวลผลประโยคแบบเรียลไทม์ และจะตอบเมื่อมั่นใจว่าได้ยินมากพอที่จะเข้าใจความหมายของประโยคแล้ว
  • ยอดเยี่ยมมาก พอดูซอร์สแล้วรู้สึกว่าน่าสนใจที่ผู้เขียนเลือกทำกลยุทธ์ตรวจจับจังหวะการพูดแบบกำหนดเองแทน Silero VAD อยากรู้ว่าทำแบบนี้ทำไม และเห็นข้อดีอะไรบ้าง

    • สำหรับคนที่สงสัยว่าสถานะของวงการ voice agent ตอนนี้เป็นอย่างไร Daily (บริษัท WebRTC) มีทั้งไกด์ที่ดีมากและเฟรมเวิร์กโอเพนซอร์สพร้อม utility มากมาย
    • หมายเหตุ: ฉันทำงานที่ Cartesia และให้บริการ use case ของ voice agent จำนวนมาก ส่วน Daily เป็นเพื่อนกัน
  • เริ่มรู้สึกว่า LLMs ควรถูกปรับแต่งให้ตอบสั้นลง อินพุตเป็นประโยคสั้น ๆ แต่กลับได้ข้อความยาวเป็นย่อหน้า

    • บางครั้งข้อความก็ดี แต่ไม่ใช่ทุกประโยคที่ป้อนเข้ามาจะต้องการคำตอบแบบมินิเอสเซย์
    • เป็นโปรเจกต์ที่เจ๋งมาก น่าจะปรับแต่งพรอมป์เพื่อเปลี่ยนแนวโน้มการสนทนาของ AI ได้
  • แปลกใจที่ยังไม่มีใครพูดถึงเรื่องนี้ มันโต้ตอบเหมือนมนุษย์ และจะพูดแทรกฉันในหลายสถานการณ์เมื่อมีบริบทพอ แถมค่าหน่วงยังต่ำมาก

    • ตอนใช้ครั้งแรกค่อนข้างช็อกเลย
  • ดีใช้ได้เลย ถ้าเสียงฟังเป็น SOTA มากกว่านี้จะยิ่งดีมาก

  • น่าประทับใจ! คิดว่านี่คือคุณภาพการสังเคราะห์เสียงที่ดีที่สุดในบรรดาโอเพนซอร์สที่มีตอนนี้

    • เป้าหมายสุดท้ายคงเป็นโมเดล waveform-to-waveform ที่ทำงานต่อเนื่องโดยไม่มี text token เลย
  • กำลังทำอะไรคล้าย ๆ กันอยู่แล้วมาเจอสิ่งนี้ งานยอดเยี่ยมมาก ชอบเดโมนี้