📻

Gemini と VOICEVOX API を使って NotebookLM 風の Podcast 生成をやってみた

に公開

要約

  • MarkItDown を使って HTML/PDF をマークダウンに変換
  • Gemini Flash 2.5 Preview を用いて、解説記事と対話台本を作成し、構造化
  • VOICEVOX API (Aivis Speech) を用いて読み上げ
  • Gradio で WebUI を作成

成果物

コード (ローカルなら 5 分前後で生成できるはず):
https://github.com/p1atdev/podcastvox

Web デモ (生成に 20 分くらいかかります):
https://huggingface.co/spaces/p1atdev/PodcastVox

サンプル音声:
https://x.com/p1atdev_art/status/1929196857948844430

サンプルで使っている論文:
https://arxiv.org/abs/2309.17400

目的

ちょっと前に NotebookLM が日本語の Podcast 生成に対応したので、面白いな〜と思いながらたまに使っていました。

それで、そういえば最近の技術だと、PDF や HTML をマークダウンにするのは MarkItDown でできるし、Gemini Flash 2.5 の日本語力も良い感じになってて、Aivis Speech のいい感じな読み上げもあり、NotebookLM みたいな Podcast 作れそうかもと思ったので、試してみました。
無料でいい感じの声で Podcast 生成できたらきっと楽しいんじゃないかな?うん、きっとそう!

構成

主に使用したモデルやライブラリ等は以下:

エージェント系のライブラリを使ってみたかったんですが、どれもタスクに対してオーバーキルすぎる気がしたので、結局使いませんでした。
裏側でどういう処理されてるのかもよくわからないので、わりかし低めのレベルでいじれると気持ち的に嬉しいのもありました。

ただ、LLM の API 呼び出しに関してはモデルを後ですり替えたりしやすいように、ラッパーの litellm を使いました。
これでプロバイダーによるインターフェースの違いを吸収してくれます。

流れ

ほとんど要約の通りで、以下の流れで処理をしています。

  1. URL からコンテンツ取得
  2. MarkItDown でよしなにマークダウン化
  3. Gemini Flash で解説記事を作成
    • この方が一発で台本書かせるよりもやりやすそうな気がしたのでこの段階を入れているが、別に比較検証はしていないので不要かもしれない
    • ただ、台本は割とこの解説記事に依存しているっぽいので、タスクの分解としては悪くないかも
    • あと、音声聞きながら書き言葉のテキストを眺められるという利点もちょっとある
  4. Gemini Flash で対話形式の台本を作成
    • この時点では構造化出力はしない (構造化出力で何かタスクやらせると性能下がるらしい[1] ので段階を分けることにした)
  5. Gemini Flash で構造化出力
    • 作成した台本を与えて、JSON スキーマに従うように出力してもらう
    • 比較的簡単なタスクだが、構造化出力できるモデルが Flash くらいしかないので結局ここも Flash でやった
  6. VOICEVOX API 経由で音声合成
    • 構造化した会話データをもとに、音声を合成
    • 会話を生成し切ったら、音声を繋げる

感想

周辺技術が充実してきているのもあって、特に苦労なく作ることができました。特に、

  • Gemini Flash が割といい感じで、Podcast 台本をそんなに細かい指示なしで作成できた
  • Aivis Speech の読み上げがかなり体験が良く、読み上げる際、英単語だけでなく論文に登場しがちな読み方がよくわからない造語でも、結構それっぽい感じで自然な読み上げてくれる

あたりが特に良く、本当に変なところで詰まったりしなかったです。

作る前は、プロンプトエンジニアリングとか、特殊な読み方の単語の登録とか、そこらへんで苦労するかな〜と想定していたのですが、全然そんなことなかったです。

唯一詰まったところは、HuggingFace Spaces で Aivis Speech Engine を依存関係に含めようとした時の、バージョンの解決と manifest 系ファイルの扱いでした。バージョンについては組み合わせそうあたりでエラー出ない組み合わせを手動で探してどうにかなりました。マニフェストや resource 系はいい感じの方法が思いつかなかったので submodule で妥協しました。

Vibe Coding やってみたかったんですが、LLM に最近ここら辺のライブラリを使える気がしなかったのと、使えるとしても結局自分で書いた方が早そうだなってなってしまって、結局使いませんでした... バイブス上げていかないといけない...

総括としては、いい感じの声で Podcast を生成できるのはかなり楽しいです。

脚注
  1. https://huggingface.co/osmosis-ai/Osmosis-Structure-0.6B#aime-1983-2024-dataset ↩︎

GitHubで編集を提案

Discussion