Xây dựng AI Voice Assistant ‘không độ trễ’ với LiveKit và OpenAI Realtime API

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Tạm biệt nỗi lo về độ trễ khi xây dựng Voice Bot

Từng có thời điểm, việc tạo ra một con bot trò chuyện mượt mà là thử thách cực đại cho các kỹ sư. Trước đây, chúng ta thường phải lắp ghép thủ công ba hệ thống: Speech-to-Text (STT) để nghe, LLM để xử lý và Text-to-Speech (TTS) để phản hồi. Quy trình cồng kềnh này khiến bot mất từ 3 đến 5 giây mới có thể trả lời, tạo ra những khoảng lặng cực kỳ thiếu tự nhiên.

Sự kết hợp giữa OpenAI Realtime APILiveKit đã định nghĩa lại hoàn toàn trải nghiệm này. Thay vì chờ đợi xử lý tuần tự, dữ liệu âm thanh được truyền tải liên tục qua giao thức WebRTC. Độ trễ thực tế hiện nay đã giảm xuống dưới 500ms. Với tốc độ này, bạn thậm chí có thể ngắt lời khi bot đang nói, giống hệt một cuộc hội thoại giữa người với người.

Chạy thử Voice Bot trong 5 phút

Để bắt đầu, bạn cần chuẩn bị sẵn OpenAI API Key (có credit), tài khoản LiveKit Cloud và Python 3.10 trở lên.

1. Cài đặt môi trường

Hãy khởi tạo một môi trường ảo để giữ cho dự án sạch sẽ. Chạy các lệnh sau trong terminal của bạn:

python -m venv venv
source venv/bin/activate  # Hoặc venv\Scripts\activate trên Windows
pip install livekit-agents livekit-plugins-openai python-dotenv

2. Cấu hình biến môi trường

Tạo file .env và điền thông tin kết nối. Bạn có thể lấy URL và Key miễn phí tại bảng điều khiển LiveKit Cloud:

LIVEKIT_URL=wss://your-project-id.livekit.cloud
LIVEKIT_API_KEY=API_KEY_CUA_BAN
LIVEKIT_API_SECRET=API_SECRET_CUA_BAN
OPENAI_API_KEY=sk-proj-xxx...

3. Triển khai Agent cơ bản

Dưới đây là mã nguồn tối giản cho file agent.py để bot có thể nghe và phản hồi ngay lập tức:

import asyncio
from dotenv import load_dotenv
from livekit.agents import JobContext, WorkerOptions, cli, multimodal
from livekit.plugins import openai

load_dotenv()

async def entrypoint(ctx: JobContext):
    # Kết nối trực tiếp với mô hình đa phương thức của OpenAI
    model = openai.realtime.RealtimeModel(
        instructions="Bạn là trợ lý ảo chuyên nghiệp. Hãy trả lời ngắn gọn, súc tích.",
        voice="alloy",
        temperature=0.8,
    )

    agent = multimodal.MultimodalAgent(model=model)

    await ctx.connect()
    agent.start(ctx.room)

    # Lời chào mở đầu
    await agent.say("Chào bạn, mình đã sẵn sàng!", allow_interruptions=True)

if __name__ == "__main__":
    cli.run_app(WorkerOptions(entrypoint_fnc=entrypoint))

Kích hoạt bot bằng lệnh python agent.py dev. Lúc này, bạn chỉ cần truy cập Sandbox của LiveKit để bắt đầu trò chuyện.

Tại sao WebRTC và Realtime API là cặp bài trùng?

Nhiều nhà phát triển thường tự hỏi tại sao không dùng WebSocket thuần cho đơn giản? Câu trả lời nằm ở khả năng xử lý âm thanh trong môi trường mạng không ổn định.

LiveKit: Xương sống cho hạ tầng WebRTC

LiveKit đóng vai trò điều phối dòng dữ liệu âm thanh hai chiều. Nó tự động xử lý các vấn đề kỹ thuật phức tạp như triệt tiêu tiếng vang (echo cancellation) và bù đắp gói tin bị mất. Nếu tự xây dựng hạ tầng này từ đầu, bạn có thể mất hàng tháng trời chỉ để xử lý lỗi kết nối trên các thiết bị khác nhau.

OpenAI Realtime API: Tư duy bằng âm thanh

Khác với các dòng GPT truyền thống, Realtime API tiếp nhận trực tiếp luồng âm thanh (Audio Stream). Điều này mang lại ba lợi thế lớn:

  • Nhận diện ngắt lời: Bot dừng phát ngay khi phát hiện người dùng lên tiếng.
  • Sắc thái cảm xúc: AI hiểu được tông giọng và sự nhấn nhá, giúp câu trả lời bớt khô khan.
  • Xử lý song song: Vừa nghe, vừa suy nghĩ, vừa chuẩn bị phản hồi cùng một lúc.

Nâng cấp: Tích hợp công cụ tra cứu dữ liệu

Một trợ lý thực thụ cần biết làm nhiều việc hơn là chỉ tán gẫu. Bạn có thể tích hợp thêm các hàm (tools) để bot tra cứu thông tin thực tế như trạng thái đơn hàng hoặc thời tiết.

from livekit.agents import multimodal

def get_order_status(order_id: str):
    # Giả lập truy vấn database
    return f"Đơn hàng {order_id} đang được giao và sẽ đến trong 20 phút nữa."

model = openai.realtime.RealtimeModel(
    instructions="Sử dụng công cụ tra cứu khi khách hàng hỏi về đơn hàng.",
)

agent = multimodal.MultimodalAgent(
    model=model,
    fnc_ctx=multimodal.FunctionContext().add_callable(get_order_status)
)

Kinh nghiệm thực chiến và tối ưu hóa

Sau khi triển khai thực tế, mình rút ra một số lưu ý quan trọng để dự án không chỉ chạy được mà còn chạy tốt.

1. Bài toán chi phí

OpenAI Realtime API có mức giá không hề rẻ, khoảng $0.06 cho mỗi phút audio đầu vào. Để tiết kiệm, hãy tận dụng tính năng VAD (Voice Activity Detection) của LiveKit. Chỉ gửi dữ liệu lên cloud khi thực sự có tiếng người nói, tránh lãng phí token cho tiếng ồn trắng.

2. Tinh chỉnh độ nhạy (VAD)

Đôi khi bot phản hồi quá nhanh khi người dùng mới chỉ lấy hơi. Hãy điều chỉnh tham số silence_duration_ms lên mức 600ms – 800ms. Khoảng thời gian này đủ để bot phân biệt giữa việc tạm nghỉ và kết thúc câu nói.

3. Chiến lược triển khai

Trong môi trường production, hãy đóng gói Agent vào Docker. LiveKit hoạt động theo mô hình Worker, mỗi phiên làm việc sẽ tiêu tốn tài nguyên CPU nhất định. Bạn nên đặt server tại các khu vực gần region của OpenAI (như US-East) để tối ưu đường truyền.

Việc xây dựng Voice AI hiện nay đã đơn giản hơn bao giờ hết. Chìa khóa thành công nằm ở cách bạn thiết kế các Function Calling và tinh chỉnh Prompt để tạo ra nét cá tính riêng cho bot. Nếu bạn gặp lỗi khi cài đặt, hãy để lại câu hỏi phía dưới nhé!

Share: