2025.5.25

gemini-2.5-flash-preview-ttsによる複数スピーカーの音声合成

技術

SCROLL DOWN SCROLL DOWN SCROLL DOWN

こんにちは!AIサービス開発室の鈴木生雄です。

さて、Googleより Gemini API I/O updates という発表がありました。このうち、Gemini 2.5 Pro and Flash text-to-speech (TTS)が複数スピーカー(最大2人)の音声合成をサポートするという点に着目しました。なぜなら、私は英語のインタビューや対談の動画を視聴することが多少あるのですが、リスニング力が不足しているため、字幕がないと内容を十分に把握できないからです。TTSで日本語の音声データを作成できれば、聴覚だけで英語の動画の情報を得ることができるので便利だと思いました。というわけで、それを実現するために試してみたことを紹介します。

事前準備

  • Pythonをインストールする(※バージョン3.11.3で動作確認済)
  • Google Cloud ProjectにてGemini APIを有効化(下図参照)した上で、APIキーを作成する。(※プロジェクトがない場合はプロジェクトの作成からやる必要があります。)

プログラム

requirements.txt … 必要なライブラリ定義

google-genai
python-dotenv

.env … 環境変数

GOOGLE_GENERATIVE_AI_API_KEY=Your API KEY

main.py … メインプログラム

from google import genai
from google.genai import types
import wave
import os
from dotenv import load_dotenv
import json
from datetime import datetime

DEFAULT_INPUT_JSON = "input_conversation.json"

def load_conversation_data(json_file_path):
    try:
        with open(json_file_path, "r", encoding="utf-8") as f:
            data = json.load(f)
        return data
    except FileNotFoundError:
        print(f"エラー: JSONファイルが見つかりません: {json_file_path}")
        return None
    except json.JSONDecodeError:
        print(f"エラー: JSONファイルのデコードに失敗しました: {json_file_path}")
        return None
    except Exception as e:
        print(
            f"ファイル読み込み中に予期せぬエラーが発生しました ({json_file_path}): {e}"
        )
        return None

def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
    try:
        with wave.open(filename, "wb") as wf:
            wf.setnchannels(channels)
            wf.setsampwidth(sample_width)
            wf.setframerate(rate)
            wf.writeframes(pcm)
    except Exception as e:
        print(f"WAVファイルの書き込みエラー ('{file_name}'): {e}")
        return



api_key = os.getenv("GOOGLE_GENERATIVE_AI_API_KEY")
client = genai.Client(api_key=api_key)


conversation_data = load_conversation_data(DEFAULT_INPUT_JSON)
speaker_voice_configs = []
speakers = conversation_data.get("speakers")
for speaker in speakers:
    speaker_voice_configs.append(
        types.SpeakerVoiceConfig(
            speaker=speaker["name"],
            voice_config=types.VoiceConfig(
                prebuilt_voice_config=types.PrebuiltVoiceConfig(
                    voice_name=speaker["voice"],
                )
            ),
        )
    )
instructions = conversation_data.get("instructions")
conversation = conversation_data.get("conversation")
prompt = f"{instructions}\n\n{conversation}"

try:
    response = client.models.generate_content(
        model="gemini-2.5-flash-preview-tts",
        contents=prompt,
        config=types.GenerateContentConfig(
            response_modalities=["AUDIO"],
            speech_config=types.SpeechConfig(
                multi_speaker_voice_config=types.MultiSpeakerVoiceConfig(
                    speaker_voice_configs=speaker_voice_configs
                )
            ),
        ),
    )
except Exception as e:
    print(f"API呼び出し中にエラーが発生しました: {e}")

data = response.candidates[0].content.parts[0].inline_data.data

file_name = "out" + datetime.now().strftime("%Y-%m-%d %H%M%S") + ".wav"
wave_file(file_name, data)

input_conversation.json … Gemini APIに送信するプロンプトの元になる会話データ

