🎬

AIで作る業務動画 Day 2|Gemini TTS APIで音声ファイルを生成する

に公開

今日のゴール

Gemini TTS APIをセットアップして、テキストから音声ファイル(WAV)を生成できるようにする。


昨日は31日間で何をやるか全体像を整理した。今日から実際に手を動かしていく。

まずは音声生成から。台本を読み上げてくれる「声」がないと動画は始まらない。

前提条件

  • Googleアカウントを持っている
  • Pythonがインストール済み(3.9以上)

Pythonのバージョン確認。

python --version
# Python 3.12.10

手順

Step 1: Google AI StudioでAPIキーを取得

Google AI Studioにアクセスする。

左メニューの「Get API key」をクリックして、「Create API key」でAPIキーを発行する。

発行されたAPIキーをコピーしておく。

Step 2: 環境変数にAPIキーを設定

APIキーをソースコードに直接書くのはセキュリティ上よくない。環境変数に設定する。

Windowsの場合

コマンドプロンプトで以下を実行。

setx GOOGLE_API_KEY "your-api-key-here"

注意: setxで設定した環境変数は、新しいプロセスからしか見えない。VS CodeやCursorを使っている場合は、エディタの再起動が必要

新しいタブやターミナルを開いても反映されないことがある。自分も最初「環境変数が設定されていない」というエラーで30分くらい悩んだ。結局Cursorを再起動したら解決した。詳しくはつまずいたポイントで図解している。

Step 3: Pythonパッケージをインストール

Google公式のSDKをインストールする。

pip install google-genai

インストール確認。

pip show google-genai
# Name: google-genai
# Version: 1.56.0

Step 4: サンプルコードで音声生成

以下のPythonスクリプトを作成する。

"""
Gemini TTS API - Hello World サンプル
"""

import os
import wave
from google import genai
from google.genai import types

def main():
    # APIキーを環境変数から取得
    api_key = os.environ.get("GOOGLE_API_KEY")
    if not api_key:
        print("エラー: GOOGLE_API_KEY 環境変数が設定されていません")
        return

    # クライアントを初期化
    client = genai.Client(api_key=api_key)

    # テスト用テキスト
    test_text = "こんにちは。これはGemini TTSのテストです。"

    print(f"テキスト: {test_text}")
    print("音声生成中...")

    # Gemini 2.5 Flash で音声生成
    response = client.models.generate_content(
        model="gemini-2.5-flash-preview-tts",
        contents=f"Read aloud the following text in Japanese: {test_text}",
        config=types.GenerateContentConfig(
            response_modalities=["AUDIO"],
            speech_config=types.SpeechConfig(
                voice_config=types.VoiceConfig(
                    prebuilt_voice_config=types.PrebuiltVoiceConfig(
                        voice_name="Kore"  # 日本語対応ボイス
                    )
                )
            )
        )
    )

    # 音声データを取得(RAW PCM: 16bit, 24kHz, mono)
    part = response.candidates[0].content.parts[0]
    audio_data = part.inline_data.data

    # WAVファイルとして保存
    output_path = "output_hello.wav"
    with wave.open(output_path, "wb") as wav_file:
        wav_file.setnchannels(1)         # モノラル
        wav_file.setsampwidth(2)         # 16bit = 2 bytes
        wav_file.setframerate(24000)     # 24kHz
        wav_file.writeframes(audio_data)

    print(f"成功: {output_path} に保存しました")

if __name__ == "__main__":
    main()

Step 5: 実行して動作確認

python gemini_tts_hello.py

成功すると以下の出力が表示される。

テキスト: こんにちは。これはGemini TTSのテストです。
音声生成中...
成功: output_hello.wav に保存しました

生成された output_hello.wav を再生してみる。日本語がちゃんと読み上げられていれば成功。

動作確認

確認項目 期待値
スクリプトがエラーなく完了する
WAVファイルが生成される
音声が再生できる
日本語が自然に聞こえる

うまくいかない場合は以下を確認する。

