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.
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.
Đẩy các frame âm thanh PCM nhị phân ngay khi model bắt đầu giải mã câu đầu tiên.
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.
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:
{
"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:
{
"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:
{
"event": "abort",
"turn_id": 1,
"reason": "caller_interruption"
}{"event": "aborted", "turn_id": 1}.Code Mẫu Triển Khai Client
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.