GPT Translator Logo
实时与流式传输

实时翻译 API

几分钟内即可为任何应用添加实时语音翻译功能。输入音频流,接收翻译后的音频和文本转录——全部通过单个 WebSocket 连接完成。

为什么选择实时翻译 API?

专为需要即时、持续翻译的应用而构建。一个持久连接即可处理整个会话——无需轮询、无需延迟、无需复杂逻辑。

超低延迟

流式音频会被实时翻译并返回。无需请求-响应往返——说话者讲话时即可收到结果。

音频输入与输出

发送原始麦克风音频并接收翻译后的语音。同时还会流式传输输入和输出文本,方便您实时显示字幕。

130+ 种语言

使用标准 BCP-47 语言代码即可翻译到任何主流语言。无需修改 SDK 即可在不同会话间切换目标语言。

默认安全

每个连接都会通过您的 JWT Token 进行身份验证。会话按用户隔离——您的音频永远不会被共享或存储。

快速开始

连接与身份验证

实时翻译 API 运行在专用的 Socket.IO 命名空间上。建立连接时,请将 API 密钥作为查询参数传递——服务器会在会话开始前进行验证。

接口地址
wss://api.gpttranslator.co
  └── namespace: /api/realtime-translator
JavaScript — Socket.IO
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。

Node.js backend (server-side)
// 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));
会话流程

会话生命周期

每个翻译会话都遵循一个简单的五步流程。理解这个顺序将帮助您构建稳定可靠的集成。

1

启动会话

你发送

发送 translation_start 并附带目标语言代码。服务器会预留您的令牌余额并开始初始化会话。

socket.emit('translation_start', { "targetLanguage": "es" });
2

等待就绪信号

你监听

服务器会按顺序发送三个状态事件:session_initializing、translation_ready,最后是 ready_for_audio。只有在收到 ready_for_audio 后才开始发送音频。

socket.on('session_initializing', callback);
socket.on('translation_ready', callback);
socket.on('ready_for_audio', callback);
3

流式传输音频块

你发送

持续发送 audio_chunk 事件,其中包含从麦克风采集并经过 Base64 编码的 PCM16 音频。请保持音频块较小(约 100 毫秒)以获得最低延迟。

socket.emit('audio_chunk', { "audioData": "<base64-pcm16-string>" });
4

接收翻译结果

你监听

在翻译过程中,服务器会流式返回 output_audio(翻译后的语音)、output_transcript(翻译后的文本)以及 input_transcript(识别出的原始文本)——全部以增量 delta 的形式发送。

socket.on('output_audio', callback);
socket.on('output_transcript', callback);
socket.on('input_transcript', callback);
5

结束会话

你发送

发送 translation_stop 以正常关闭会话。令牌使用量会被最终结算,并通过 translation_closed 事件确认会话结束。

socket.emit('translation_stop');
API 参考

事件参考

实时翻译 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 示例,展示如何建立连接、启动会话、流式传输音频、处理所有服务器事件以及正常结束会话。

realtime-translator.js
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 事件。

预计令牌消耗

1 分钟
~3,000 个令牌
适合快速测试
5 分钟
~15,000 个令牌
短会议或面试
30 分钟
~90,000 个令牌
长时间对话
1 小时
~180,000 个令牌
会议或讲座
会话时长
预计消耗令牌
说明

注意: 令牌消耗为估算值。实际消耗取决于音频噪声水平和会话活动。请在控制台查看实时使用情况。

音频指南

音频格式要求

为了获得最佳准确率和最低延迟,API 需要特定的音频格式。请使用下面的代码示例在浏览器中采集并转换麦克风音频。

格式PCM 16-bit, little-endian
采样率24 000 Hz
声道1(单声道)
传输编码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 的常见问题。