GEMINI LABEN
NANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定ですNANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定です
記事一覧/API / SDK
API / SDK/2026-04-04中級

Gemini Live APIで音声エージェントを作る入門

Gemini Live APIを使ってリアルタイム音声会話ができる音声エージェントを構築する方法を解説。APIセットアップから実装例まで。

Gemini Live API6音声エージェントリアルタイム音声Gemini Flash LiveAPI開発2

Gemini Live APIが登場し、AIエージェントがリアルタイムで音声会話ができるようになりましました。従来のテキストベースのやり取りから、自然な音声インタラクションへと進化し、ユーザー体験が大きく向上しています。

ここではGemini Live APIを使って音声エージェントを実装する方法を、初心者向けに分かりやすく解説します。

Gemini Live APIとは

Gemini Live APIは、Google Geminiの最新モデルであるGemini Flash Liveを活用したリアルタイム音声通信APIです。

主な特徴

  • リアルタイム処理: 入力音声をリアルタイムで処理し、遅延なく応答
  • 自然な会話: 音声の感情やトーンを認識し、より自然な対話が可能
  • 低遅延: エッジ処理によって、応答時間が最小化されている
  • マルチターン対話: 会話の履歴を保持して、文脈に基づいた応答ができる

Gemini Flash Liveは、標準のGeminiモデルよりも軽量で、リアルタイム音声処理に最適化されています。

必要な準備

1. Google APIキーの取得

Gemini Live APIを使用するには、Google APIキーが必要です。

Google AI Studioにアクセスし、以下の手順でキーを生成します:

  1. 「Get API Key」ボタンをクリック
  2. 新規プロジェクトを作成(またはプロジェクト選択)
  3. 「Create API Key」を実行
  4. 生成されたAPIキーをコピー
export GEMINI_API_KEY="YOUR_GEMINI_API_KEY"

2. 環境構築

Node.jsを使った開発環境を例に説明します。

npm init -y
npm install google-generative-ai dotenv

基本的な実装

最小限の音声エージェント

const { GoogleGenerativeAI } = require('@google/generative-ai');
require('dotenv').config();
 
const apiKey = process.env.GEMINI_API_KEY;
const genAI = new GoogleGenerativeAI(apiKey);
 
async function createVoiceAgent() {
  const model = genAI.getGenerativeModel({
    model: 'gemini-2.0-flash-live'
  });
 
  const session = model.startSession({
    generationConfig: {
      temperature: 0.7,
      topK: 40,
      topP: 0.95
    }
  });
 
  console.log('音声エージェントが起動しました。話しかけてください...');
 
  const audioData = Buffer.from('your_audio_bytes');
 
  try {
    const response = await session.sendMessage({
      inlineData: {
        mimeType: 'audio/webm',
        data: audioData.toString('base64')
      }
    });
 
    console.log('エージェントの応答:');
    console.log(response.response.text());
 
  } catch (error) {
    console.error('エラーが発生しました:', error);
  }
 
  await session.end();
}
 
createVoiceAgent();

ウェブアプリケーションでの実装

ブラウザで音声入力を取得してGemini Live APIに送信する方法です:

<!DOCTYPE html>
<html>
<body>
  <button id="startBtn">開始</button>
  <button id="stopBtn">停止</button>
  <div id="response"></div>
 
  <script>
    let mediaRecorder;
    let audioChunks = [];
 
    document.getElementById('startBtn').addEventListener('click', async () => {
      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
      mediaRecorder = new MediaRecorder(stream);
 
      mediaRecorder.ondataavailable = (event) => {
        audioChunks.push(event.data);
      };
 
      mediaRecorder.onstop = async () => {
        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });
        await sendToGeminiAPI(audioBlob);
      };
 
      mediaRecorder.start();
    });
 
    document.getElementById('stopBtn').addEventListener('click', () => {
      mediaRecorder.stop();
    });
 
    async function sendToGeminiAPI(audioBlob) {
      const audioBase64 = await blobToBase64(audioBlob);
 
      const response = await fetch('/api/gemini-voice', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          audio: audioBase64,
          mimeType: 'audio/webm'
        })
      });
 
      const data = await response.json();
      document.getElementById('response').innerText = data.reply;
    }
 
    function blobToBase64(blob) {
      return new Promise((resolve) => {
        const reader = new FileReader();
        reader.onloadend = () => {
          const base64 = reader.result.split(',')[1];
          resolve(base64);
        };
        reader.readAsDataURL(blob);
      });
    }
  </script>