症状 原因 対処
「GOOGLE_API_KEY 環境変数が設定されていません」 環境変数が反映されていない エディタを再起動
「API key not valid」 APIキーが間違っている AI Studioで再発行
「Quota exceeded」 無料枠を超過 翌日まで待つ or 課金設定

今日の成果物

  • 動作確認済みのPython環境
  • Gemini TTS APIでWAVファイルを生成できるスクリプト

つまずいたポイント

環境変数の反映タイミング

Windows + VS Code(Cursor)の組み合わせで環境変数を設定したあと、「新しいターミナルを開けば反映されるはず」と思っていた。でも反映されなかった。

調べてみると、親プロセスが起動したときの環境変数が子プロセスに継承されるという仕組みらしい。

環境変数を設定する前にCursorを起動した場合

Cursorを再起動した場合

ポイント: 子プロセスは「起動時の親」から環境を継承する。起動後にシステム側で変わっても、既存のプロセスには反映されない。

Cursorを再起動したら解決した。

コードのネスト構造

Gemini API のコードを見ると、ネストが深い。

types.GenerateContentConfig(
    response_modalities=["AUDIO"],
    speech_config=types.SpeechConfig(
        voice_config=types.VoiceConfig(
            prebuilt_voice_config=types.PrebuiltVoiceConfig(
                voice_name="Kore"
            )
        )
    )
)

最初は「なんでこんなに入れ子になっているんだ」と思った。調べてみると、Pythonでは引数に key=value の形式で値を渡せる(キーワード引数)。Javaにはこの書き方がないので、見慣れなかった。

慣れてくると「設定項目を型で縛っている」という意図が見えてきた。スプレッドシートの関数を入れ子にするのと似ているかもしれない。

API制限について

結論: 課金設定を有効化すると制限が大幅に緩和される。予算管理に注意しながら課金設定するのがおすすめ。

2025年12月に、Googleが無料枠を大幅に削減したという情報がある。

RPD(Requests Per Day)とは

1日あたりのAPIリクエスト回数の上限。音声生成を1回呼び出すと1リクエストとしてカウントされる。

項目 以前 現在(2025年12月〜)
Gemini 2.5 Pro 無料枠あり 無料枠から削除
Gemini 2.5 Flash 250リクエスト/日 約20リクエスト/日(報告ベース)

課金設定を有効化した場合(有料枠1)

自分は課金設定を有効化している(有料枠1 / Tier 1)。AI Studioで確認した実際の制限値は以下の通り。

モデル RPM RPD
Gemini 2.5 Flash TTS 10/分 100/日
Gemini 2.5 Flash 1,000/分 10,000/日

注意: TTSモデル(Gemini 2.5 Flash TTS)は通常のFlashモデルより制限が厳しい。

実用上の影響

  • 課金設定なし: 約20リクエスト/日(報告ベース)
  • 課金設定あり(有料枠1): 100リクエスト/日

たとえば、3分の動画を作るのに10〜20回のAPI呼び出しが必要だとすると、100回/日なら5〜10本の動画を作れる計算になる。検証や短い動画制作なら十分な枠だと思う。

ただし、長い動画を大量に作る場合は1日で上限に達する可能性がある。その場合は翌日まで待つか、より上位のTierへのアップグレードを検討することになる。

Tip: 台本の確認段階では Gemini 2.5 Flash(10,000回/日)でテキスト生成の動作確認をして、最終的な音声生成だけ Gemini 2.5 Flash TTS(100回/日)を使う、という運用にすればTTSの枠を節約できる。

API制限は予告なく変わることがあるので、最新情報はAI Studioで確認するのが確実。今回試した範囲(数回の音声生成)では問題なく動作した。

検証環境

項目 バージョン
OS Windows 11 Pro
Python 3.12.10
google-genai 1.56.0
検証日 2026-01-01

明日のテーマ: Gemini TTSで技術用語を読ませる。ボイスの選択肢や、スタイル制御(話速、トーン)を試してみる。


シリーズを追いかける

著者ページ(Zenn)

Discussion