Gemini Live API を使用したリアルタイム翻訳

Gemini Live API は、gemini-3.5-live-translate-preview モデルを使用して、70 以上の言語間で低レイテンシのリアルタイム音声翻訳をサポートしています。翻訳設定で Live API を構成すると、ある言語の音声をストリーミングして別の言語のオーディオ出力を受け取ることができるため、シームレスなリアルタイム音声翻訳が可能になります。

ライブ対応のエージェントとリアルタイム翻訳

どちらも Live API を使用しますが、リアルタイム翻訳のメンタルモデルは、会話型リアルタイム エージェントのインタラクションとは異なります。

ライブ対応のエージェント リアルタイム翻訳
モデルはアシスタントとして機能します。ユーザーの代わりにリッスン、推論、アクションを実行します。 モデルは通訳者として機能します。リアルタイム翻訳パイプラインとして動作します。
ターンベースのインタラクションを使用します。一時停止、インテント検出に依存し、中断を処理します。 継続的なストリーム処理を使用します。話者が話しているときに、順番を待たずに翻訳します。
ツールとエージェントをサポートします。関数呼び出し、Google 検索、指示をネイティブでサポートします。 翻訳のみをサポートします。低レイテンシの翻訳のみ。ツールや指示はサポートされていません。
完全にマルチモーダルです。テキスト、音声、動画、画像の入力をサポートします。 音声が制限されています。厳格なリアルタイム レイテンシのしきい値を確保するため、入力は音声に限定されます。
詳細な構成。生成、音声、ツール、システム指示を使用します。 シンプルな構成。target_language_codeecho_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 キーを公開しないようにできます。

リアルタイム翻訳でエフェメラル トークンを使用する場合:

  1. v1beta エンドポイントを使用する必要があります。
  2. 構成のロック: デフォルトでは、サーバーのトークン作成制約で translationConfig を指定する必要があります。これにより、翻訳構成がロックされ、クライアントによる改ざんを防ぐことができます。
  3. 構成のロック解除: クライアントサイドで 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

次のステップ