OpenAI Realtime
Xử lý văn bản, âm thanh và lệnh gọi hàm theo thời gian thực qua Realtime WebSocket.
OpenAI Realtime sử dụng kết nối liên tục và sự kiện hai chiều để xử lý văn bản, âm thanh và lệnh gọi hàm theo thời gian thực. Máy khách gửi sự kiện phiên, bộ đệm âm thanh, mục hội thoại và điều khiển phản hồi; máy chủ liên tục trả về trạng thái phiên, văn bản chuyển đổi từ giọng nói, văn bản, âm thanh, tham số hàm và sự kiện lỗi.
Trang này sử dụng WebSocket làm phương thức kết nối chính. Khi kết nối, thay MODEL_ID bằng ID mô hình khả dụng với tài khoản hiện tại và hỗ trợ Realtime.
Các tình huống điển hình gồm hội thoại giọng nói thời gian thực, chuyển giọng nói cuộc họp thành văn bản và trợ lý giọng nói, dịch thời gian thực, chuyển giọng nói thành văn bản, tương tác mã nguồn thời gian thực và tích hợp thời gian thực phía máy chủ. Kết nối có thể truyền cả văn bản lẫn âm thanh và xử lý VAD, gọi hàm cùng cập nhật trạng thái qua sự kiện.
wss://api.agtcloud.cn/v1/realtime?model=MODEL_IDXác thực và kết nối
Xác thực WebSocket
Ứng dụng phía máy chủ thiết lập kết nối WSS bằng Bearer API Key và gửi Header Realtime Beta trong yêu cầu bắt tay.
| Mục | Giá trị |
|---|---|
| Địa chỉ kết nối | wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID |
| Authorization | Bearer your-api-key |
| OpenAI-Beta | realtime=v1 |
Chỉ sử dụng API Key dài hạn trên máy chủ đáng tin cậy; không đưa khóa vào trình duyệt, gói ứng dụng di động hoặc kho mã công khai. Mọi kết nối nên dùng HTTPS/WSS.
Token tạm thời
Khi máy khách kết nối, máy chủ đáng tin cậy có thể tạo trước một token tạm thời có hiệu lực một phút và chỉ dùng cho một kết nối.
POST https://api.agtcloud.cn/v1/realtime/sessions
Content-Type: application/json
Authorization: Bearer your-api-key
{
"model": "MODEL_ID",
"voice": "verse"
}Quy trình kết nối
Trong quy trình WebSocket chính, máy chủ trực tiếp thiết lập kết nối bằng API Key; sau khi bắt tay thành công, gửi sự kiện máy khách và nhận sự kiện máy chủ trên cùng kết nối.
Trong quy trình WebRTC, máy khách trước tiên yêu cầu token tạm thời từ máy chủ ứng dụng của mình. Máy chủ ứng dụng gọi API phiên để tạo token; sau đó máy khách tạo SDP Offer, gửi tới điểm cuối Realtime và nhận SDP Answer, rồi trao đổi sự kiện JSON qua kênh dữ liệu oai-events.
Ví dụ kết nối WebSocket
Các ví dụ dưới đây trình bày Node.js, Python, gửi và nhận sự kiện. Sau khi kết nối, máy khách gửi sự kiện JSON và máy chủ cũng liên tục trả về kết quả dưới dạng sự kiện JSON.
import WebSocket from 'ws';
const ws = new WebSocket('wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID', {
headers: {
Authorization: 'Bearer your-api-key',
'OpenAI-Beta': 'realtime=v1',
},
});
ws.on('open', () => {
console.log('Đã kết nối với máy chủ.');
});
ws.on('message', (message) => {
console.log(JSON.parse(message.toString()));
});Hướng dẫn tích hợp WebRTC
Hiện khuyến nghị sử dụng WebSocket. Trước khi dùng WebRTC, hãy xác nhận mô hình mục tiêu có hỗ trợ hay không; các ví dụ sau trình bày cấu trúc kết nối cơ bản với token tạm thời, SDP, luồng âm thanh và kênh dữ liệu.
Địa chỉ kết nối WebRTC là https://api.agtcloud.cn/v1/realtime?model=MODEL_ID. Máy khách dùng token tạm thời để gửi application/sdp; kênh dữ liệu có tên oai-events và sự kiện có định dạng JSON. Âm thanh đầu vào được gửi qua addTrack(), âm thanh đầu ra được nhận qua ontrack.
Máy khách trình duyệt và trao đổi SDP
async function init() {
const tokenResponse = await fetch('/session');
const data = await tokenResponse.json();
const ephemeralKey = data.client_secret.value;
const pc = new RTCPeerConnection();
const audioElement = document.createElement('audio');
audioElement.autoplay = true;
pc.ontrack = (event) => {
audioElement.srcObject = event.streams[0];
};
const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
pc.addTrack(mediaStream.getTracks()[0]);
const dataChannel = pc.createDataChannel('oai-events');
dataChannel.addEventListener('message', (event) => {
console.log(JSON.parse(event.data));
});
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const response = await fetch(
'https://api.agtcloud.cn/v1/realtime?model=MODEL_ID',
{
method: 'POST',
body: offer.sdp,
headers: {
Authorization: `Bearer ${ephemeralKey}`,
'Content-Type': 'application/sdp',
},
},
);
await pc.setRemoteDescription({
type: 'answer',
sdp: await response.text(),
});
}
init();Tạo token tạm thời phía máy chủ
import express from 'express';
const app = express();
app.get('/session', async (_request, response) => {
const result = await fetch('https://api.agtcloud.cn/v1/realtime/sessions', {
method: 'POST',
headers: {
Authorization: 'Bearer your-api-key',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'MODEL_ID',
voice: 'verse',
}),
});
response.send(await result.json());
});
app.listen(3000);Gửi và nhận sự kiện qua kênh dữ liệu
const dataChannel = pc.createDataChannel('oai-events');
dataChannel.addEventListener('message', (event) => {
const realtimeEvent = JSON.parse(event.data);
console.log(realtimeEvent);
});
dataChannel.send(JSON.stringify({
type: 'response.create',
response: {
modalities: ['text'],
instructions: 'Hãy viết một bài haiku về mã nguồn',
},
}));Ví dụ WebSocket tiêu chuẩn cho môi trường chạy tương tự trình duyệt
Các môi trường chạy tương tự trình duyệt như Deno và Cloudflare Workers có thể truyền thông tin xác thực qua giao thức con. Trước khi dùng, xác nhận môi trường chạy và nút hiện tại có hỗ trợ hay không; không nên đặt API Key dài hạn trong trang trình duyệt thông thường.
const ws = new WebSocket(
'wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID',
[
'realtime',
'openai-insecure-api-key.your-api-key',
'openai-organization.ORGANIZATION_ID',
'openai-project.PROJECT_ID',
'openai-beta.realtime-v1',
],
);
ws.addEventListener('open', () => {
console.log('Đã kết nối với máy chủ.');
});
ws.addEventListener('message', (event) => {
console.log(JSON.parse(event.data));
});Phiên, âm thanh và hội thoại
Realtime hỗ trợ hội thoại chỉ có văn bản, giọng nói hoặc kết hợp cả hai. Cấu hình phiên có thể bao gồm định dạng âm thanh đầu vào và đầu ra, giọng nói, nhiệt độ, độ dài đầu ra tối đa, công cụ và tham số VAD.
- Định dạng âm thanh đầu vào và đầu ra:
pcm16,g711_ulaw,g711_alaw. - Các lựa chọn giọng nói trong ví dụ:
alloy,echo,shimmer. - Cấu hình VAD gồm ngưỡng, khoảng âm thanh đệm trước giọng nói và thời gian im lặng.
- Hội thoại tiến triển thông qua phiên, mục hội thoại, phần nội dung và sự kiện phản hồi.
Xem các trường sự kiện cụ thể trong trình duyệt sự kiện bên dưới; tham số và miền giá trị dùng chung được tập hợp trong “Kiểu dùng chung”.
Tham khảo sự kiện
Chọn sự kiện để xem định nghĩa trường và ví dụ JSON. Có thể chuyển hướng sự kiện, lọc theo danh mục hoặc tìm tên sự kiện.
session.update
Cập nhật cấu hình mặc định của phiên.
| Trường | Kiểu | Bắt buộc | Mô tả | Ví dụ |
|---|---|---|---|---|
event_id | chuỗi | Không | Mã định danh sự kiện do máy khách tạo | event_123 |
type | chuỗi | Không | Loại sự kiện | session.update |
modalities | mảng chuỗi | Không | Các loại phương thức mà mô hình có thể phản hồi | ["text", "audio"] |
instructions | chuỗi | Không | Chỉ dẫn hệ thống được đặt trước khi gọi mô hình | "Hãy trả lời ngắn gọn và chính xác." |
voice | chuỗi | Không | Giọng nói mà mô hình sử dụng | alloy、echo、shimmer |
input_audio_format | chuỗi | Không | Định dạng âm thanh đầu vào | pcm16、g711_ulaw、g711_alaw |
output_audio_format | chuỗi | Không | Định dạng âm thanh đầu ra | pcm16、g711_ulaw、g711_alaw |
input_audio_transcription.model | chuỗi | Không | Mô hình dùng để chuyển giọng nói thành văn bản | whisper-1 |
turn_detection.type | chuỗi | Không | Loại phát hiện giọng nói | server_vad |
turn_detection.threshold | số | Không | Ngưỡng kích hoạt VAD (0.0-1.0) | 0.8 |
turn_detection.prefix_padding_ms | số nguyên | Không | Thời lượng âm thanh được giữ trước khi giọng nói bắt đầu | 500 |
turn_detection.silence_duration_ms | số nguyên | Không | Thời gian im lặng để xác định giọng nói đã kết thúc | 1000 |
tools | mảng | Không | Danh sách công cụ có sẵn cho mô hình | [] |
tool_choice | chuỗi | Không | Cách mô hình chọn công cụ | auto/none/required |
temperature | số | Không | Nhiệt độ lấy mẫu của mô hình | 0.8 |
max_output_tokens | chuỗi/số nguyên | Không | Số token tối đa cho một phản hồi | "inf"/4096 |
{
"event_id": "event_123",
"type": "session.update",
"modalities": [
"text",
"audio"
],
"instructions": "Hãy trả lời ngắn gọn và chính xác.",
"voice": "alloy",
"input_audio_format": "pcm16",
"output_audio_format": "pcm16",
"input_audio_transcription": {
"model": "whisper-1"
},
"turn_detection": {
"type": "server_vad",
"threshold": 0.8,
"prefix_padding_ms": 500,
"silence_duration_ms": 1000
},
"tools": [],
"tool_choice": "auto",
"temperature": 0.8,
"max_output_tokens": "inf"
}Kiểu dùng chung
Các phần thu gọn sau tập hợp bảng tham số cho giới hạn tốc độ, gọi hàm, âm thanh, VAD, công cụ, mô hình, sự kiện, phiên, mục hội thoại, nội dung, phản hồi, chuyển giọng nói thành văn bản, luồng âm thanh và WebRTC.
Tham số sự kiện giới hạn tốc độ4 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
name | chuỗi | Có | Tên giới hạn | Ví dụ: requests_per_min |
limit | số nguyên | Có | Giá trị giới hạn | Ví dụ: 60 |
remaining | số nguyên | Có | Dung lượng còn lại | Ví dụ: 45 |
reset_seconds | số nguyên | Có | Thời gian đặt lại (giây) | Ví dụ: 35 |
Tham số gọi hàm4 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
type | chuỗi | Có | Loại hàm | Ví dụ: function |
name | chuỗi | Có | Tên hàm | Ví dụ: get_weather |
description | chuỗi | Không | Mô tả hàm | Ví dụ: Get the current weather |
parameters | đối tượng | Có | Định nghĩa tham số hàm | Ví dụ: {"type": "object", "properties": {...}} |
Tham số định dạng âm thanh4 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
sample_rate | số nguyên | — | Tần số lấy mẫu | Giá trị hợp lệ: 8000, 16000, 24000, 44100, 48000 |
channels | số nguyên | — | Số kênh | Giá trị hợp lệ: 1 (đơn kênh), 2 (âm thanh nổi) |
bits_per_sample | số nguyên | — | Số bit mỗi mẫu | Giá trị hợp lệ: 16 (pcm16), 8 (g711) |
encoding | chuỗi | — | Phương thức mã hóa | Giá trị hợp lệ: pcm16, g711_ulaw, g711_alaw |
Tham số phát hiện giọng nói3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
threshold | số thực | — | Ngưỡng kích hoạt VAD | Mặc định: 0.5; phạm vi: 0.0-1.0 |
prefix_padding_ms | số nguyên | — | Khoảng âm thanh đệm trước giọng nói (mili giây) | Mặc định: 500; phạm vi: 0-5000 |
silence_duration_ms | số nguyên | — | Thời gian phát hiện im lặng (mili giây) | Mặc định: 1000; phạm vi: 100-10000 |
Tham số lựa chọn công cụ2 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
tool_choice | chuỗi | — | Cách chọn công cụ | Giá trị hợp lệ: auto, none, required |
tools | mảng | — | Danh sách công cụ có sẵn | Giá trị hợp lệ: [{type, name, description, parameters}] |
Tham số cấu hình mô hình4 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
temperature | số thực | — | Nhiệt độ lấy mẫu | Phạm vi/giá trị hợp lệ: 0.0-2.0; mặc định: 1.0 |
max_output_tokens | số nguyên/chuỗi | — | Độ dài đầu ra tối đa | Phạm vi/giá trị hợp lệ: 1-4096/"inf"; mặc định: "inf" |
modalities | mảng chuỗi | — | Phương thức phản hồi | Phạm vi/giá trị hợp lệ: ["text", "audio"]; mặc định: ["text"] |
voice | chuỗi | — | Loại giọng nói | Phạm vi/giá trị hợp lệ: alloy, echo, shimmer; mặc định: alloy |
Tham số chung của sự kiện3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
event_id | chuỗi | Có | Mã định danh duy nhất của sự kiện | Ví dụ: event_123 |
type | chuỗi | Có | Loại sự kiện | Ví dụ: session.update |
timestamp | số nguyên | Không | Dấu thời gian của sự kiện (mili giây) | Ví dụ: 1677649363000 |
Tham số trạng thái phiên3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
status | chuỗi | — | Trạng thái phiên | Giá trị hợp lệ: active, ended, error |
error | đối tượng | — | Thông tin lỗi | Giá trị hợp lệ: {"type": "error_type", "message": "error message"} |
metadata | đối tượng | — | Siêu dữ liệu phiên | Giá trị hợp lệ: {"client_id": "web", "session_type": "chat"} |
Tham số trạng thái mục hội thoại3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
status | chuỗi | — | Trạng thái mục hội thoại | Giá trị hợp lệ: completed, in_progress, incomplete |
role | chuỗi | — | Vai trò người gửi | Giá trị hợp lệ: user, assistant, system |
type | chuỗi | — | Loại mục hội thoại | Giá trị hợp lệ: message, function_call, function_call_output |
Tham số loại nội dung3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
type | chuỗi | — | Loại nội dung | Giá trị hợp lệ: text, audio, transcript |
format | chuỗi | — | Định dạng nội dung | Giá trị hợp lệ: plain, markdown, html |
encoding | chuỗi | — | Phương thức mã hóa | Giá trị hợp lệ: utf-8, base64 |
Tham số trạng thái phản hồi3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
status | chuỗi | — | Trạng thái phản hồi | Giá trị hợp lệ: completed, cancelled, failed, incomplete |
status_details | đối tượng | — | Chi tiết trạng thái | Giá trị hợp lệ: {"reason": "user_cancelled"} |
usage | đối tượng | — | Thống kê sử dụng | Giá trị hợp lệ: {"total_tokens": 50, "input_tokens": 20, "output_tokens": 30} |
Tham số chuyển giọng nói thành văn bản4 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
enabled | boolean | — | Có bật chuyển giọng nói thành văn bản hay không | Ví dụ: true |
model | chuỗi | — | Mô hình chuyển giọng nói thành văn bản | Ví dụ: whisper-1 |
language | chuỗi | — | Ngôn ngữ chuyển giọng nói thành văn bản | Ví dụ: en, zh, auto |
prompt | chuỗi | — | Gợi ý chuyển giọng nói thành văn bản | Ví dụ: "Transcript of a conversation" |
Tham số luồng âm thanh3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
chunk_size | số nguyên | — | Kích thước khối âm thanh (byte) | Giá trị hợp lệ: 1024, 2048, 4096 |
latency | chuỗi | — | Chế độ độ trễ | Giá trị hợp lệ: low, balanced, high |
compression | chuỗi | — | Phương thức nén | Giá trị hợp lệ: none, opus, mp3 |
Tham số cấu hình WebRTC3 trường
| Trường | Kiểu | Bắt buộc | Mô tả | Giá trị tùy chọn hoặc ví dụ |
|---|---|---|---|---|
ice_servers | mảng | — | Danh sách máy chủ ICE | Mặc định: [{"urls": "stun:stun.l.google.com:19302"}] |
audio_constraints | đối tượng | — | Ràng buộc âm thanh | Mặc định: {"echoCancellation": true} |
connection_timeout | số nguyên | — | Thời gian chờ kết nối (mili giây) | Mặc định: 30000 |
Xử lý lỗi và khôi phục
Lỗi Realtime thường thuộc bốn nhóm: kết nối, xác thực, âm thanh hoặc phiên:
| Loại | Nguyên nhân thường gặp | Hướng xử lý |
|---|---|---|
| Lỗi kết nối | Mất mạng, bắt tay thất bại hoặc cấu hình kết nối sai | Kiểm tra địa chỉ WSS, mạng và yêu cầu bắt tay; giới hạn số lần kết nối lại |
| Lỗi xác thực | API Key không hợp lệ, token tạm thời hết hạn hoặc không khớp địa chỉ API | Cập nhật thông tin xác thực và bảo đảm API Key khớp địa chỉ API của yêu cầu |
| Lỗi âm thanh | Quyền thiết bị, định dạng không được hỗ trợ hoặc bộ mã hóa/giải mã không khớp | Kiểm tra quyền thiết bị, tần số lấy mẫu và mã hóa, rồi thiết lập lại luồng âm thanh |
| Lỗi phiên | Phiên hết thời gian, giới hạn đồng thời hoặc trạng thái sự kiện không nhất quán | Lưu sự kiện lỗi, tạo lại phiên và chuyển sang API không thời gian thực nếu cần |
Chiến lược khôi phục có thể bao gồm tự động kết nối lại, khôi phục phiên, thử lại có giới hạn và giảm chức năng. Khi có lỗi, ưu tiên đọc sự kiện error, lưu event_id, error.type, error.code, error.message cùng thông tin sự kiện liên quan, rồi quyết định có gửi lại hay không.