API WebSocket Streaming TTS

Truyền phát âm thanh thời gian thực, hỗ trợ ngắt lời Barge-in và TTFA dưới 800ms.

WebSocket Protocolwss://bvoiz.com/ws/tts/stream

API WebSocket Streaming TTS

Giao thức truyền phát âm thanh trực tiếp hai chiều theo thời gian thực (Real-time Full Duplex). Đạt độ trễ âm thanh đầu tiên (TTFA) dưới 800ms và hỗ trợ cơ chế ngắt lời tự nhiên (Barge-in Abort) dưới 100ms.

TTFA < 800ms

Đẩy các frame âm thanh PCM nhị phân ngay khi model bắt đầu giải mã câu đầu tiên.

Barge-in Abort

Nhận bản tin abort dừng suy luận trên GPU trong < 100ms ngay khi người dùng nói chen ngang.

Chuẩn Viễn Thông

Hỗ trợ xuất trực tiếp PCM 8000Hz (G.711) và 16000Hz mono không cần qua công đoạn convert.

Đặc tả Cấu trúc Bản tin (Message Specifications)

Tất cả các bản tin điều khiển được truyền dưới dạng JSON text message qua WebSocket. Âm thanh tổng hợp được Server gửi về dưới dạng Binary WebSocket Message.

1. Khởi tạo phiên (Session Handshake)

Gửi ngay khi vừa kết nối WebSocket để cấu hình giọng đọc và định dạng âm thanh cho toàn bộ cuộc gọi:

Client -> Server: start message
{
  "event": "start",
  "session_id": "call-session-uuid-1234",
  "voice_id": "vi-VN-NamMinhNeural",
  "audio_format": "pcm8k",
  "speed": 1.0
}

2. Gửi văn bản cần đọc (Text Chunk)

Khi LLM stream ra từng mệnh đề ngắn (5-10 từ), Client đẩy trực tiếp vào WebSocket:

Client -> Server: text_chunk message
{
  "event": "text_chunk",
  "turn_id": 1,
  "sequence": 0,
  "text": "Dạ em chào anh Nam, em là trợ lý BVOIZ ạ.",
  "is_final": false
}

3. Ngắt lời tức thì khi khách nói chen (Barge-in Abort)

Khi VAD phát hiện khách hàng cất tiếng nói trong lúc AI đang phát audio, gửi ngay bản tin abort để giải phóng GPU:

Client -> Server: abort message
{
  "event": "abort",
  "turn_id": 1,
  "reason": "caller_interruption"
}
✓ Server sẽ lập tức hủy context suy luận trong ≤ 100ms và phản hồi bản tin {"event": "aborted", "turn_id": 1}.

Code Mẫu Triển Khai Client

Client WebSocket Code
import asyncio
import json
import websockets

async def test_streaming_tts():
    uri = "wss://bvoiz.com/ws/tts/stream"
    headers = {"Authorization": "Bearer YOUR_API_KEY"}

    async with websockets.connect(uri, extra_headers=headers) as websocket:
        # 1. Khởi tạo phiên truyền phát
        init_payload = {
            "event": "start",
            "session_id": "call-session-9876",
            "voice_id": "vi-VN-NamMinhNeural",
            "audio_format": "pcm8k",  # 8000Hz mono cho viễn thông PSTN/SIP
            "speed": 1.0
        }
        await websocket.send(json.dumps(init_payload))
        
        # Nhận xác nhận
        resp = await websocket.recv()
        print("Khởi tạo:", resp)

        # 2. Gửi cụm văn bản cần nói (Text chunk)
        chunk_payload = {
            "event": "text_chunk",
            "turn_id": 1,
            "text": "Dạ em chào anh Nam, em là trợ lý tổng đài BVOIZ ạ."
        }
        await websocket.send(json.dumps(chunk_payload))

        # 3. Lắng nghe nhận frame âm thanh nhị phân liên tục
        while True:
            msg = await websocket.recv()
            if isinstance(msg, bytes):
                print(f"Nhận Audio Frame nhị phân: {len(msg)} bytes (PCM 8kHz)")
            else:
                data = json.loads(msg)
                if data.get("event") == "turn_completed":
                    print(f"Turn hoàn thành! Thời gian xử lý: {data.get('total_duration_ms')}ms")
                    break

asyncio.run(test_streaming_tts())

Tra cứu danh sách giọng đọc hỗ trợ?

Khám phá toàn bộ danh sách giọng AI theo vùng miền (Bắc, Trung, Nam) và giới tính để truyền vào tham số voice_code.

Danh sách giọng đọc
Tài liệu này có giải đáp được thắc mắc của bạn không?