Gemini Live API は、gemini-3.5-live-translate-preview モデルを使用して、70 以上の言語間で低レイテンシのリアルタイム音声翻訳をサポートしています。翻訳設定で Live API を構成すると、ある言語の音声をストリーミングして別の言語のオーディオ出力を受け取ることができるため、シームレスなリアルタイム音声翻訳が可能になります。
ライブ対応のエージェントとリアルタイム翻訳
どちらも Live API を使用しますが、リアルタイム翻訳のメンタルモデルは、会話型リアルタイム エージェントのインタラクションとは異なります。
| ライブ対応のエージェント | リアルタイム翻訳 |
|---|---|
| モデルはアシスタントとして機能します。ユーザーの代わりにリッスン、推論、アクションを実行します。 | モデルは通訳者として機能します。リアルタイム翻訳パイプラインとして動作します。 |
| ターンベースのインタラクションを使用します。一時停止、インテント検出に依存し、中断を処理します。 | 継続的なストリーム処理を使用します。話者が話しているときに、順番を待たずに翻訳します。 |
| ツールとエージェントをサポートします。関数呼び出し、Google 検索、指示をネイティブでサポートします。 | 翻訳のみをサポートします。低レイテンシの翻訳のみ。ツールや指示はサポートされていません。 |
| 完全にマルチモーダルです。テキスト、音声、動画、画像の入力をサポートします。 | 音声が制限されています。厳格なリアルタイム レイテンシのしきい値を確保するため、入力は音声に限定されます。 |
| 詳細な構成。生成、音声、ツール、システム指示を使用します。 | シンプルな構成。target_language_code や echo_target_language などの切り替えを設定します。 |
始める
次の例では、クライアントを初期化し、翻訳構成で Live API に接続する方法を示します。
Python
import asyncio
from google import genai
from google.genai import types
client = genai.Client()
model = "gemini-3.5-live-translate-preview"
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
input_audio_transcription=types.AudioTranscriptionConfig(),
output_audio_transcription=types.AudioTranscriptionConfig(),
translation_config=types.TranslationConfig(
target_language_code="pl",
echo_target_language=True
)
)
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
print("Session started with translation")
# Start receiving the translated audio stream
async for response in session.receive():
if response.server_content:
if response.server_content.input_transcription:
print(f"Input transcript: {response.server_content.input_transcription.text}")
if response.server_content.output_transcription:
print(f"Output transcript: {response.server_content.output_transcription.text}")
if response.server_content.model_turn:
for part in response.server_content.model_turn.parts:
if part.inline_data:
audio_data = part.inline_data.data
# Play or process the translated audio chunk
print(f"Received audio chunk ({len(audio_data)} bytes)")
if __name__ == "__main__":
asyncio.run(main())
JavaScript
import { GoogleGenAI, Modality } from '@google/genai';
const ai = new GoogleGenAI({});
const model = 'gemini-3.5-live-translate-preview';
const config = {
responseModalities: [Modality.AUDIO],
inputAudioTranscription: {},
outputAudioTranscription: {},
translationConfig: {
targetLanguageCode: 'pl',
echoTargetLanguage: true
}
};
async function main() {
const session = await ai.live.connect({
model: model,
config: config,
callbacks: {
onopen: () => console.debug('Opened'),
onmessage: (message) => {
const content = message.serverContent;
if (content?.inputTranscription) {
console.log('Input transcript:', content.inputTranscription.text);
}
if (content?.outputTranscription) {
console.log('Output transcript:', content.outputTranscription.text);
}
if (content?.modelTurn?.parts) {
for (const part of content.modelTurn.parts) {
if (part.inlineData) {
const audioData = part.inlineData.data;
// Play or process the translated audio chunk (base64 encoded)
console.debug(`Received audio chunk (${audioData.length} bytes)`);
}
}
}
},
onerror: (e) => console.debug('Error:', e.message),
onclose: (e) => console.debug('Close:', e.reason),
},
});
console.debug("Session started with translation");
}
main();
WebSockets
const API_KEY = "YOUR_API_KEY";
const MODEL_NAME = "gemini-3.5-live-translate-preview";
const WS_URL = `wss://generativelanguage.googleapis.com/ws/google.ai.generativelanguage.v1beta.GenerativeService.BidiGenerateContent?key=${API_KEY}`;
const websocket = new WebSocket(WS_URL);
websocket.onopen = () => {
console.log('WebSocket Connected');
const setupMessage = {
setup: {
model: `models/${MODEL_NAME}`,
generationConfig: {
responseModalities: ['AUDIO'],
inputAudioTranscription: {},
outputAudioTranscription: {},
translationConfig: {
targetLanguageCode: 'pl',
echoTargetLanguage: true
}
}
}
};
websocket.send(JSON.stringify(setupMessage));
};
websocket.onmessage = (event) => {
const response = JSON.parse(event.data);
if (response.serverContent) {
const content = response.serverContent;
if (content.inputTranscription) {
console.log('Input transcript:', content.inputTranscription.text, `(${content.inputTranscription.languageCode})`);
}
if (content.outputTranscription) {
console.log('Output transcript:', content.outputTranscription.text, `(${content.outputTranscription.languageCode})`);
}
if (content.modelTurn?.parts) {
for (const part of content.modelTurn.parts) {
if (part.inlineData) {
const audioData = part.inlineData.data;
// Play or process the translated audio chunk (base64 encoded)
console.debug(`Received audio chunk (${audioData.length} bytes)`);
}
}
}
}
};
音声を送信する
翻訳用の音声入力をストリーミングするには、RAW、リトル エンディアン、16 ビット PCM 音声を送信します。
- 入力音声形式: RAW 16 ビット PCM、16kHz(モノラル、リトル エンディアン)。
- 出力音声形式: RAW 16 ビット PCM、24kHz(モノラル、リトル エンディアン)。
- チャンクサイズとレイテンシ: 100 ミリ秒のチャンクで音声を送信します。
次の例は、音声チャンクをセッションに送信する方法を示しています。
Python
# Assuming 'chunk' is your raw PCM audio bytes
await session.send_realtime_input(
audio=types.Blob(
data=chunk,
mime_type="audio/pcm;rate=16000"
)
)
JavaScript
// Assuming 'chunk' is a Buffer of raw PCM audio
session.sendRealtimeInput({
audio: {
data: chunk.toString('base64'),
mimeType: 'audio/pcm;rate=16000'
}
});
WebSockets
// Assuming 'chunk' is a Buffer of raw PCM audio
function sendAudioChunk(chunk) {
if (websocket.readyState === WebSocket.OPEN) {
const audioMessage = {
realtimeInput: {
audio: {
data: chunk.toString('base64'),
mimeType: 'audio/pcm;rate=16000'
}
}
};
websocket.send(JSON.stringify(audioMessage));
}
}
構成
翻訳を有効にするには、セッションのセットアップ時に generationConfig 内で translationConfig を指定する必要があります。
設定メッセージの構成
generationConfig は、文字起こしを有効にするために次のフィールドをサポートしています。
inputAudioTranscription: 存在する場合、モデルが入力音声のテキスト文字起こしを送信できるようにするオブジェクト。outputAudioTranscription: 存在する場合、モデルが出力(翻訳)音声のテキスト文字起こしを送信できるようにするオブジェクト。
translationConfig は次のフィールドをサポートしています。
targetLanguageCode: モデルに翻訳させる言語の BCP-47 言語コード(例: ポーランド語の場合は"pl"、スペイン語の場合は"es")。デフォルトは"en"です。echoTargetLanguage: すでにターゲット言語になっている入力音声を処理する方法を示すブール値。trueに設定すると、モデルはすでにターゲット言語になっている入力音声をエコー(オウム返し)します。falseに設定すると、入力音声がすでにターゲット言語になっている場合、モデルは無音になります。デフォルトはfalseです。
設定メッセージの構造の例を次に示します。
"setup": {
"model": "models/gemini-3.5-live-translate-preview",
"generationConfig": {
"responseModalities": [
"AUDIO"
],
"inputAudioTranscription": {},
"outputAudioTranscription": {},
"translationConfig": {
"targetLanguageCode": "pl",
"echoTargetLanguage": true
}
}
}
クライアントサイド アプリケーションでエフェメラル トークンを使用する
クライアントからサーバーへのアプリケーションでは、エフェメラル トークン(現在は v1beta)を使用して API キーを公開しないようにできます。
リアルタイム翻訳でエフェメラル トークンを使用する場合:
v1betaエンドポイントを使用する必要があります。- 構成のロック: デフォルトでは、サーバーのトークン作成制約で
translationConfigを指定する必要があります。これにより、翻訳構成がロックされ、クライアントによる改ざんを防ぐことができます。 - 構成のロック解除: クライアントサイドで
translationConfigを設定できるようにする場合(ユーザーがターゲット言語を選択できるようにする場合など)、トークン作成リクエストから省略し、代わりに"lock_additional_fields": []を設定する必要があります。これにより、クライアントサイドで設定されるtranslationConfigのロックが解除されます。
制約付きのエフェメラル トークンを作成する
次の例では、翻訳制約を使用してエフェメラル トークンを作成する方法を示します。
Python
import datetime
from google import genai
now = datetime.datetime.now(tz=datetime.timezone.utc)
client = genai.Client()
token = client.auth_tokens.create(
config = {
'uses': 1,
'expire_time': now + datetime.timedelta(minutes=30),
'live_connect_constraints': {
'model': 'gemini-3.5-live-translate-preview',
'config': {
'translation_config': {
'target_language_code': 'pl',
'echo_target_language': True
}
}
},
}
)
JavaScript
import { GoogleGenAI } from "@google/genai";
const client = new GoogleGenAI({});
const expireTime = new Date(Date.now() + 30 * 60 * 1000).toISOString();
const token = await client.authTokens.create({
config: {
uses: 1,
expireTime: expireTime,
liveConnectConstraints: {
model: 'gemini-3.5-live-translate-preview',
config: {
responseModalities: ['AUDIO'],
inputAudioTranscription: {},
outputAudioTranscription: {},
translationConfig: {
targetLanguageCode: 'pl',
echoTargetLanguage: true
}
}
},
},
});
REST
curl -X POST "https://generativelanguage.googleapis.com/v1beta/auth_tokens" \
-H "x-goog-api-key: ${GEMINI_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"uses": 1,
"expireTime": "YYYY-MM-DDTHH:MM:SSZ",
"liveConnectConstraints": {
"model": "models/gemini-3.5-live-translate-preview",
"config": {
"responseModalities": ["AUDIO"],
"inputAudioTranscription": {},
"outputAudioTranscription": {},
"translationConfig": {
"targetLanguageCode": "pl",
"echoTargetLanguage": true
}
}
}
}'
制限事項
- 入力モード: 翻訳では音声入力のみがサポートされています。テキスト入力はサポートされていません。
- 音声の複製: 音声の複製は一貫していない場合があります。長い一時停止の後に音声が切り替わったり、音声の開始方法に基づいて間違った性別が割り当てられたり、複数の話者がいる会話中に 1 つの音声で止まったりすることがあります。
- 言語検出: 言語検出は、アクセントが強い場合、類似した言語(スペイン語とポルトガル語など)、言語の切り替えが速い場合に問題が発生します。注: これは入力文字起こしにのみ影響します。言語コードと最終的な翻訳は正確である必要があります。
- 背景音: このモデルは、ノイズや音楽をフィルタしてクリアな音声を作成するように設計されていますが、すべての背景音が無視されるわけではありません。
- ターゲット言語のエコー:
echoTargetLanguage: trueの場合、背景雑音や音楽によって、入力音声がすでにターゲット言語になっている場合に、翻訳された音声にアーティファクトが導入されることがあります。
サポートされている言語
リアルタイム翻訳では、次の言語がサポートされています。
| 言語 | BCP-47 コード | 言語 | BCP-47 コード |
|---|---|---|---|
| アフリカーンス語 | af | カザフ語 | kk |
| Akan | ak | クメール語 | km |
| アルバニア語 | sq | キニヤルワンダ語 | rw |
| アムハラ語 | am | 韓国語 | ko |
| アラビア語 | ar | ラオ語 | lo |
| アルメニア語 | hy | ラトビア語 | lv |
| アゼルバイジャン語 | az | リトアニア語 | lt |
| バスク語 | eu | マケドニア語 | mk |
| ベラルーシ語 | be | マレー語 | ms |
| ベンガル語 | bn | マラヤーラム語 | ml |
| ブルガリア語 | bg | マラーティー語 | mr |
| ビルマ語(ミャンマー) | my | モンゴル語 | mn |
| カタルーニャ語 | ca | ネパール語 | ne |
| 中国語(簡体) | zh-Hans | ノルウェー語 | no、nb |
| 中国語 (繁体) | zh-Hant | ペルシャ語 | fa |
| クロアチア語 | hr | ポーランド語 | pl |
| チェコ語 | cs | ポルトガル語(ブラジル) | pt-BR |
| デンマーク語 | da | ポルトガル語 (ポルトガル) | pt-PT |
| オランダ語 | nl | パンジャブ語 | pa |
| 英語 | en | ルーマニア語 | ro |
| エストニア語 | et | ロシア語 | ru |
| フィリピン語 | fil | セルビア語 | sr |
| フィンランド語 | fi | シンド語 | sd |
| フランス語 | fr | シンハラ語 | si |
| ガリシア語 | gl | スロバキア語 | sk |
| ジョージア語 | ka | スロベニア語 | sl |
| ドイツ語 | de | スペイン語 | es |
| ギリシャ語 | el | スンダ語 | su |
| グジャラート語 | gu | スワヒリ語 | sw |
| ハウサ語 | ha | スウェーデン語 | sv |
| ヘブライ語 | he | タミル語 | ta |
| ヒンディー語 | hi | テルグ語 | te |
| ハンガリー語 | hu | タイ語 | th |
| アイスランド語 | is | トルコ語 | tr |
| インドネシア語 | id | ウクライナ語 | uk |
| イタリア語 | it | ウルドゥー語 | ur |
| 日本語 | ja | ウズベク語 | uz |
| ジャワ語 | jv | ベトナム語 | vi |
| カンナダ語 | kn | ズールー語 | zu |
次のステップ
- Live API の 機能ガイドの全文を読む。
- SDK のスタートガイドを読む。
- WebSocket のスタートガイドを読む。
- クライアントからサーバーへのアプリケーションでの安全な認証については、エフェメラル トークンガイドを読む。
- GitHub から Live API の例のクローンを作成する。