◉GEMINI LABEN
●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…●ARGON — gemini-4-argon が 10/13 に GA。複雑なコーディング・エージェント・数学・科学向けです●DEEP RES — deep-research-pro-preview-12-2025 は 10/23 に停止、残り6日。移行先は deep-research-preview-04-2026●NANO — gemini-nano-banana-2.1 が GA(10/06)。gemini-3.1-flash-image は非推奨で停止日は未発表です●MCP — ツール結果が 8.5万トークンに膨らんだ事例を、ADK で 310 トークンに包んで抑えた報告が出ています●FLASH — gemini-3.7-flash と 3.5-flash は新しい Flash モデルに自動で回されます(10/08)●NEW — クラッシュ報告を毎回ゼロから読ませない — 既知バグ早見表を先に grep し…
記事一覧/API / SDK
◈ API / SDK/2026-04-04中級

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

Gemini Live API でリアルタイム音声会話ができるエージェントを構築する入門記事です。API の準備から基本実装、Web アプリケーションへの組み込み、Node.js + Express によるバックエンド構成、高度な機能の追加まで段階的に説明します。

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

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-10-16
models は 200 なのに generateContent だけ 403 になる日 — 切り分けの順番を先に決めておく
モデル一覧の取得は 200 で通るのに、生成リクエストだけが 403 permission_denied で止まるときの切り分け手順です。キー・プロジェクト・請求の順に確かめる小さな診断スクリプトと、リトライしてはいけない理由、サポートへ渡す材料の揃え方をまとめました。
◈ API / SDK2026-10-14
config に「Extra inputs are not permitted」が出たら、キーの綴りを一つずつ疑います
google-genai SDK で config を渡した途端に pydantic の ValidationError(extra_forbidden)が出る原因は、ほぼ綴りの一字違いです。手元で再現した出力と、呼び出し前に怪しいキーを洗う関数、text が None になる場合の見分け方を書き残します。
◈ API / SDK2026-10-08
停止日のない非推奨をどう扱うか — 画像モデルの移行先を、3つの条件で選び直す
10月6日に gemini-nano-banana-2.1 が GA になり、gemini-3.1-flash-image は停止日の書かれないまま非推奨になりました。解像度・参照画像・検索の3条件で移行先を選ぶ表と、確認用の短いスクリプトをまとめます。