Các tác nhân giọng nói trước đây cần ba thành phần chuyển động: chuyển giọng nói thành văn bản, một mô hình ngôn ngữ, sau đó chuyển văn bản thành giọng nói. Mỗi bước nhảy đều làm tăng độ trễ và mất đi sắc thái. API Realtime của OpenAI đã hợp nhất chúng thành một mô hình chuyển giọng nói thành giọng nói duy nhất, và gpt-realtime-2.1-mini là phiên bản rẻ hơn, nhanh hơn trong dòng sản phẩm đó. Nó lắng nghe âm thanh, suy nghĩ và phản hồi qua một kết nối truyền trực tuyến duy nhất.
Hướng dẫn này chỉ cho bạn cách gọi nó từ đầu đến cuối: ID mô hình nào để sử dụng, cách kết nối qua WebSocket và WebRTC, cách định hình một phiên làm việc, và cách kiểm tra toàn bộ với Apidog trước khi bạn tích hợp nó vào một ứng dụng. Mọi thứ ở đây đều tương ứng với hướng dẫn Realtime chính thức của OpenAI.
Trước tiên, hãy chọn đúng tên mô hình
Cách đặt tên có thể khiến mọi người bối rối, vì vậy hãy làm rõ điều này trước khi đi vào mã. Có hai định danh cho cùng một mô hình mini:
gpt-realtime-2.1-mini: ID có phiên bản. Đây là cái xuất hiện trên trang giá của OpenAI và khóa bạn vào thế hệ 2.1.gpt-realtime-mini: biệt danh của dòng sản phẩm. Nó luôn trỏ đến bản chụp mới nhất, hiện tại làgpt-realtime-mini-2025-12-15.
Các bản chụp cho phép bạn khóa hành vi trong môi trường sản xuất:
| Định danh | Nó trỏ đến cái gì |
|---|---|
gpt-realtime-mini |
Bản chụp mini mới nhất (tự động cập nhật) |
gpt-realtime-2.1-mini |
Mini thế hệ 2.1 |
gpt-realtime-mini-2025-12-15 |
Bản chụp được ghim (hiện tại) |
gpt-realtime-mini-2025-10-06 |
Bản chụp được ghim (trước đó) |
Sử dụng biệt danh trong quá trình xây dựng, sau đó ghim một bản chụp có ngày trước khi triển khai để bản cập nhật mô hình không bao giờ làm thay đổi hành vi của tác nhân của bạn một cách bất ngờ.

