Chuyển giọng nói thành văn bản theo thời gian thực
Liên tục gửi âm thanh qua Realtime WebSocket và nhận văn bản chuyển đổi bổ sung cùng kết quả cuối cùng.
Chuyển giọng nói thành văn bản thời gian thực nhận âm thanh liên tục qua kết nối WebSocket lâu dài và trả về văn bản bổ sung cùng kết quả cuối cùng theo từng mục âm thanh. Phù hợp cho phụ đề trực tiếp, ghi nhanh cuộc họp, chuyển cuộc gọi thành văn bản và nhập liệu bằng giọng nói; nếu cần tải lên toàn bộ tệp ghi âm trong một lần, hãy dùng API chuyển giọng nói thành văn bản từ tệp.
gpt-live-transcribe phù hợp với văn bản bổ sung có độ trễ thấp; gpt-transcribe phù hợp để chuyển đổi chính xác cao sau khi gửi đoạn giọng nói đầy đủ và có thể trả về ngôn ngữ được phát hiện trong sự kiện cuối cùng. Mô hình trong kết nối và phiên phải giống nhau.
wss://api.agtcloud.cn/v1/realtime?model=MODEL_IDXác thực và kết nối
Ứng dụng phía máy chủ nên dùng Bearer API Key trong bước bắt tay WebSocket:
| 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-Safety-Identifier | Mã định danh người dùng cuối đã ẩn thông tin nhạy cảm, tùy chọn |
API WebSocket của trình duyệt thông thường không cho tùy chỉnh Header Authorization, vì vậy không đưa API Key dài hạn vào HTML, JavaScript phía trình duyệt hoặc gói máy khách. Sản phẩm trình duyệt nên thiết lập kết nối qua backend đáng tin cậy hoặc cơ chế thông tin xác thực ngắn hạn có kiểm soát.
Yêu cầu âm thanh đầu vào
Âm thanh đầu vào trong tài liệu này sử dụng PCM16 little-endian, 24 kHz, đơn kênh, không có phần đầu tệp WAV hoặc định dạng chứa khác. audio trong input_audio_buffer.append là chuỗi Base64 của byte PCM thô.
Khi gửi theo thời gian thực, nên dùng đoạn âm thanh nhỏ với kích thước ổn định; mỗi sự kiện không nên vượt quá 15 MiB. Định dạng, tần số lấy mẫu hoặc xử lý định dạng chứa sai sẽ khiến chuyển giọng nói thành văn bản thất bại.
Cấu hình phiên
session.type trong session.update cố định là transcription. Cấu hình chuyển giọng nói thành văn bản nằm tại session.audio.input.transcription:
| Trường | Mô tả |
|---|---|
model | Mô hình chuyển giọng nói thành văn bản giống với URL kết nối |
prompt | Gợi ý tình huống nghiệp vụ, môi trường nói và ngữ cảnh |
keywords | Gợi ý tên riêng, chữ viết tắt và tên sản phẩm, không bảo đảm bắt buộc xuất hiện trong đầu ra |
languages | Danh sách ngôn ngữ dự kiến, ví dụ zh-cn, en |
delay | Cài đặt độ trễ cho mô hình thời gian thực, ví dụ low |
noise_reduction.type=near_field phù hợp với tai nghe có micrô; far_field phù hợp với phòng họp hoặc micrô máy tính xách tay. Đặt null để tắt khử nhiễu.
Gửi thủ công và VAD phía máy chủ
turn_detection: null: sau khi gửi âm thanh, máy khách gọiinput_audio_buffer.commit, phù hợp khi nghiệp vụ chủ động kiểm soát phân đoạn.- VAD phía máy chủ: cấu hình ngưỡng, khoảng âm thanh đệm trước giọng nói và thời gian im lặng để máy chủ tự phát hiện giọng nói bắt đầu và kết thúc.
Trong chế độ thủ công, không gửi bộ đệm rỗng. Khi bật VAD, có thể cập nhật giao diện ghi âm theo speech_started và speech_stopped, nhưng kết quả cuối cùng vẫn phải dựa vào sự kiện completed.
Ví dụ kết nối
Các ví dụ sau giả định audio.pcm đã được chuyển sang âm thanh thô PCM16, 24 kHz, đơn kênh. Ứng dụng thời gian thực nên liên tục gửi các khối âm thanh nhỏ thay vì đọc toàn bộ bản ghi một lần.
import fs from 'node:fs';
import WebSocket from 'ws';
const ws = new WebSocket('wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID', {
headers: {
Authorization: 'Bearer your-api-key',
},
});
ws.on('open', async () => {
ws.send(JSON.stringify({
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"format": { "type": "audio/pcm", "rate": 24000 },
"noise_reduction": { "type": "near_field" },
"transcription": {
"model": "MODEL_ID",
"prompt": "Cuộc gọi hỗ trợ khách hàng bằng tiếng Trung",
"keywords": ["AGTCloud", "Cổng API"],
"languages": ["zh-cn", "en"]
},
"turn_detection": null
}
}
}
}));
const audio = fs.createReadStream('audio.pcm', { highWaterMark: 4800 });
for await (const chunk of audio) {
ws.send(JSON.stringify({
type: 'input_audio_buffer.append',
audio: chunk.toString('base64'),
}));
await new Promise((resolve) => setTimeout(resolve, 100));
}
ws.send(JSON.stringify({ type: 'input_audio_buffer.commit' }));
});
ws.on('message', (message) => {
const event = JSON.parse(message.toString());
if (event.type.endsWith('.delta')) process.stdout.write(event.delta);
if (event.type.endsWith('.completed')) console.log('\n', event.transcript);
});Tham khảo sự kiện
Máy khách dùng sự kiện phiên và bộ đệm âm thanh để điều khiển đầu vào; máy chủ liên kết văn bản bổ sung, văn bản cuối cùng và lỗi bằng Item ID. Các mục âm thanh có thể hoàn tất theo thứ tự khác nhau, vì vậy nên tổng hợp văn bản theo item_id.
session.update
Cấu hình phiên chuyển giọng nói thành văn bản thời gian thực, âm thanh đầu vào và cách phân đoạn.
| Trường | Kiểu | Bắt buộc | Mô tả | Ví dụ |
|---|---|---|---|---|
event_id | chuỗi | Không | ID sự kiện do máy khách tạo. | evt_session_001 |
type | chuỗi | Có | Cố định là session.update. | session.update |
session.type | chuỗi | Có | Cố định là transcription. | transcription |
session.audio.input.format.type | chuỗi | Có | Tài liệu này sử dụng PCM16 little-endian. | audio/pcm |
session.audio.input.format.rate | số nguyên | Có | Tần số lấy mẫu của đầu vào PCM. | 24000 |
session.audio.input.noise_reduction.type | chuỗi | Không | Khử nhiễu trường gần hoặc trường xa. | near_field |
session.audio.input.transcription.model | chuỗi | Có | Mô hình chuyển giọng nói thành văn bản giống với URL kết nối. | MODEL_ID |
session.audio.input.transcription.prompt | chuỗi | Không | Gợi ý về tình huống và ngữ cảnh chuyển giọng nói thành văn bản. | Cuộc gọi hỗ trợ khách hàng bằng tiếng Trung |
session.audio.input.transcription.keywords | mảng chuỗi | Không | Gợi ý tên riêng, chữ viết tắt hoặc tên sản phẩm. | ["AGTCloud", "Cổng API"] |
session.audio.input.transcription.languages | mảng chuỗi | Không | Danh sách ngôn ngữ dự kiến. | ["zh-cn", "en"] |
session.audio.input.transcription.delay | chuỗi | Không | Cài đặt độ trễ cho mô hình thời gian thực. | low |
session.audio.input.turn_detection | đối tượng hoặc null | Có | null dùng cách gửi thủ công; đối tượng bật VAD phía máy chủ. | null |
{
"event_id": "evt_session_001",
"type": "session.update",
"session": {
"type": "transcription",
"audio": {
"input": {
"format": {
"type": "audio/pcm",
"rate": 24000
},
"noise_reduction": {
"type": "near_field"
},
"transcription": {
"model": "MODEL_ID",
"prompt": "Cuộc gọi hỗ trợ khách hàng bằng tiếng Trung",
"keywords": [
"AGTCloud",
"Cổng API"
],
"languages": [
"zh-cn",
"en"
],
"delay": "low"
},
"turn_detection": null
}
}
}
}Xử lý lỗi và khôi phục
| Loại | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
| Bắt tay thất bại | Địa chỉ WSS, API Key hoặc Header yêu cầu sai | Sửa tham số kết nối rồi thiết lập lại kết nối |
| Lỗi tham số | Cấu trúc lồng nhau của phiên, giá trị trường hoặc mô hình không nhất quán | Đọc error.event_id và sửa sự kiện máy khách tương ứng |
| Lỗi âm thanh | Định dạng, tần số lấy mẫu, Base64 hoặc phần đầu tệp không đúng yêu cầu | Chuyển đổi lại âm thanh và xóa bộ đệm |
| Chuyển giọng nói thành văn bản thất bại | Âm thanh không thể nhận dạng hoặc mục âm thanh hiện tại xử lý thất bại | Ghi lại Item ID thất bại và chỉ thử lại đoạn giọng nói tương ứng |
| Kết nối bị ngắt | Mất mạng hoặc phiên không còn hiệu lực | Dừng gửi âm thanh, giới hạn kết nối lại và tạo lại phiên |
Văn bản bổ sung có thể được sửa trong kết quả sau, nên không ghi vào bản ghi bất biến khi nhận delta; chỉ transcript trong completed mới là văn bản cuối cùng của mục âm thanh hiện tại.