{ "speakers": [ { "name": "Berman", "voice": "Charon" }, { "name": "Nadella", "voice": "Puck" } ], "instructions": "Read aloud in a warm, welcoming tone", "conversation": "Berman: サティア、本日はお話しいただきありがとうございます。Buildで発表されたすべてのこと、おめでとうございます。いくつか質問があります。あなたはマイクロソフトでクラウド、オープンソースの採用といった非常に成功した大きな変革を監督してこられました。そして今、私たちはこれらの信じられないほど強力なAIエージェントの台頭という、次の変革期にいます。現在の製品群とそれに伴う大きな変化を維持しながら、どのようにAIへの投資をお考えですか?Nadella: まず、私たちの開発者会議にご参加いただき、本当にありがとうございます。私が考えているのは、まず新しいものを受け入れなければならないということです。AI時代、そしてこのエージェンティングウェブ時代に(数え方にもよりますが)2~3年入った今でさえ、エージェントを構築し、アプリを構築するというパターンはより明確になってきていると思います。ですから、以前のワークロードのために構築したかもしれない技術スタックを、新しいワークロードのために第一原理から真剣に考え直す必要があります。例えばインフラ層です。私たちは世界中に70ものAzureリージョンを持っていることを非常に誇りに思っていますが、今度はそれらをAIファクトリーにするために改修したり適合させたりする必要があるのです。それがやるべきことです。ChatGPTやCopilotのようなアプリでさえ、確かに多くのGPUやAIアクセラレータを必要としますが、それ以外のすべて、実際にはトレーニング中も推論中も大量のストレージ、エージェントの環境を整備するためなどにAIアクセラレートされていない通常のコンピュートも大量に必要とします。興味深いことに、私たちが過去15年間に構築してきたものは、エージェントが以前のどのワークロードよりも多くのものを必要とするため、今ではより relevancia が増しているかもしれませんが、それは異なる規模の単位での話です。それがインフラ層で私たちがやらなければならないことです。データについても同様です。データは常にデータベースを取得し、そこに人、場所、物をスキーマ化することでしたが、今ではインテリジェンス層をデータにもたらすことができます。推論エンジンを直接組み込むのです。私たちが見せた最もクールなデモの1つは、このPostgresで、非常にモジュール化されているため、SQLクエリにLLMの応答を組み合わせることができるようになりました。生成できるクエリプランを考えてみてください。ですから、テックスタックのあらゆる層を再構築する必要があると感じていますが、それはまた、私たちが過去15年間に行ってきた最高の仕事のいくつかを取り入れ、開発者のためにそれを複利的に活かし、その恩恵を受けられるようにすることも意味します。それが私たちの考え方です。つまり、構築されている新しいAIワークロードのために、テックスタックのあらゆる層を第一原理の観点から考え、そしてそれを顧客の現実世界のニーズに合うように実際にまとめ上げるか、ということです。Berman: エンドユーザー、特にOffice 365のような人々が非常に慣れ親しんでいる製品は、急速に変化していくと想定されます。その変化の加速とはどのようなものでしょうか?Nadella: それは魅力的なことです。Officeを見ると、Microsoft 365には3つのモードがあると言えます。1つ目は全く新しいモードで、AIのための新しいUIがあり、文字通りこれが新しい足場となります。チャット、検索、ノートブックがあり、これら異種のデータコレクションをすべて集め、ポッドキャストや音声概要などを作成する場所です。リサーチャーやアナリストのようなエージェントもいます。これらはタスクを委任できるものです。これらすべてを持つことは非常にエキサイティングで、Copilot Studioもあるので、言い換えればエージェントを構築できるのです。それが新しいことであり、AIとエージェントのためのUIがここにあるということです。もう1つの興味深い点は、Teamsがこれらすべてをマルチプレイヤーモードに取り込むことです。これらのエージェントはすべて、私のチャネルや会議で利用可能です。つまり、TeamsはすべてのAIが私とマルチプレイヤーモードで連携するための足場となるのです。そして3つ目のモードは、GitHub CopilotとVS Codeで私が没頭してコーディングしているのと同じように、集中して作業するモードです。しかし、使えるエージェントがいます。Excelのスプレッドシートに没頭していて、そこにCopilotチャットがあります。これは、スプレッドシートを分析している間に隣にデータサイエンティストがいるようなものですし、ドキュメントをリサーチしながら書いている間は、そこにリサーチャーがいます。アイデアとしては、すべてのOfficeキャンバスを、本質的にチャット付きのIDE(統合開発環境)に変えたということです。そのように考えれば、ある意味で、M365システムの価値でさえ、これらのすべての層にインテリジェンスが組み込まれることで、より複合的になったと感じています。Berman: その点についてもう少し続けたいのですが、あなたは以前、ソフトウェア、つまりアプリケーション層はエージェントに集約されるだろうとおっしゃっていました。私はそれについて「SaaSは死んだ」というタイトルの動画を作成し、多くの注目を集めました。それについては本当にクールな考えでしたが、あなたの主張は、エージェント層があり、その下にエージェントが読み書きできるグラウンデッドデータベースがあるというものだと理解しています。それは垂直型SaaS企業にとって何を意味し、彼らはこの未来にどのように備えるべきでしょうか?Nadella: 私たち全員がそうであるように、そのやり方というのは…今日私たちが見せたデモでさえ、文字通りDynamics 365があり、Copilot StudioがCRMや他の多くの記録システムにまたがるマルチエージェントアプリケーションをオーケストレーションするために使用したMCPサーバーがありました。そして、複雑なビジネスプロセスのオーケストレーションを本質的に完了しました。それは今ここにあるように思えます。つまり、ビジネスプロセスやビジネスアプリケーションについて考えるとき、自分自身をそのようなものに構成する必要があることは明白です。ですから、もしあなたが考えていたのが「私は記録システムだ」とか「エンゲージメントシステムだ」とか、あるいは「自分のデータの上にワークフローがあり、それが範囲だ」ということだけだったとしたら、それは永続しません。ですから、私たちは皆、このエージェンティックウェブにおける新しいオーケストレーション層に参加することにオープンでなければならないと思います。そこには本質的に複数のバックエンドが存在することになります。あなたのSaaSアプリケーションは1つのバックエンドになるでしょう。エージェンティックウェブに参加するためには、MCPのようなものをサポートする方が良いでしょう。そして、NL webのようなものが、これらすべてのコネクタの摩擦を減らすことさえできるかもしれません。なぜなら、企業について考えると、コネクタがどのように機能するかという点に大きな摩擦があるからです。NL webのようなものは、企業内部でさえ大きな変化をもたらす可能性があります。ですから、私たちが構築したSaaSアプリケーションは、この未来に適応するために根本的に変わらなければならないかもしれないと思います。Berman: では、これらのSaaS企業は、顧客のためにこのグラウンドトゥルースデータ(信頼できる唯一のデータ源)のキュレーターになり、エージェントはマイクロソフトのようなプラットフォーム企業によって提供されるようになると思いますか?Nadella: つまり、それが最終的にどうなるかは私にも正確にはわかりません。なぜなら、ある意味で私たちは皆、今日持っている1つのものの重要性を過大評価しているからです。しかし現実には、これらのプラットフォームがシフトするとき、価値はいずれにせよどこか別の場所で創造されるのです。ですから、結局のところ、やるべき仕事は何でしょうか?やるべき仕事はビジネスプロセスを完了することであり、特定の記録システムとそのキュレーションについてでも、特定の1つのエージェントや1つのワークフローについてでもありません。その全体についてなのです。ですから、私にとって、水がそこへ流れており、問題は、どうすればそれに沿って流れるかということです。どういうわけか自分には堀があって、それにしがみつくとか、エージェントの頭を持つようなファサードをその周りに構築するとか考えるのではなく、この場合、顧客が成し遂げる必要があることの包括的な視点ではないのです。Berman: 異なる種類のエージェントが互いに会話し、異なるデータベースと連携する、それは問題ではなく、単なる抽象化レイヤーだというお話は本当に素晴らしいと思いました。それはすべて非常にエキサイティングに聞こえます。もう一つ、あなたがインタビューでおっしゃっていたことで、誰かを、従業員を雇うとき、あなたは彼らを将来的に、そして彼らのエージェントのバスケットを雇っているのだ、というのが私には非常に興味深かったのですが、それについて明確に説明していただけますか?なぜなら、ほとんどの場合、企業、つまり雇用主は、従来のIP(知的財産)を所有するのと同じように、エージェントのIPを所有したいと考えるように思えるからです。Nadella: 実際、その通りです。実のところ、あなたがおっしゃったことは、ある種私たちの見解です。今日の発表を見ても、企業の知的財産とは何かということです。職場で働く私たち一人一人の成果物でさえ会社の財産です。そして、それはエージェントの場合も同様になると私は考えています。そしてそれが、私たちがレールを拡張した根本的な理由の1つです。現在、エージェントはエントリIDを持ち、組織内の人々に対して行うのと同じように、これらのエージェントに対する条件付きアクセスを管理できます。もう1つ非常に重要なことは、エージェントがデータにアクセスする場合、同じデータ保護とデータ権限の対象となる必要があるということです。そして、私たちは、ちなみに、エージェント環境をエンドポイントのように管理する予定なので、セキュリティも同様です。だからこそ、Defenderは認証情報の盗難などがないことを確認します。ですから、私たちがID管理とセキュリティに関して人々や彼らのITインフラのために行ってきたことすべてを、エージェントとそのITインフラのために行うことを絶対に考えています。Berman: それは非常に理にかなっています。そして、多くの人々が私生活のために独自の個人エージェントを構築するのではないかと疑っています。そして、彼らがそれらの個人エージェントを職場に持ち込むような未来を想像しますか?Nadella: それは素晴らしい質問です。つまり、自分の個人エージェントを持ち込むシステムは、これら2つの世界でデータ漏洩が起こらないように行われなければなりません。それが問題なのです。つまり、単純な例を挙げると、私の個人メールと会社のメールは、今日では2つの分離されたものであり、2つのアイデンティティであり、プライバシー上の理由と知的財産上の理由の両方から、状態を分離する方法を知っています。その両方が役立ちます。そのようなものが、私たちがEntraとMicrosoftアカウントを信じている理由でもあります。だからこそ、CopilotとMicrosoft 365 Copilotがあり、ユーザーモデルの観点からでさえ、この2つを混同すると非常に混乱する可能性があります。私が2つのプロファイルでEdgeを固定する理由が役立つのは、私がユーザーとして、個人としてMicrosoftアカウントでそれを行い、マイクロソフトで働いているときはEntraでそれを行うからです。そして、このメンタルモデルをシンプルに保つための役立つ区分けです。そうしないと、すべてを混同することで、本当に非常に複雑になってしまうと思います。Berman: それは非常に理にかなっていると思います。そこで、あなたのビジョンについて質問させてください。知能のコストは急速に低下しているように見え、うまくいけばゼロに近づいています。将来、それは非常に魅力的な世界になると思いますが、どうお考えですか?どのようなユースケースが開かれると思いますか?知能のコストがゼロに近づいたときに、何に最も興奮しますか?Nadella: 私にとって究極的には、世界を見渡したとき、生産性と経済成長を最終的に促進できる知能のようなテクノロジーの豊かさがもっと必要でしょうか?絶対にそうです。周りを見渡して、「おい、今、インフレを抑制するにしても経済成長を改善するにしても、助けが必要だ」と思います。ですから、今は絶好の機会なのです。そのことを踏まえ、私たちの開発者会議で共有した例、スタンフォード大学医学部が非常に重要なこと、つまり腫瘍委員会会議や腫瘍学、がん治療のために何ができたかという例を取り上げると、彼らはこのすべてのテクノロジーを取り入れ、現実的な方法で適用することができました。そこでは、ファウンドリで使用したマルチエージェントフレームワークで、病理学、臨床試験、問題データを調整し、最終的により良い腫瘍委員会会議を開き、そこから得られたデータと情報をPowerPointに取り込んで教育クラスにしたり、Teamsに取り込んで人々が共同作業できるようにしたりしました。それが、起こる必要があることだと私は考えています。ヘルスケアは私たちのGDPの20%近くを占め、その費用の多くはこのワークフローにあります。ですから、もしあらゆる医療提供者がAIを使って患者ケアと転帰を改善し、コストを削減し始めることができれば、それは私たちの社会に大きな影響を与えるでしょう。そして、それが私が本当に楽しみにしていることです。Berman: ヘルスケアのユースケースは、私は非常に興奮しています。超個別化医療です。私はすでにChatGPTやCopilotを使って自分の個人的な健康に関する質問に答えてもらっています。それは非常にエキサイティングです。そして、あなたが見せてくれた研究のいくつか、液浸冷却ですね、あれは発見されたものでしたね。とてもクールです。材料科学、そこには本当に多くのものがあります。それで、逸話的に、若い世代の一部から、彼らはAIを完全に避けているか、あるいは軽く使っているだけで、特にエネルギー使用量が私たちの地球にかなり大きな悪影響を与えると考えていると聞きました。マイクロソフトはそれについてどう考えていますか?彼らにどのような自信の言葉をかけますか?Nadella: まず第一に、若い世代がこのことについて深く懸念しているという事実は、率直に言って非常に感動的です。なぜなら、あるレベルでは、それは私たちが創造しているものが何であれ、社会にとって重要なこれらの成果、つまりヘルスケアであれ、教育であれ、金融サービスへのアクセスであれ、どのような分野であれ、最終的には経済成長であり、経済的繁栄と豊かさであるということを、私たち全員が言えるようにするための正しい後押しだからです。ですから、まずそれを第一のこととして捉えましょう。私たちはこれを何らかの技術的成果のためだけにやっているのではなく、人々と地球の課題を解決するためにやっているのです。次に、2番目の部分も重要です。それは、持続可能な方法で行わなければならないということです。持続可能な豊かさです。そして、もしそうであるならば、私が立ち返る方程式の1つは、「トークン・パー・ダラー・パー・ワット」です。ソフトウェアという最も順応性のあるリソースを使って、最も効率的な方法でエネルギーを使用し、最大限の豊かさを生み出し、それが次に健康や教育などの成果を改善するという事実は良いことです。そして、私たちはそれに固執し続けなければなりません。現実には、テクノロジー全体は今日の送電網電力、あるいは総電力消費量の2%か3%程度です。ですから、それはわずかですが、はい、それは倍増するでしょう。そして、もしそれが倍増する必要があるならば、倍増するための社会的許可を得る必要があります。現実世界でより多くの価値を創造する必要があります。実際、それが私たちがテクノロジー業界として、誰もが楽しいことをするために使っている私たちの製品の1つだけに焦点を当てるのではなく、ヘルスケア、材料科学、広範な知識労働、生産性を上げる中小企業に根ざす必要があると感じる理由の1つです。なぜなら、それがエネルギーという希少な資源を使い続けるための社会的許可を私たちに与えてくれるからです。それを、代替エネルギーの最大の買い手のいくつかと持続可能な方法で行います。実際、新しいプロジェクトに対する最大の補助金は、私たちのような人々からのものだと言えるでしょう。私たちはそれを推進し続けることを本当に確実にしたいと思っていますが、最終的には経済的繁栄を生み出すような「トークン・パー・ダラー・パー・ワット」を提供します。Berman: そうおっしゃっていただけて嬉しいです。環境への影響を非常に心配している人たちに、あなたが言ったことを伝え、このビデオを見せます。ありがとうございます。現在、コンピューティングアーキテクチャに間違いなく大きな変化が起きていますね。アーキテクチャの決定論的な部分と非決定論的な部分の境界線が曖昧になってきています。数ヶ月前、拡散モデルを使ってゲームのDoomを再現した本当にクールなデモを見ました。すべてのフレームが予測されていました。オペレーティングシステムが同様になり、従来の基盤となるコードがほとんど、あるいはまったくないような未来を想像したことはありますか?Nadella: 素晴らしいですね。私たちが構築したこのミューズモデルのようなものがありましたが、それは私たちが構築したワールドアクションモデルで、ゲームデータでトレーニングしました。そして、本質的にXboxコントローラーをアクションとして使用して次のシーンを生成し始めることができます。これは非常に、まあ、ロボット工学のようなものだと考えることができますし、ゲームもそのようなものです。ですから、はい、すべてが生成されると言えます。オペレーティングシステムですが、私にとっては、私たちが決定論的システムと呼んでいるものの決定論を過大評価していることさえあるという考え方があります。なぜなら、結局のところ、ソフトウェアプログラムを取っても、それを証明することはできません。それはコンピュータサイエンスの根本的な課題の1つです。ですから、はい、それは確率論的なシステムですが、この確率論的なシステムは、少なくとも私たちが検証できるような決定論的な方法で機能する必要があります。率直に言って、私が基調講演でイーロンにインタビューしたときに彼が言ったことですが、「知能の物理学を理解しなければならない」というのは、実際には良い考え方です。つまり、これらの複雑なシステムを組み合わせるとき、これらの複雑なシステムの物理学を理解し、それらを制限し、サンドボックス化する方法を何とか見つけなければならないということです。オペレーティングシステムでさえ、そうしなければならないと思います。しかし、振り返ってみると、私たちがちょうど立ち上げたコーディングエージェントは、興味深いことに、GitHub Actionsの下に環境を持っています。実際には仮想マシンを配置し、その仮想マシンの境界を設定しています。つまり、インターネットアクセスがあるかどうかを制御する必要があり、MCPサーバーを備えたツールにアクセスする場合はそれを制御する必要があり、そのすべての完全な監査ログがあります。そして、それが、いわば、多くの命令型コードで構築したソフトウェアシステムと、このエージェントを組み合わせて、相互作用自体を監視できるものにする方法を学ぶ方法だと思います。Berman: ええと、それは本当にクールです。なぜなら、基調講演で、私たちはこの移行の中盤戦を始めているとおっしゃっていたからです。ですから、さまざまな種類のソフトウェアがどのように融合していくのかを見るのは、本当に興味深い時期だと思います。お会いできて本当にありがとうございました。感謝します。Nadella: どうもありがとうございました。本当に光栄です。お越しいただき、お時間を割いていただきありがとうございます。またお会いできるのを楽しみにしています。" }