gpt-realtime-2.1-mini làm gì
Đây là một mô hình chuyển giọng nói thành giọng nói. Bạn truyền âm thanh vào, và nó truyền âm thanh trở lại với ngữ điệu tự nhiên, không cần bước chuyển đổi giọng nói thành văn bản hoặc chuyển văn bản thành giọng nói riêng biệt. Nó cũng xử lý văn bản, vì vậy bạn có thể kết hợp nhập liệu bằng văn bản và xuất giọng nói trong cùng một phiên.
Đây là bảng thông số kỹ thuật từ trang mô hình:
| Thuộc tính | Giá trị |
|---|---|
| Phương thức đầu vào | Văn bản, hình ảnh, âm thanh |
| Phương thức đầu ra | Văn bản, âm thanh |
| Cửa sổ ngữ cảnh | 32.000 token |
| Đầu ra tối đa | 4.096 token |
| Kết nối | WebRTC, WebSocket, SIP |
| Giọng nói | alloy, ash, ballad, coral, echo, sage, shimmer, verse, marin, cedar |
marin và cedar là những giọng nói mới nhất và độc quyền của Realtime API; OpenAI khuyến nghị sử dụng chúng để có đầu ra tự nhiên nhất. Các giọng nói cũ hơn vẫn hoạt động nếu bạn muốn một âm sắc cụ thể.
Phiên bản "mini" đánh đổi một chút chiều sâu suy luận để đạt được độ trễ thấp hơn và chi phí thấp hơn đáng kể. Đối với hầu hết các bot hỗ trợ, quy trình nhận đơn hàng và giao diện giọng nói, đây là lựa chọn mặc định phù hợp. Chỉ nên sử dụng phiên bản đầy đủ `gpt-realtime-2.1` khi cuộc hội thoại cần suy luận phức tạp hơn.
Chi phí
Phiên bản Mini có giá khoảng một phần ba so với mô hình đầy đủ. Giá token từ trang giá:
| Mô hình | Đầu vào văn bản | Đầu vào đã cache | Đầu vào âm thanh | Đầu ra âm thanh |
|---|---|---|---|---|
gpt-realtime-2.1-mini |
$0.60 / 1M | $0.30 / 1M | $10 / 1M | $20 / 1M |
gpt-realtime-2.1 (full) |
$4.00 / 1M | $0.40 / 1M | $32 / 1M | $64 / 1M |
Âm thanh chiếm phần lớn chi phí, và yếu tố chi phí lớn nhất là tác nhân của bạn nói bao nhiêu. Một tác nhân nói 35 giây mỗi phút có chi phí gấp đôi so với tác nhân nói 15 giây mỗi phút. Chi phí thực tế mỗi phút cho phiên bản mini dao động khoảng $0.06 đến $0.15 tùy thuộc vào mức độ nói nhiều, vì vậy hãy chỉ dẫn mô hình của bạn nói ngắn gọn và bạn sẽ giảm chi phí trực tiếp. Tỷ giá thay đổi, vì vậy hãy xác nhận với trang giá trực tiếp trước khi dự báo.
Điều kiện tiên quyết
Bạn cần ba thứ:
- Khóa API OpenAI có quyền truy cập Realtime, được đặt là
OPENAI_API_KEY. - Node.js 18+ cho các ví dụ máy chủ (gói
wscho WebSocket thô, hoặc SDKopenaichính thức). - Đối với âm thanh trình duyệt, một trang được phục vụ qua HTTPS hoặc
localhostđểgetUserMediahoạt động.
Một quy tắc trước khi bạn thao tác với trình duyệt: không bao giờ gửi khóa API thực của bạn cho client. Các ứng dụng trình duyệt và di động sử dụng token tạm thời, có thời hạn ngắn thay thế. Thêm chi tiết bên dưới.
Chọn phương thức kết nối
Mô hình mini hỗ trợ ba giao thức truyền tải. Chọn dựa trên nơi âm thanh của bạn được xử lý.
| Giao thức truyền tải | Sử dụng khi | Xác thực |
|---|---|---|
| WebRTC | Âm thanh được thu hoặc phát trong trình duyệt hoặc ứng dụng di động | Mã bí mật client tạm thời |
| WebSocket | Máy chủ của bạn đã xử lý âm thanh thô từ một đường ống media | Khóa API (phía máy chủ) |
| SIP | Bạn đang kết nối điện thoại hoặc hệ thống điện thoại | Khóa API |
Hầu hết mọi người bắt đầu với WebSocket để tạo nguyên mẫu phía máy chủ, sau đó chuyển sang WebRTC cho client thực. Chúng ta sẽ thực hiện cả hai.
Bắt đầu nhanh 1: WebSocket từ máy chủ của bạn
WebSocket là cách nhanh nhất để xem mô hình phản hồi. Điểm cuối là một URL duy nhất với mô hình trong chuỗi truy vấn:
wss://api.openai.com/v1/realtime?model=gpt-realtime-2.1-mini
Bởi vì đây là giao diện GA, bạn xác thực bằng tiêu đề Authorization: Bearer thông thường và bạn không còn cần tiêu đề OpenAI-Beta cũ nữa. Dưới đây là ví dụ "hello world" nhập văn bản, xuất văn bản để bạn có thể kiểm tra mà không cần micrô:
import WebSocket from "ws";
const url = "wss://api.openai.com/v1/realtime?model=gpt-realtime-2.1-mini";
const ws = new WebSocket(url, {
headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
});
ws.on("open", () => {
// 1. Configure the session
ws.send(JSON.stringify({
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-2.1-mini",
output_modalities: ["text"],
instructions: "You are a concise API support agent. Keep answers short.",
},
}));
// 2. Add a user message
ws.send(JSON.stringify({
type: "conversation.item.create",
item: {
type: "message",
role: "user",
content: [{ type: "input_text", text: "What is an idempotent request?" }],
},
}));
// 3. Ask for a response
ws.send(JSON.stringify({ type: "response.create" }));
});
ws.on("message", (raw) => {
const event = JSON.parse(raw.toString());
if (event.type === "response.output_text.delta") process.stdout.write(event.delta);
if (event.type === "response.done") ws.close();
});
Luồng hoạt động luôn giống nhau: cấu hình, thêm đầu vào, yêu cầu phản hồi, lắng nghe các bản cập nhật (deltas). Các sự kiện máy chủ được truyền về dưới dạng JSON. Những sự kiện bạn quan tâm nhất:
session.created/session.updated: cấu hình của bạn đã được chấp nhậnresponse.output_text.delta: một đoạn văn bảnresponse.output_audio.delta: một đoạn âm thanh base64response.output_audio_transcript.delta: bản ghi lại những gì mô hình đang nóiresponse.done: lượt nói đã hoàn thành
Để chuyển từ văn bản sang giọng nói, hãy đổi output_modalities thành ["audio"] và thêm cấu hình âm thanh (phần tiếp theo). Âm thanh đến trong các sự kiện response.output_audio.delta dưới dạng các đoạn PCM base64 mà bạn giải mã và phát.
Bắt đầu nhanh 2: WebRTC trong trình duyệt
Đối với một ứng dụng thoại thực tế, trình duyệt sẽ thu âm từ mic và phát phản hồi trực tiếp, giúp giữ độ trễ thấp. Vấn đề là xác thực: bạn không thể để lộ khóa API của mình, vì vậy máy chủ của bạn phải tạo một token có thời hạn ngắn trước.
Bước 1: tạo một token tạm thời trên máy chủ của bạn. Gọi điểm cuối client-secrets với khóa thực của bạn:
// server side
const r = await fetch("https://api.openai.com/v1/realtime/client_secrets", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
session: { type: "realtime", model: "gpt-realtime-2.1-mini" },
}),
});
const { value } = await r.json(); // ephemeral key, starts with "ek_"
Gửi value đến trình duyệt. Nó hết hạn nhanh chóng, vì vậy rủi ro rò rỉ là thấp.
Bước 2: kết nối từ trình duyệt với WebRTC. Bạn thu âm từ mic, mở một kênh dữ liệu cho các sự kiện, và trao đổi SDP với điểm cuối /v1/realtime/calls:
// browser side: `EPHEMERAL_KEY` came from your server
const pc = new RTCPeerConnection();
// play the model's audio
pc.ontrack = (e) => (document.getElementById("audio").srcObject = e.streams[0]);
// send the mic
const mic = await navigator.mediaDevices.getUserMedia({ audio: true });
pc.addTrack(mic.getTracks()[0]);
// events flow over a data channel
const channel = pc.createDataChannel("oai-events");
channel.onmessage = (e) => console.log(JSON.parse(e.data));
// SDP handshake
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const sdpResp = await fetch(
"https://api.openai.com/v1/realtime/calls?model=gpt-realtime-2.1-mini",
{
method: "POST",
body: offer.sdp,
headers: {
Authorization: `Bearer ${EPHEMERAL_KEY}`,
"Content-Type": "application/sdp",
},
}
);
await pc.setRemoteDescription({ type: "answer", sdp: await sdpResp.text() });
Khi kết nối đã hoạt động, mô hình sẽ lắng nghe trên kênh mic và nói qua pc.ontrack. Bạn gửi cấu hình và văn bản qua cùng kênh dữ liệu oai-events bằng cách sử dụng chính xác các sự kiện JSON từ ví dụ WebSocket.
Định hình phiên làm việc
Đối tượng session là nơi bạn kiểm soát hành vi. Đây là phiên bản âm thanh đầy đủ của những gì bạn đã thấy ở trên:
{
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-2.1-mini",
output_modalities: ["audio"],
instructions: "You are a friendly booking assistant. Confirm details before acting.",
audio: {
input: {
format: { type: "audio/pcm", rate: 24000 },
turn_detection: { type: "semantic_vad" },
},
output: {
format: { type: "audio/pcm", rate: 24000 },
voice: "marin",
},
},
},
}
Các trường quan trọng:
instructions: lời nhắc hệ thống của bạn. Đặt vai trò, các quy tắc bảo vệ, và "ngắn gọn" nếu bạn quan tâm đến chi phí.output_modalities:["audio"]cho tác nhân nói chuyện,["text"]cho bot chỉ có bản ghi.audio.output.voice: chọn từ mười giọng nói;marinhoặccedarnghe tự nhiên nhất.audio.input.turn_detection: cách mô hình quyết định bạn đã ngừng nói.semantic_vadchờ một khoảng dừng tự nhiên về ý nghĩa;server_vadkích hoạt khi có sự im lặng. Phát hiện ngữ nghĩa ít bị gián đoạn hơn và cảm thấy mượt mà hơn trong cuộc hội thoại.
Thay đổi bất kỳ trường nào trong cuộc gọi bằng cách gửi một session.update khác. Bạn không cần phải kết nối lại.
Thêm công cụ để tác nhân có thể hành động
Một tác nhân giọng nói chỉ có thể trò chuyện thì chỉ là một bản demo. Để đặt bàn hoặc kiểm tra đơn hàng, mô hình cần các công cụ. Realtime sử dụng cùng một hợp đồng gọi hàm như các phần khác của nền tảng: bạn khai báo các hàm trong phiên, mô hình phát ra một lệnh gọi, bạn chạy nó và bạn đưa kết quả trở lại. Nếu bạn đã từng tích hợp công cụ vào API trò chuyện trước đây, thì đây là cùng một mô hình tư duy; hướng dẫn của chúng tôi về gọi hàm của OpenAI bao gồm sơ đồ chi tiết, và đầu ra có cấu trúc giúp ích khi bạn cần các đối số phải khớp với một hình dạng nghiêm ngặt.
Khai báo các công cụ bên trong phiên, sau đó xử lý sự kiện response.function_call_arguments.done, chạy mã của bạn và đăng một conversation.item.create với kết quả trước response.create tiếp theo. Đối với bất kỳ điều gì phức tạp hơn một vài hàm, AgentKit của OpenAI cung cấp cho bạn một cách cao cấp hơn để điều phối các tác nhân giọng nói đa bước.
Kiểm tra các điểm cuối với Apidog trước khi xây dựng
Bạn không muốn gỡ lỗi một lệnh gọi REST và bắt tay WebSocket bằng cách đọc nhật ký console trong một ứng dụng chưa hoàn thiện. Hãy kiểm tra từng phần riêng lẻ trước. Đây là lúc Apidog phát huy tác dụng trong một quy trình làm việc thời gian thực.
Hai điều đáng để xác thực trước khi bạn viết mã client:
- Điểm cuối token.
POST https://api.openai.com/v1/realtime/client_secretslà một lệnh gọi REST thông thường. Tạo một yêu cầu trong Apidog, thêm tiêu đềAuthorization: Bearercủa bạn, đưa phần thân JSON với ID mô hình của bạn vào và gửi đi. Bạn sẽ thấy tokenek_và thời hạn của nó ngay lập tức, vì vậy bạn biết rằng khóa và quyền truy cập tài khoản của mình hoạt động tốt ngay cả trước khi WebRTC được đưa vào. Đây là cùng một cách tiếp cận mà bạn sẽ sử dụng để kiểm tra nhanh bất kỳ bề mặt REST nào của OpenAI, như Responses API. - Luồng tin nhắn WebSocket. Apidog có một client WebSocket, vì vậy bạn có thể mở kết nối đến
wss://api.openai.com/v1/realtime?model=gpt-realtime-2.1-mini, thêm tiêu đề xác thực và gửi thủ công các tin nhắnsession.update,conversation.item.create, vàresponse.createtừng cái một. Việc theo dõi các sự kiện máy chủ trở lại trong một bảng điều khiển dễ đọc sẽ làm cho trình tự sự kiện trở nên rõ ràng, và bạn có thể lưu các tin nhắn làm ví dụ cho nhóm của mình. Nếu bạn đã dựa vào các chiến lược kiểm thử API vững chắc, thì điều này hoàn toàn phù hợp.
Việc kiểm tra lớp truyền tải riêng lẻ có nghĩa là khi có gì đó hỏng trong ứng dụng, bạn đã biết rằng đó không phải là hợp đồng API. Tải Apidog nếu bạn muốn làm theo.
Kiểm soát chi phí
Đầu ra âm thanh là phần tốn kém, vì vậy một vài thói quen sau sẽ có ích:
- Yêu cầu mô hình nói ngắn gọn. Việc thêm "Giữ câu trả lời trong một hoặc hai câu" vào hướng dẫn sẽ trực tiếp cắt giảm số token đầu ra âm thanh.
- Ghim một bản chụp trong môi trường sản xuất.
gpt-realtime-mini-2025-12-15sẽ không thay đổi; biệt danhgpt-realtime-minicó thể thay đổi. - Sử dụng
semantic_vad. Ít gián đoạn sai hơn có nghĩa là ít lãng phí các phản hồi nửa vời mà bạn phải trả tiền. - Lưu trữ lời nhắc hệ thống của bạn trong bộ nhớ cache. Đầu vào đã cache có giá 0.30 đô la cho mỗi 1 triệu so với 0.60 đô la cho đầu vào văn bản mới, vì vậy một khối hướng dẫn ổn định sẽ rẻ hơn trong mỗi lượt.
- Đóng các phiên không hoạt động. Một kết nối mở với người dùng không hoạt động vẫn là một phiên mà bạn có thể bị tính phí.
Các lỗi thường gặp và cách khắc phục
- 401 Unauthorized: khóa sai, hoặc bạn đã gửi một token tạm thời đã hết hạn. Các khóa tạm thời được thiết kế để có thời hạn ngắn; hãy tạo một khóa mới cho mỗi phiên.
- Model not found: kiểm tra ID chính xác. Đó là
gpt-realtime-2.1-mini, không phảigpt-realtime-mini-2.1. - Không có âm thanh trong trình duyệt: có thể bạn đã không gắn luồng từ xa trong
pc.ontrack, hoặc trang không ở trên HTTPS/localhost nên micrô không bao giờ được mở. - Mô hình không ngừng nói chồng lên người dùng: chuyển
turn_detectionsangsemantic_vadvà xác nhận rằng kênh mic đang đến kết nối. - Gửi tiêu đề beta: điểm cuối GA không muốn
OpenAI-Beta: realtime=v1. Hãy bỏ nó đi.
FAQ
- gpt-realtime-2.1-mini có giống với gpt-realtime-mini không? Thực tế là có.
gpt-realtime-2.1-minilà ID có phiên bản,gpt-realtime-minilà biệt danh trỏ đến bản chụp mới nhất (gpt-realtime-mini-2025-12-15). Sử dụng biệt danh để xây dựng, ghim bản chụp để triển khai. - Tôi có thể sử dụng nó để chuyển giọng nói thành văn bản thông thường thay vì một tác nhân giọng nói không? Realtime API được xây dựng cho việc chuyển giọng nói thành giọng nói tương tác. Đối với việc chuyển giọng nói thành văn bản một lần, các mô hình chuyển giọng nói thành văn bản chuyên dụng của OpenAI phù hợp hơn. Sử dụng mô hình realtime mini khi bạn cần một cuộc trò chuyện hai chiều với độ trễ thấp.
- Tôi có cần WebRTC không, hay WebSocket là đủ? WebSocket là đủ cho các đường ống phía máy chủ và các nguyên mẫu nhanh. Sử dụng WebRTC khi trình duyệt hoặc ứng dụng di động thu và phát âm thanh trực tiếp, vì nó xử lý luồng media và độ trễ cho bạn.
- Tôi nên chọn giọng nói nào?
marinvàcedarlà những giọng nói mới nhất và tự nhiên nhất, và chúng độc quyền cho Realtime API. Tám giọng nói khác (alloy, ash, ballad, coral, echo, sage, shimmer, verse) vẫn hoạt động nếu bạn muốn một âm thanh cụ thể. - Chi phí được tính như thế nào? Theo token, chia theo phương thức. Đối với mini: 0.60 đô la cho mỗi 1 triệu đầu vào văn bản, 10 đô la cho mỗi 1 triệu đầu vào âm thanh, và 20 đô la cho mỗi 1 triệu đầu ra âm thanh. Đầu ra âm thanh là chi phí chủ yếu, vì vậy mức độ nói nhiều là đòn bẩy chính của bạn.
- Nó có thể gọi hàm như các mô hình trò chuyện không? Có. Realtime sử dụng cùng một hợp đồng gọi hàm, vì vậy một tác nhân giọng nói có thể tra cứu đơn hàng, kiểm tra hàng tồn kho, hoặc kích hoạt các hành động giữa cuộc trò chuyện.
Tiếp theo nên làm gì
Bây giờ bạn đã có toàn bộ vòng lặp: ID mô hình chính xác, một nguyên mẫu WebSocket, một client WebRTC trên trình duyệt, cấu hình phiên, các công cụ và một cách để kiểm tra từng phần trong Apidog trước khi đưa vào sản xuất. Bắt đầu với ví dụ WebSocket chỉ có văn bản để xác nhận quyền truy cập, chuyển output_modalities sang âm thanh, sau đó chuyển sang WebRTC khi bạn đã sẵn sàng sử dụng micrô thực. Ghim một bản chụp, hướng dẫn mô hình nói ngắn gọn, và bạn sẽ có một tác nhân giọng nói độ trễ thấp mà không làm bạn bất ngờ về hóa đơn.
