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にアクセスし、以下の手順でキーを生成します:
- 「Get API Key」ボタンをクリック
- 新規プロジェクトを作成(またはプロジェクト選択)
- 「Create API Key」を実行
- 生成された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 で音声エージェントを組んでみて痛感したのは、応答の賢さより「間(ま)」の設計が体験を左右する、ということでした。ネットワークが一瞬詰まって無音が続くと、ユーザーは即座に「壊れた」と感じます。
私は、生成を待つ間に短い相づちや「考えています」の合図を返し、切断時はすぐ再接続を試みるようにしています。完璧な一文を待たせるより、会話が途切れない感触を保つほうが、音声では満足度が高いと感じています。
加えて、音声では割り込み(ユーザーが話し始めたら即座に応答を止める)の実装が体験を大きく左右します。私は再生中でも入力を監視し、発話を検知したら生成を中断するようにしています。一方的に喋り続けないだけで、ぐっと自然な会話に近づきます。
音声品質そのものも体験を左右します。私はマイク入力のノイズ抑制と、環境音が多いときの感度調整を最初に詰めるようにしています。聞き取りの精度が安定すると、後段の会話設計がぐっと楽になると感じています。