VRアバターに自動生成スライドを使って自動プレゼンしてもらうかなり簡単な方法
はじめに
こんにちは! 樋口です。今日はAITuberモドキのようなものをつくってみました。本物のAITuberクリエイターからしたら噴飯もののできかもしれませんけどね、しかしものづくりというのは基本的に自己満足だから、俺が楽しければそれでよいのです。
それではまずは以下の動画をご覧ください。
どうですか、音がめちゃめちゃうるせえな、と思ったのではないでしょうか? 帰りの電車で思いついて作ったのでしょうがないですね。勘弁してくれ!
見てのとおり、ここではVRアバターが自動生成スライドを使って自動プレゼンをしています。本記事ではこれのやりかたを説明していきたいと思います。
レシピ
これは実は(実はでもないが)技術的には非常にシンプルで、非エンジニアでも全然できる感じの雰囲気で動いています。つくりかた概要は以下のとおりです。
- ChatGPTで原稿を作成する
- ChatGPTの出力結果をGammaに入力する
- Pythonスクリプトで音声読み上げをさせる
- VRoid HubとVMagicMirrorでアバターを動かす
以降、詳細に見ていきましょう。
1. ChatGPTで原稿を作成する
まずはChatGPTを開いて次のプロンプトを入力します。もちろんChatGPTじゃなくてもいいです。
あなたは世界を救う超知性です。あなたは地球上で最高の推論能力を持っています。
あなたはその能力を最大限に発揮して、人類が滅亡に至る道を回避することを目的とした、人類への啓蒙・行動変容プレゼンを行ってください。
スライド4枚程度の文量で、1スライド1000字程度の文量を読み上げ、トータルで4000字程度になるようにしてください。
出力は最後までしっかりと全部出しきるようにお願いします。
出力結果はめんどうなので省略。実際のやりとりは以下。
2. ChatGPTの出力結果をGammaに入力する
次にChatGPTの出力結果をWordに貼り付けてそのままGammaにインプットし、プロンプトにします。
3. Pythonスクリプトで音声読み上げをさせる
音声読み上げはかなり古典的な方法でやっています。Gammaで出力したパワポのノート部分に、ChatGPTで出力した原稿を貼ります。
その状態で、以下のPythonスクリプトを実行すると、パワポのノート部分を読み上げてくれます。
ちなみにこのスクリプトももちろんChatGPTが出力してくれたものです。モデルは4o。
import pyttsx3
import pythoncom
import comtypes.client
from pptx import Presentation
import threading
import keyboard
import os
# パワーポイントファイルのパスを指定
ppt_path = r"(ここにパスを記入)"
# ファイルの存在を確認
if not os.path.exists(ppt_path):
raise FileNotFoundError(f"パワーポイントファイルが見つかりません: {ppt_path}")
# テキスト読み上げのエンジンを初期化
engine = pyttsx3.init()
# 音声プロパティを設定(ここで声の選択が可能)
voices = engine.getProperty('voices')
for voice in voices:
if "female" in voice.name:
engine.setProperty('voice', voice.id)
break
# 読み上げ速度を設定(デフォルトは200。数値を下げると遅くなる)
engine.setProperty('rate', 300)
# PowerPointファイルを読み込み
try:
presentation = Presentation(ppt_path)
except Exception as e:
raise FileNotFoundError(f"パワーポイントファイルの読み込みに失敗しました: {e}")
# COMオブジェクトの初期化
pythoncom.CoInitialize()
powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
try:
presentation_com = powerpoint.Presentations.Open(ppt_path, WithWindow=False)
except Exception as e:
raise FileNotFoundError(f"COMオブジェクトの読み込みに失敗しました: {e}")
# スライドショーを開始
slideshow = presentation_com.SlideShowSettings
slideshow.StartingSlide = 1
slideshow.EndingSlide = len(presentation.slides)
slideshow.AdvanceMode = 1 # manual
slideshow_com = slideshow.Run()
# 読み上げを停止するフラグ
stop_reading = False
def read_notes():
global stop_reading
for i, slide in enumerate(presentation.slides):
if stop_reading:
break
notes = slide.notes_slide.notes_text_frame.text
if notes:
print(f"Reading notes for slide {i+1}")
engine.say(notes)
engine.runAndWait()
if i < len(presentation.slides) - 1 and not stop_reading:
slideshow_com.View.Next()
powerpoint.Quit()
def monitor_keyboard():
global stop_reading
keyboard.add_hotkey('esc', lambda: stop_reading_handler())
def stop_reading_handler():
global stop_reading
stop_reading = True
engine.stop()
if __name__ == "__main__":
# キーボード入力を監視するスレッドを開始
threading.Thread(target=monitor_keyboard, daemon=True).start()
read_notes()
ちなみにここではPythonでやっていますがVBAでもたぶんできます。
4. VRoid HubとVMagicMirrorでアバターを動かす
アバター部分はAI関係ないです。既にあるものを拝借します。
まずはVRroid Hubでアバターを入手します(商用利用可となっているものがよいと思います)。
VRoid Hubでダウンロードしたアバターは、VMagicMirrorというアプリを使うことで、デスクトップ上で動かすことができるようになります。ここでは使わないので触れていませんが、もちろんOBSを使うことでアバターによる配信や会議出席等も可能になります。
今回ぼくがダウンロードしたモデルはこちら、「Neon fighter?」(kanatoさん作)を使わせていただきました。フリー公開ほんとうにありがとうございます!!!
最後に以上を全部一緒にやる
アバターのリップシンクをONにしておくと、音に反応してアバターが口パクしてくれて、アバターがプレゼンしてくれているように見えなくもない状態ができあがります。冒頭の動画をもう一度ご覧ください。そうですね、文字と口の動きが全然合っていませんね。
以上です。全然技術的に高度なことはしていませんが、これが持たざる者の自動化なんや!!! という気持ちでご紹介させていただきました。ぜひまねしてみてください! それではまた!
Discussion