PDFからポッドキャスト風音声を生成する「PDF2Audio」を試す
ここで知った。Notebook LMのAudio Overview機能のクローンって感じみたい。
試すだけならば、上の方のHuggingFace Spacesで試せるので、それを。
どんなプロンプトを使っているのか?とか気になるので、コード見つつ動かしてみようと思う。
GitHubレポジトリ
PDF to Audio Converter
このコードは、PDFをオーディオポッドキャスト、講義、要約などに変換するために使用できます。テキスト生成とテキスト音声変換にはOpenAIのGPTモデルを使用しています。また、ドラフトのトランスクリプトを編集(複数回)したり、特定のコメントを追加したり、全体的な指示を提供したりして、適応や改善の方法を示すこともできます。
機能
- 複数のPDFファイルをアップロード
- 異なる指示テンプレート(ポッドキャスト、講義、要約など)から選択
- テキスト生成と音声モデルのカスタマイズ
- スピーカーごとに異なる音声を選択
- 特定または一般的なコメント、および/または、スクリプトの編集やモデルへの特定のフィードバックによる改善案を基に、ドラフトを繰り返し作成
これのもととなったレポジトリがある様子。
このプロジェクトは、https://github.com/knowsuchagency/pdf-to-podcast および https://github.com/knowsuchagency/promptic で入手可能なコードにインスパイアされ、それを基にしています。
Colabratoryで動くnotebookも用意されている。
notebookの方はこんな感じで、実行するセルは2つしかない。
実行するとこんな感じで、GradioのUIがセル内に表示される。また、GradioのパブリックURLでもアクセスできるので、そちらのほうが使いやすい。
自分はちょっと手元で動かしてみたいので、レポジトリからクローンして動かすことにする。
ではローカルのMacで動かしてみる。
レポジトリクローン。
$ git clone https://github.com/lamm-mit/PDF2Audio && cd PDF2Audio
パッケージインストール。なお、自分は仮想環境を用意した上でやっている。
$ pip install -r requirements.txt
.env
にOpenAI APIキーをセットしておく。
OPENAI_API_KEY="XXXXXXXXXXXX"
では起動
$ python app.py
ブラウザでアクセスすると以下の画面が表示される。
では実際のPDFで試してみる。今回は、神戸市が公開している観光に関する統計・調査資料のうち、「令和5年度 神戸市観光動向調査結果について」のPDFを使う。
PDF直はこれ
PDFをアップロード
アップロードでできたら、モデルやTTSの音声の設定を行う。APIキーは.envで読み込んでいるはずなので不要。お試しなのでモデルは"gpt-4o-mini"に変更して、他はデフォルトのまました。下の方でAPIのベースURLを書き換えることもできるようなので、LiteLLMとかOllamaも使えそうな気がする。
次に指示プロンプトの設定。ビルトインで用意されているテンプレートのは以下の通り。
選択したテンプレートごとに5つのプロンプトが用意されている。
プロンプトの中身は置いておくとして、一旦"podcast"で実行してみる。"Generate Audio"をクリック。
下の方で、処理が行われているのがわかる。
処理が終わると、音声データ、台本が生成される。再生ボタンを押すと再生される。
ただ上記見るとわかるように英語で出力されている。
生成されたスクリプトを直接修正して音声を再生成したり、フィードバックを追加してスクリプト・音声を再生成することもできる。ここでは日本語で出力するようにフィードバックを追加してみる。
日本語で出力された。
出力されたテキストはこちら
speaker-1: みなさん、こんにちは。今日は神戸市が実施した観光動向調査についてお話しします。神戸に訪れる旅行者の特徴や観光の傾向についての貴重なデータが得られたんですよ。
speaker-2: はい、興味深いですね!この調査は観光行政の参考にするために行われたもので、対面のアンケートフィードバックが基になっています。具体的な日程も示されていて、調査は数ヶ月にわたって行われました。
speaker-1: そうです。調査は令和5年5月や9月、11月、そして翌年の2月にも行われたようです。特に、雨天の影響で一部調査地点は延期されたりしたようですが、それでも246ヶ所での調査が行われたんです。
speaker-2: そのサンプル数、すごいですね!神戸各地の人気スポットが取り上げられていましたが、どの地点が調査に使われたのかを教えてもらえますか?
speaker-1: もちろんです。一例を挙げると、北野町広場や南京町広場、そして有馬の温泉周辺など、観光名所がズラリと並びました。合計で6,250のサンプル数が集まったんですよ。
speaker-2: 面白いですね。さてこの調査の目的は何だったんでしょう?
speaker-1: 調査の主な目的は、来神観光客の特質を把握して、神戸市内の観光動向をつかむことです。これは将来の観光行政の参考にするためなんですね。普通の観光客からの直接的なフィードバックが得られるというのは、非常に貴重なことです。
speaker-2: なるほど。観光客の属性についてはどんなことが分かったんですか?
speaker-1: 調査結果によると、神戸を訪れた観光客は女性の方が多く、全体では男性が43.5%、女性が56.5%となっています。特に六甲・摩耶地区を除くと、他の全ての地域で女性の割合が高くなっています。
speaker-2: それに、年齢構成も興味深いですね。60歳以上が24.3%を占めているというのは、神戸が高齢者には魅力的な行き先であることを示唆しています。特に須磨・舞子地区では35.9%が60歳以上だったとのこと。
speaker-1: はい、その通りです。また、旅行者の居住地を見てみると、全体の約76.8%が近畿地方、つまり関西の人々から来ていることが分かります。これには心強い地元の観光客が支えているという側面もあるかもしれませんね。
speaker-2: また面白いのが、交通手段です。神戸までの主な交通手段は車やバイクで約40%、それに鉄道が46%を超えているんですね。地域による違いもあって、特に北野では新幹線利用が多いんです。
speaker-1: そうですね、北野のような人気観光地に行くためには、新幹線を利用した方が便利かもしれませんね。逆に、西北神地区では車やバイクの利用率が極めて高くなるという調査結果が出ていました。
speaker-2: 旅行の動機についても面白いですね。神戸観光のきっかけとしては、「前に来てよかった」が28%で最も高く、次いで「家族・友人・知人の話」が続くという結果も出ています。つまり、リピーターの声が特に大きいということですね。
speaker-1: その通りですね。また、インターネットやSNSも旅行決定の重要な手段となり、旅行者の約40%が事前にネットを利用していることを示しています。
speaker-2: 神戸の観光情報がネットで簡単に得られるというのは、非常に便利ですよね。それに、旅行の同行者という観点でも、「友人知人」という割合が最も高く、家族と来るケースが多いという結果も印象的です。
speaker-1: そうですね。特に西北神地区では「家族(子連れ)」の割合が高いことから、ファミリー層にとっても神戸が魅力的なスポットになっていることがわかります。
speaker-2: さらに旅行の形態としては、全市で72.8%が予約なしで旅行をしているという結果もありました。多くの観光客が自由な旅を選んでいるのですね。
speaker-1: 自由な旅というのは楽しさがありますが、計画を立てたり、宿泊地をしっかり予約することも大切です。特に有馬温泉では、半数以上が予約するという傾向が見られました。
speaker-2: 宿泊は大切な要素ですよね。神戸の宿泊客は全体で46,679円の消費をしているということで、宿泊を伴うことで観光の質も高まるのかなと思います。
speaker-1: 宿泊客の方が消費額が高く、宿泊費だけでも14,118円という高額な結果が出ていましたから、観光地としての神戸の魅力が経済面でも表れていますね。
speaker-2: 他にも観光客からの期待が伝わる結果も出ていて、全市では「多彩なイベント・祭りなどの開催」が期待されているとのこと。
speaker-1: イベントや祭りは観光地にとって重要ですからね。それに続く期待として「案内表示の充実・整備」もあり、観光客が無駄なく楽しめる環境作りが求められています。
speaker-2: 最後に、再来訪を望む人々の割合も非常に高いことがわかりました。約97.6%が再訪を考えているとの調査結果もあり、非常にポジティブな印象を受けます。
speaker-1: 神戸市は今後どのように観光地として進化していくか、期待が大きいですね。観光動向調査結果は、行政の戦略策定にも非常に重要な役割を果たすでしょう。
speaker-2: 観光客の声がどのように反映されるのか、私たちも見守っていきたいですね。今日は神戸市の観光動向調査についてお話ししましたが、皆さんもぜひ神戸の魅力を体験してみてください。
speaker-1: 本日はお付き合いありがとうございました。それではまた次回のポッドキャストでお会いしましょう。
音声
少しプロンプトについて見てみる。
プロンプトは5つのプロンプトから構成されている。例として"podcast"のプロンプトを見てみる。プロンプトはすべて日本語で翻訳している。
Intro Instruction
台本を生成するための最初の指示
あなたの仕事は、与えられた入力テキストを、NPR(米国公共ラジオ放送)のスタイルで、生き生きとした魅力的で有益なポッドキャストの対話に変えることです。入力テキストは、PDFやウェブページなど、さまざまなソースから取得される可能性があるため、雑然としていたり構造化されていない場合があります。
書式の問題や無関係な情報については心配する必要はありません。重要なポイントを抽出し、定義を特定し、ポッドキャストで議論できる興味深い事実を特定することが目的です。
幅広いリスナー層を想定して、使用する用語はすべて慎重に定義してください。
Standard Text Analysis Instructions
生データとテキストを分析するための指示
まず、入力テキストを注意深く読み、主なトピック、キーポイント、興味深い事実や逸話を特定します。この情報を、質の高いプレゼンテーションにふさわしい、楽しく魅力的な方法で提示するにはどうすればよいかを考えます。
Scratch Pad Instructions
ブレインストーミングによるプレゼンテーション/対話の内容を記載するためのメモの指示。
入力テキストで特定した主なトピックとキーポイントについて、創造的な話し合い方を考えましょう。アナロジー、例、ストーリーテリングのテクニック、または仮想シナリオを使用して、リスナーにとってより身近で魅力的なコンテンツを作成することを検討してください。
ポッドキャストは一般のリスナーにも理解できるものでなければなりませんので、専門用語を使いすぎたり、トピックに関する予備知識を前提としたりすることは避けましょう。必要であれば、複雑な概念を簡単に説明する方法を考えてください。
入力テキストのギャップを埋めるために想像力を働かせたり、ポッドキャストで掘り下げていくための示唆に富む質問を考えてみましょう。目標は、有益で楽しい対話を創造することです。自由に創造性を発揮してください。
使用する用語はすべて明確に定義し、背景を説明する努力を惜しまないでください。
ブレインストーミングで考えたアイデアと、ポッドキャストの対談の概要をここに書いてください。最後に繰り返したい重要な洞察や要点を必ず記載してください。
楽しく、ワクワクするものにしてください。
Prelude Dialog
プレゼンテーションや台本が展開される前の導入部分の指示
アイデアを出し合い、大まかなアウトラインを作成したので、今度は実際のポッドキャストの対話を書きましょう。ホストとゲストスピーカーとの間で、自然な会話の流れになるようにしてください。ブレインストーミングセッションで出た最高のアイデアを取り入れ、複雑なトピックはわかりやすく説明するようにしてください。
Podcast Dialog Instructions
プレゼンテーションやポッドキャスト用の台本を生成するための手順の指示
ブレインストーミングセッションで考えた主なポイントや創造的なアイデアを基に、非常に長く、魅力的で、情報豊富なポッドキャストの対話をここに書いてください。会話調で、一般のリスナーが理解できるように、必要な背景や説明を盛り込んでください。
ホストやゲストの架空の名前を使用することは避け、リスナーにとって魅力的で没入感のある体験となるようにしてください。[ホスト] や [ゲスト] のようなカッコ付きのプレースホルダーは使用しないでください。音声で読み上げられることを想定して作成してください。
トピックに沿った魅力的な流れを維持しながら、対話をできるだけ長く、詳細にしましょう。入力テキストの主要な情報を楽しく伝えながら、可能な限り長いポッドキャストエピソードを作成できるよう、最大限の能力を発揮することを目指しましょう。
対談の終わりには、ホストとゲストスピーカーが、話し合いから得られた主な洞察と収穫を自然に要約します。これは会話から自然に流れ、カジュアルな会話形式で重要なポイントを繰り返します。当たり前の要約のように聞こえないように注意してください。目的は、話し合いを終える前に、中心となるアイデアをもう一度強調することです。
ポッドキャストは、20,000語程度にすべきです。
なるほど。でコードを読むとこういうプロンプトになる模様。
あなたの仕事は、与えられた入力テキストを、NPR(米国公共ラジオ放送)のスタイルで、生き生きとした魅力的で有益なポッドキャストの対話に変えることです。入力テキストは、PDFやウェブページなど、さまざまなソースから取得される可能性があるため、雑然としていたり構造化されていない場合があります。
書式の問題や無関係な情報については心配する必要はありません。重要なポイントを抽出し、定義を特定し、ポッドキャストで議論できる興味深い事実を特定することが目的です。
幅広いリスナー層を想定して、使用する用語はすべて慎重に定義してください。
以下が元の入力テキストです。
<input_text>
〜PDFの内容〜
</input_text>
まず、入力テキストを注意深く読み、主なトピック、キーポイント、興味深い事実や逸話を特定します。この情報を、質の高いプレゼンテーションにふさわしい、楽しく魅力的な方法で提示するにはどうすればよいかを考えます。
<scratchpad>
入力テキストで特定した主なトピックとキーポイントについて、創造的な話し合い方を考えましょう。アナロジー、例、ストーリーテリングのテクニック、または仮想シナリオを使用して、リスナーにとってより身近で魅力的なコンテンツを作成することを検討してください。
ポッドキャストは一般のリスナーにも理解できるものでなければなりませんので、専門用語を使いすぎたり、トピックに関する予備知識を前提としたりすることは避けましょう。必要であれば、複雑な概念を簡単に説明する方法を考えてください。
入力テキストのギャップを埋めるために想像力を働かせたり、ポッドキャストで掘り下げていくための示唆に富む質問を考えてみましょう。目標は、有益で楽しい対話を創造することです。自由に創造性を発揮してください。
</scratchpad>
アイデアを出し合い、大まかなアウトラインを作成したので、今度は実際のポッドキャストの対話を書きましょう。ホストとゲストスピーカーとの間で、自然な会話の流れになるようにしてください。ブレインストーミングセッションで出た最高のアイデアを取り入れ、複雑なトピックはわかりやすく説明するようにしてください。
<podcast_dialogue>
ブレインストーミングセッションで考えた主なポイントや創造的なアイデアを基に、非常に長く、魅力的で、情報豊富なポッドキャストの対話をここに書いてください。会話調で、一般のリスナーが理解できるように、必要な背景や説明を盛り込んでください。
ホストやゲストの架空の名前を使用することは避け、リスナーにとって魅力的で没入感のある体験となるようにしてください。[ホスト] や [ゲスト] のようなカッコ付きのプレースホルダーは使用しないでください。音声で読み上げられることを想定して作成してください。
トピックに沿った魅力的な流れを維持しながら、対話をできるだけ長く、詳細にしましょう。入力テキストの主要な情報を楽しく伝えながら、可能な限り長いポッドキャストエピソードを作成できるよう、最大限の能力を発揮することを目指しましょう。
対談の終わりには、ホストとゲストスピーカーが、話し合いから得られた主な洞察と収穫を自然に要約します。これは会話から自然に流れ、カジュアルな会話形式で重要なポイントを繰り返します。当たり前の要約のように聞こえないように注意してください。目的は、話し合いを終える前に、中心となるアイデアをもう一度強調することです。
ポッドキャストは、20,000語程度にすべきです。
</podcast_dialogue>
順番に処理しながら受け渡したりしてるのかな?と思ったけど、ポン出ししてるっぽい。
で、これがテンプレートごとに異なるわけね。
とりあえず日本語化するならば、プロンプトを全部日本語化してしまうか、あとはプロンプトに「日本語で」みたいなのを追加すれば普通に使えそう。
例えば、Podcast Dialog Instructionsの最後に以下を追加すれば最初から日本語で生成できた。
The podcast conversation should be in Japanese.
まとめ
これは便利。プロンプトやGradioでの作りなんかも参考になる。
ただ、Notebook LMが日本語にも対応したら使わなくなるかもしれないし、ちょっとUIが縦伸びして使いにくい感もある。そのあたりは自分でカスタマイズすると良さそう。コードも短いしね。
自分はOllamaあたりを使えるようにしてローカルで完結させたいなと思って、とりあえずフォークした。ボチボチ修正してみるつもり。
そうね。Dockerで手軽に使いたいよね。
ちょっとコード見てたけど、なんというかリファクタリングしたほうがいいかもという感じ(Gradioで凝ったことすると結構複雑になりがちな気がする)。
自分なりに作るならば、PDF2Audioのベースになっている、こちらのほうをカスタマイズしていく方がいいかもしれない。こちらのほうがスッキリしているので。
PDF2Audioで生成したポッドキャスト風の音声を、pydubでBGMとミックスしてみた。かなりそれっぽい雰囲気になる。
pydubでBGMをミックスする場合のコードや使用した音源等については以下を参照