为什么选择实时翻译 API?
专为需要即时、持续翻译的应用而构建。一个持久连接即可处理整个会话——无需轮询、无需延迟、无需复杂逻辑。
超低延迟
流式音频会被实时翻译并返回。无需请求-响应往返——说话者讲话时即可收到结果。
音频输入与输出
发送原始麦克风音频并接收翻译后的语音。同时还会流式传输输入和输出文本,方便您实时显示字幕。
130+ 种语言
使用标准 BCP-47 语言代码即可翻译到任何主流语言。无需修改 SDK 即可在不同会话间切换目标语言。
默认安全
每个连接都会通过您的 JWT Token 进行身份验证。会话按用户隔离——您的音频永远不会被共享或存储。
连接与身份验证
实时翻译 API 运行在专用的 Socket.IO 命名空间上。建立连接时,请将 API 密钥作为查询参数传递——服务器会在会话开始前进行验证。
wss://api.gpttranslator.co └── namespace: /api/realtime-translator
import { io } from 'socket.io-client'; // Connect to the Realtime Translation namespace const socket = io('https://api.gpttranslator.co/api/realtime-translator', { transports: ['websocket'], query: { apiKey: 'YOUR_API_KEY' // your GPT Translator API key }, });
注意: 请在 GPT Translator 控制台的 API Keys 页面获取您的 API 密钥。没有有效 API 密钥的连接会被立即拒绝。
切勿在客户端代码中暴露您的 API 密钥
上面的代码示例仅用于演示。将 API 密钥直接嵌入浏览器 JavaScript 中,会让任何检查页面源代码或网络流量的人都能看到它——任何人都可以使用您的密钥并耗尽您的令牌余额。
✅ 推荐:通过您自己的后端进行代理
您的服务器会安全地保存 API 密钥,并代表浏览器建立 Socket.IO 连接。浏览器只连接到您的服务器,而不会直接连接翻译 API。
// Your backend holds the key — the browser never sees it
const socket = io('https://api.gpttranslator.co/api/realtime-translator', {
transports: ['websocket'],
query: { apiKey: process.env.GPT_TRANSLATOR_API_KEY },
});
// Proxy events between the browser client and the translation API
browserSocket.on('translation_start', (data) => socket.emit('translation_start', data));
browserSocket.on('audio_chunk', (chunk) => socket.emit('audio_chunk', chunk));
browserSocket.on('translation_stop', () => socket.emit('translation_stop'));
socket.on('output_audio', (data) => browserSocket.emit('output_audio', data));
socket.on('output_transcript', (data) => browserSocket.emit('output_transcript', data));
socket.on('input_transcript', (data) => browserSocket.emit('input_transcript', data));会话生命周期
每个翻译会话都遵循一个简单的五步流程。理解这个顺序将帮助您构建稳定可靠的集成。
启动会话
你发送发送 translation_start 并附带目标语言代码。服务器会预留您的令牌余额并开始初始化会话。
等待就绪信号
你监听服务器会按顺序发送三个状态事件:session_initializing、translation_ready,最后是 ready_for_audio。只有在收到 ready_for_audio 后才开始发送音频。
流式传输音频块
你发送持续发送 audio_chunk 事件,其中包含从麦克风采集并经过 Base64 编码的 PCM16 音频。请保持音频块较小(约 100 毫秒)以获得最低延迟。
接收翻译结果
你监听在翻译过程中,服务器会流式返回 output_audio(翻译后的语音)、output_transcript(翻译后的文本)以及 input_transcript(识别出的原始文本)——全部以增量 delta 的形式发送。
结束会话
你发送发送 translation_stop 以正常关闭会话。令牌使用量会被最终结算,并通过 translation_closed 事件确认会话结束。
事件参考
实时翻译 API 中所有事件的完整说明——包括您发送的事件以及您接收的事件。
您发送的事件
你发送translation_start启动新的翻译会话。请传递目标语言的 BCP-47 语言代码。
{
"targetLanguage": "es" // BCP-47 language code (e.g. "fr", "de", "zh", "ja")
}audio_chunk发送一段原始麦克风音频。audioData 字段必须是 Base64 编码的 PCM16 单声道音频缓冲区,采样率为 24,000 Hz。
{
"audioData": "<base64-encoded PCM16 mono audio>"
// Sample rate: 24 000 Hz
// Encoding: 16-bit PCM, little-endian
// Send continuously while the user speaks
}translation_stop正常结束会话。服务器会完成计费并发送 translation_closed。
您监听的事件
你监听session_initializingstatus在 translation_start 后立即发送。表示会话正在初始化——尚未准备好接收音频。
translation_readystatus当服务器端连接建立完成后发送。此时仍在等待最终会话激活。
ready_for_audiostatus会话已完全激活。现在开始发送 audio_chunk 事件。
output_audiostream翻译后语音的一段音频。delta 是一个 Base64 编码的 PCM16 音频缓冲区。请按顺序缓存并播放连续的 delta。
{
"delta": "<base64-encoded PCM16 audio chunk>"
// Decoded and played directly to the output speaker
// Arrives incrementally — buffer chunks for smooth playback
}output_transcriptstream翻译文本的一部分。将多个 delta 拼接起来,以构建完整的翻译文本。
{
"delta": "Hola, ¿cómo estás?" // translated text fragment
}input_transcriptstream识别出的原始语音文本片段。将多个 delta 拼接起来,以生成源语言字幕。
{
"delta": "Hello, how are you?" // recognized source speech fragment
}translation_closedstatus确认会话已正常结束——无论是因为 translation_stop,还是由于令牌耗尽而被服务器关闭。
translation_errorerror发生了意外错误。message 字段会说明具体问题。会话可能仍然处于活动状态——您可以重试或调用 translation_stop。
{
"message": "Translation session error. Please try again."
}insufficient_tokenserror您的令牌余额已耗尽。会话已自动关闭。请升级您的套餐以继续使用。
{
"message": "You have reached the limit of words for translation...",
"remainingTokens": 0
}完整集成示例
一个简洁但完整的 JavaScript 示例,展示如何建立连接、启动会话、流式传输音频、处理所有服务器事件以及正常结束会话。
import { io } from 'socket.io-client';
const socket = io('https://api.gpttranslator.co/api/realtime-translator', {
transports: ['websocket'],
query: { apiKey: 'YOUR_API_KEY' },
});
// ─── Listen for server events ───────────────────────────────────────
socket.on('session_initializing', () => {
console.log('Session is being prepared...');
});
socket.on('translation_ready', () => {
console.log('Session connected. Waiting for activation...');
});
socket.on('ready_for_audio', () => {
console.log('Ready! Start streaming audio chunks now.');
startMicrophone(); // begin capturing and sending audio
});
socket.on('output_audio', ({ delta }) => {
// delta is a base64-encoded PCM16 audio chunk
playAudioChunk(atob(delta));
});
socket.on('output_transcript', ({ delta }) => {
// Append translated text delta to your UI
appendToTranscript('translated', delta);
});
socket.on('input_transcript', ({ delta }) => {
// Append recognized source speech to your UI
appendToTranscript('original', delta);
});
socket.on('translation_closed', () => {
console.log('Session ended.');
stopMicrophone();
});
socket.on('translation_error', ({ message }) => {
console.error('Error:', message);
stopMicrophone();
});
socket.on('insufficient_tokens', ({ message, remainingTokens }) => {
console.warn('Out of tokens:', message, 'remaining:', remainingTokens);
stopMicrophone();
showUpgradePrompt();
});
// ─── Start a session ────────────────────────────────────────────────
socket.emit('translation_start', { targetLanguage: 'es' });
// ─── Stream audio chunks ────────────────────────────────────────────
function onAudioData(pcm16Base64) {
socket.emit('audio_chunk', { audioData: pcm16Base64 });
}
// ─── Stop the session ───────────────────────────────────────────────
function stopSession() {
socket.emit('translation_stop');
}计费方式
实时翻译按会话时长计费——即从会话激活到 translation_stop 或令牌耗尽之间的时间。不按字符或单词数量计费。
按秒计费
使用时长从会话完全激活开始,以秒为单位计算,直到会话结束。不足一秒按一秒向上取整。
实时扣除令牌
每个会话结束后,会根据实际时长从您的余额中扣除令牌。在会话开始之前,会先检查您的可用余额。
自动上限控制
当您的剩余令牌即将耗尽时,会话会自动终止。在会话关闭前,您会收到 insufficient_tokens 事件。
预计令牌消耗
注意: 令牌消耗为估算值。实际消耗取决于音频噪声水平和会话活动。请在控制台查看实时使用情况。
音频格式要求
为了获得最佳准确率和最低延迟,API 需要特定的音频格式。请使用下面的代码示例在浏览器中采集并转换麦克风音频。
PCM 16-bit, little-endian24 000 Hz1(单声道)Base64 string// Capture PCM16 audio from the browser microphone
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const audioContext = new AudioContext({ sampleRate: 24000 });
const source = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(4096, 1, 1);
processor.onaudioprocess = (e) => {
const float32 = e.inputBuffer.getChannelData(0);
// Convert Float32 → Int16 PCM
const int16 = new Int16Array(float32.length);
for (let i = 0; i < float32.length; i++) {
int16[i] = Math.max(-32768, Math.min(32767, float32[i] * 32768));
}
// Base64-encode and send
const base64 = btoa(String.fromCharCode(...new Uint8Array(int16.buffer)));
socket.emit('audio_chunk', { audioData: base64 });
};
source.connect(processor);
processor.connect(audioContext.destination);常见问题
关于集成和使用实时翻译 API 的常见问题。