作成例

こんな感じでできました。少し早口に思いましたが割といい感じです。インストラクションを工夫すればもっとよくなるかもしれません。ちなみに、冒頭に概要を解説するナレーションを付け加えています。いきなりインタビューが始めるのも味気ないと感じたので。

元ネタはこちらのインタビュー動画のトランスクリプトです。

所感

複数スピーカーの音声合成は前からやりたいと思っていたので、今回のGemini APIのアップデートでできるようになってよかったです。ちなみに今回はAPIを使いましたが、Google AI Studioでも試せます。TTSはこれまでOpenAIのgpt-4o-mini-ttsを使ってきましたが、品質が不安定なので、gemini-2.5-flash-preview-ttsに切り替えてもよいように思いました。ただし、これでOpenAIがオワコンになったと考えるのは早計です。今のところAIモデルは、下図のように、形勢が本当に目まぐるしく変わるので、情報収集や試行錯誤をしてその時点でのベストが何かを見極めて使うことが大切だと思います。ところで、今回はわざわざトランスクリプトのテキストを用意して、複数スピーカーの音声合成をやりましたが、近い将来にはマルチモーダにコンテンツ生成をするAIが気軽に使えるようになると思います。例えば、英語の動画を入力にして、直接的に日本語の音声にするというのはできるようになるに違いありません。なので、今回のような方法はあくまでそれができるようになるまでのワークアラウンドだと思っています。

出所:https://x.com/piet_dev/status/1924904951064490157