</body>
</html>

バックエンドの実装例(Node.js + Express)

const express = require('express');
const { GoogleGenerativeAI } = require('@google/generative-ai');
require('dotenv').config();
 
const app = express();
app.use(express.json({ limit: '50mb' }));
 
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
 
app.post('/api/gemini-voice', async (req, res) => {
  try {
    const { audio, mimeType } = req.body;
 
    const model = genAI.getGenerativeModel({
      model: 'gemini-2.0-flash-live'
    });
 
    const response = await model.generateContent({
      contents: [
        {
          role: 'user',
          parts: [
            {
              inlineData: {
                mimeType: mimeType,
                data: audio
              }
            }
          ]
        }
      ]
    });
 
    const reply = response.response.text();
    res.json({ reply });
 
  } catch (error) {
    console.error('エラー:', error);
    res.status(500).json({ error: error.message });
  }
});
 
app.listen(3000, () => {
  console.log('サーバーがポート3000で起動しました');
});

音声エージェントの高度な機能

1. マルチターン対話

複数のやり取りを続ける場合、セッションの状態を保つことが重要です:

const session = model.startSession();
 
const response1 = await session.sendMessage(message1);
const response2 = await session.sendMessage(message2);
 
await session.end();

2. カスタム指示の設定

エージェントの振る舞いを制御するためのシステムプロンプトを設定:

const model = genAI.getGenerativeModel({
  model: 'gemini-2.0-flash-live',
  systemInstruction: {
    parts: [
      {
        text: 'あなたは親切なカスタマーサービスエージェントです。'
      }
    ]
  }
});

全体を振り返って

Gemini Live APIを使用することで、自然な音声会話ができるAIエージェントの実装が可能になります。今回紹介した実装例を参考に、自分のプロジェクトに合わせてカスタマイズしてみてください。

個人開発の現場から — 音声は「沈黙」をどう埋めるか

個人開発で Dolice Labs のアプリを触っている私自身、Gemini Live API で音声エージェントを組んでみて痛感したのは、応答の賢さより「間(ま)」の設計が体験を左右する、ということでした。ネットワークが一瞬詰まって無音が続くと、ユーザーは即座に「壊れた」と感じます。

私は、生成を待つ間に短い相づちや「考えています」の合図を返し、切断時はすぐ再接続を試みるようにしています。完璧な一文を待たせるより、会話が途切れない感触を保つほうが、音声では満足度が高いと感じています。

加えて、音声では割り込み(ユーザーが話し始めたら即座に応答を止める)の実装が体験を大きく左右します。私は再生中でも入力を監視し、発話を検知したら生成を中断するようにしています。一方的に喋り続けないだけで、ぐっと自然な会話に近づきます。

音声品質そのものも体験を左右します。私はマイク入力のノイズ抑制と、環境音が多いときの感度調整を最初に詰めるようにしています。聞き取りの精度が安定すると、後段の会話設計がぐっと楽になると感じています。

シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

API / SDK2026-07-11
字幕が踊るのを止める — Live Translate の途中結果を確定と揺れに分けて描く
Gemini 3.5 Live Translate の途中結果をそのまま画面に貼ると字幕がちらついて読めません。確定した接頭辞と揺れる末尾を分離し、後方書き換えを許さない安定化ロジックを、実測値と動くコードでまとめました。
API / SDK2026-07-05
アプリに会話翻訳を組み込む — Live API で音声から音声へ、遅延と切断に耐える設計
Gemini 3.5 Live Translate と Live API で、音声から音声への会話翻訳をアプリに組み込む設計をまとめました。セッション寿命・言語の自動切り替え・遅延バジェット・ストリーミング課金の勘所を、動くコードとともに整理しています。
API / SDK2026-06-16
Gemini Live API のセッションが切れるたびに会話が消える — 期限切れトークンの再取得とセッション再開の実装メモ
Gemini Live API の WebSocket が再接続するたびに会話履歴とユーザーの発話を取りこぼす問題を、エフェメラルトークンの単発消費・セッション再開ハンドル・goAway 予告の3点から実装で塞ぐ運用メモです。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →