TTS(Text-to-Speech)の技術は近年目覚ましい進歩をしています。以前は読み上げ音声の抑揚が気になることもありましたが、今では講演の練習に使いたくなるほど自然です。今回はGemini 3.8 Flash TTSを使い、Pythonで文章からWAVファイルを作ってみます。
こんにちは。wat(@watlablog)です。今話題のGemini 3.8 Flash TTSを使ってみます!
Gemini 3.8 Flash TTSとは?
Gemini 3.8 Flash TTSは、Googleが提供するテキスト読み上げ用のAIモデルです。文章を入力すると、その内容を音声に変換できます。モデルをAPIから指定するときの名前は gemini-3.8-flash-tts です。
日本語や英語を含む130以上の言語に対応し、声の種類に加えて、落ち着いた話し方や明るい話し方といったスタイルも指定できます。自分の声を録音して複製する機能もあります。この記事では、まず文章から音声を生成し、WAVファイルとして保存する方法を試します。
PythonでTTSをするメリット
Pythonから音声を生成できると、文章を変えながら複数の音声ファイルをまとめて作れます。たとえば、音声認識の学習用に「読み上げた音声」と「元の文章」を対にしたデータを用意する、といった使い方ができます。テキストと対になった音声を用意することで、「pydominoで日本語音声データの強制アライメントをやってみた」で紹介した強制アライメントと組み合わせることもできます。精度の良いAIモデルでTTSを行うことで、従来のモデルに見られた違和感を極力排除した自然な発話が得られるはずです。
そして筆者がまず試したかったのは、英語の発表練習です。自分の原稿を読み上げさせれば、発音や文の区切り方を耳で確認できます。文章を少し直してすぐに聴き比べられるのも、Pythonで扱う面白さです。
2026年10月に予定しているPyCon TWは英語での発表をする必要があります!そのためまずは自分専用のお手本音声スクリプトを用意します!
それでは早速PythonでGemini 3.8 Flash TTSを使ってみましょう。
Pythonでテキストを指定してwavファイルを作成する
Pythonコードを作成する
今回は uvを使ってPythonプロジェクトを作成します。プロジェクトディレクトリ gemini-ttsを作成し、 google-genaiを addしましょう。
|
1 2 3 |
uv init gemini-tts cd gemini-tts uv add google-genai |
Pythonコードのサンプルはこちら。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import base64 from google import genai client = genai.Client() interaction = client.interactions.create( model="gemini-3.8-flash-tts", input=[{ "type": "user_input", "content": [{ "type": "text", "text": "こんにちは。今日はスペクトログラムで音を見てみましょう。", "annotations": [{ "type": "speech_metadata", "style": "落ち着いた、聞き取りやすい語り口", }], }], }], response_format={"type": "audio"}, generation_config={ "speech_config": [{"voice": "Kore"}], }, ) with open("out.wav", "wb") as f: f.write(base64.b64decode(interaction.output_audio.data)) print("out.wav を作成しました") |
Google AI StudioにアクセスしてAPIキーを取得する
Google AI Studio(以下リンク先)にアクセスします。
・https://aistudio.google.com
画面にGemini APIキーを取得するため、請求先情報を登録します。こちらは¥800分のクレジットをクレジットカードで購入しておきました。
DashboardからAPIキー一覧ページに飛べるので、そこからキーを取得します。取得したらターミナルから exportします。これは今開いているターミナルで有効です。ターミナルを閉じたらまた exportしてください。
|
1 |
export GEMINI_API_KEY='ここに取得したAPIキー' |
作成された音声(短文日本語)
こちらが上記Pythonコードで作成された音声です。すごく自然ですね!
長文英語音声を作成してみる
次は英語、かつ長文のテキストにしてみましょう。 text項目を次のようにします。この文章は海外PyConの冒頭のセリフをイメージしています。
|
1 2 3 4 5 6 7 8 9 10 11 |
"text": """Good morning, everyone. I’m wat. Thank you for joining me today. Today, I’ll show you how to visualize sound with Python. We usually listen to sound with our ears. But what if we could also see it? What does a whistle look like? How about a piano note? With a spectrogram, we can explore these sounds visually. By the end of this talk, you’ll know how to create a spectrogram and read the patterns it reveals. You don’t need a background in signal processing. Basic Python knowledge is enough. Let’s get started! """, |
こちらが作成された音声です。35sも話しているのに完全に入力のテキスト通りですね。
自分の声をクローニングする
本TTSは自分の声をクローニングすることも可能です。ただし、そのためには以下の2種類のサンプル音声が必要です。
・声の見本:自分が自然に話す、雑音の少ない10~30秒の音声
・同意の録音:自分で指定の同意文を読み上げた音声。日本語にも対応しています。
同意文は以下のリンク先に記載されています。
https://ai.google.dev/gemini-api/docs/voice-replication?utm_source=chatgpt.com&hl=ja
音声が用意できたら次のPythonコードでクローニングを行います。7, 8行目は音声ファイルのパス、45行目は表示名です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
import base64 from pathlib import Path from google import genai MODEL = "gemini-3.8-flash-tts" REFERENCE_WAV = Path("reference_speaker.wav") CONSENT_WAV = Path("speaker_consent.wav") VOICE_ID_FILE = Path("voice_id.txt") OUTPUT_WAV = Path("out_en_cloned.wav") TEXT = """Good morning, everyone. I’m wat. Thank you for joining me today. Today, I’ll show you how to visualize sound with Python. We usually listen to sound with our ears. But what if we could also see it? What does a whistle look like? How about a piano note? With a spectrogram, we can explore these sounds visually. By the end of this talk, you’ll know how to create a spectrogram and read the patterns it reveals. You don’t need a background in signal processing. Basic Python knowledge is enough. Let’s get started!""" client = genai.Client() # 初回だけ、2つの録音から自分の声を登録する if VOICE_ID_FILE.exists(): voice_id = VOICE_ID_FILE.read_text(encoding="utf-8").strip() print(f"登録済みの声を使用します: {voice_id}") else: reference_audio = base64.b64encode(REFERENCE_WAV.read_bytes()).decode("utf-8") consent_audio = base64.b64encode(CONSENT_WAV.read_bytes()).decode("utf-8") replicated_voice = client.voices.create( store=True, voice={ "model": MODEL, "type": "replicated", "display_name": "myself", "replicated": { "source_audio": { "mime_type": "audio/wav", "data": reference_audio, }, "consent_audio": { "mime_type": "audio/wav", "data": consent_audio, }, }, }, ) voice_id = replicated_voice.id VOICE_ID_FILE.write_text(voice_id, encoding="utf-8") print(f"声を登録しました: {voice_id}") # 登録した声で英文を読み上げる interaction = client.interactions.create( model=MODEL, input=[{ "type": "user_input", "content": [{ "type": "text", "text": TEXT, "annotations": [{ "type": "speech_metadata", "style": "calm, clear, and easy to follow", }], }], }], response_format={"type": "audio"}, generation_config={ "speech_config": [{"voice": voice_id}], }, ) OUTPUT_WAV.write_bytes(base64.b64decode(interaction.output_audio.data)) print(f"{OUTPUT_WAV} を作成しました") |
こちらが作成された音声です。PyCon JPで筆者の声を聞いた人は、まさに本人が話していると思うことでしょう。ただし、本人はこんなに流暢ではありません!
styleを次のように変更してみましょう。これも自然言語で指示可能、かつ日本語でもOKです。
|
1 |
"style": "優秀な講演者に聞こえるように抑揚をつけたりクリアな発音を意識する。ただし英語ネイティブの発音を崩さないようにする。", |
こちらが生成された音声です。ちょっと雰囲気変わったかな?
トークンと料金のイメージはこちら。アプリで公開してバズってしまったら高額になってしまいそうだけど、上記文章だと2円くらいのコストですね。
まとめ
今回は備忘録的な記事なのでここでおしまいですが、すごく自然な音声をつくれることを確認しました。Pythonでやるなら文章は別途テキストファイルを読み込んで使った方が良いかもしれませんが、自然言語で話し方を変更できることや、長文でも安定していることが確かめられました。
直近は英語の練習に使ってみようかなと思いますが、今回使ってみてアプリ化のアイデアがいくつか出てきました。これは後ほど検討しようと思います。
Gemini 3.8 Flash TTSを使ってみました!
Xでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!

ついにWATLABブログから書籍「いきなりプログラミングPython」が発売しました!