火曜日, 7月 1, 2025
火曜日, 7月 1, 2025
- Advertisment -
ホームニューステックニュースプレゼン動画自動生成ツール Mulmocast を使う

プレゼン動画自動生成ツール Mulmocast を使う



こんにちは、オートロ株式会社で代表しております福田です。

今回は、mulmocastを使って、プレゼンテーション動画を自動生成する方法を解説した後、オリジナルのテンプレートを作成してみます。

MulmoCastは、AIと人間が協力してアイデアを生み出し、共有するために設計された次世代のプレゼンテーションプラットフォームです。

PowerPointやKeynoteのような従来のツールは人間向けに作られたものでしたが、MulmoCastは最初からAIとの共創を前提に設計された「AIネイティブ」なツールです。AIが自然言語、画像、音声、動画を扱える能力を最大限に発揮できる環境を提供します。

作成されたプレゼンテーション

説明するより見た方が早いので、出来上がったプレゼンテーションを見てみましょう。

https://youtu.be/969fhv6mH1k

これがたった数回のコマンドで作れてしまいます。ただ、正直英語かぁってなりますよね。mulmocastには複数のテンプレートがあって、日本語を出力する(sensei_and_taro)というテンプレートがあります。ただ、mulmocast も頻繁にアップデートされており、ちょっと修正が必要でした。

今回は、mulmocast を使ってオリジナルテンプレートで動画を生成する方法を解説いたします。

出来上がった動画は、こちらです。(アウトロって言われてますが、オートロですw)

https://youtu.be/kmBH17J5dVg

他の動画サンプルもこちらになります。

https://youtu.be/bmE4zBKurXI

オリジナルテンプレートの作成手順は大枠次のようになっています。

  1. レポジトリをクローンし、依存パッケージをインストール
  2. 環境変数を .env に設定
  3. assets/templates 内に新しいテンプレートを作成
  4. scripts/templates に新しいテンプレート用の台本のサンプルを作成

1. レポジトリをクローン

mulmocast は、npm でインストールできるコマンドラインインターフェースを提供しています。すぐに試すには、そちらの方法の方が簡単ですが、今回は、テンプレートを変更したりしたいのでレポジトリをクローンしましょう。

$ gh repo clone receptron/mulmocast-cli

これでクローンは完了です。

そうしたら、依存パッケージをインストールしましょう。公式では、 yarn が使われていましたが、僕は、 pnpm でやりました。あと、 openai パッケージがないというエラーが出るので追加でインストールします。

$ pnpm install
$ pnpm add openai

これで下準備は完了です。

使い方

まず、スクリプトを生成します

$ pnpm run scripting -u {元ネタのURL}  -t {テンプレートファイルの名前、/assets/templatesに入っています}

これでスクリプトファイルが出来上がります。このファイルを元にビデオを作ります。

動画の生成

$ pnpm run movie {スクリプトファイルのパス}

これで試してみてください。ただし、次に説明する環境変数の設定が必要です。

環境変数を設定する

今回使ったのは、次の環境変数です。

OPENAI_API_KEY=
DEFAULT_OPENAI_IMAGE_MODEL=gpt-image-1
BROWSERLESS_API_TOKEN=
GOOGLE_PROJECT_ID=
NIJIVOICE_API_KEY=

DEFAULT_OPENAI_IMAGE_MODEL は、ジブリ風やアキラ風など GPT の画像生成機能を使う際に必要になります。なお、この機能は、組織の検証が必要になる場合があるので若干ハードルがあります。

assets/templates 内に新しいテンプレートを作成

mulmocast は、MulmoScript というJSON形式の台本(というかシナリオ)のようなものを追加することでテンプレートを作成できます。公式のドキュメントにも詳しい説明があります。Gemini Code Assist や Github Copilot を使えば、最新のコードを参照しながらどんな値を入れられるかが確認できるのですごく便利です。

僕は、sensei_and_jiro をベースにして、にじボイスの声を変えただけ(プリセットされているボイスIDはすでに無い)なので、sensei_and_taro をコピーして、 ema_and_watson というテンプレートを作成しました。

sensei_and_taroは、次のようになっています。

{
  "title": "Student and Teacher",
  "description": "Interactive discussion between a student and teacher",
  "systemPrompt": "この件について、内容全てを高校生にも分かるように、太郎くん(Student)と先生(Teacher)の会話、という形の台本をArtifactとして作って。ただし要点はしっかりと押さえて。以下に別のトピックに関するサンプルを貼り付けます。このJSONフォーマットに従って。",
  "presentationStyle": {
    "$mulmocast": {
      "version": "1.0",
      "credit": "closing"
    },
    "canvasSize": {
      "width": 1536,
      "height": 1024
    },
    "imageParams": {
      "style": ""
    },
    "speechParams": {
      "provider": "nijivoice",
      "speakers": {
        "Announcer": { "displayName": { "ja": "アナウンサー" }, "voiceId": "afd7df65-0fdc-4d31-ae8b-a29f0f5eed62" },
        "Student": { "displayName": { "ja": "太郎" }, "voiceId": "a7619e48-bf6a-4f9f-843f-40485651257f" },
        "Teacher": { "displayName": { "ja": "先生" }, "voiceId": "bc06c63f-fef6-43b6-92f7-67f919bd5dae" }
      }
    }
  },
  "scriptName": "sensei_and_taro.json"
}

imageParams がキャラクターの見た目の設定。 speechParams が、声の設定になっています。scriptName は、台本で、scripts/templates に入っています。台本を変更する時は、このファイルを作成すれば良いのです。

これをエマちゃんとワトソン先生に書き換えて、voiceIdをにじボイスのものに書き換えて生成してものが先ほどの動画です。

imageParams は、かなり強力で参考になる画像ファイルを指定してもいいし、プロンプトで指定してもいいです。

scripts/templates に新しいテンプレート用の台本のサンプルを作成

さらにカスタマイズするには、scripts/templates に参照するスクリプトを追加するとできます。

sensei_and_taro のスクリプトテンプレートは、次のようになっています。

{
  "$mulmocast": {
    "version": "1.0",
    "credit": "closing"
  },
  "title": "韓国の戒厳令とその日本への影響",
  "description": "韓国で最近発令された戒厳令とその可能性のある影響について、また日本の憲法に関する考慮事項との類似点を含めた洞察に満ちた議論。",
  "lang": "ja",
  "beats": [
    {
      "speaker": "Announcer",
      "text": "今日は、韓国で起きた戒厳令について、太郎くんが先生に聞きます。",
      "imagePrompt": "A classroom setting with a curious Japanese student (Taro) and a kind teacher. Calm atmosphere, early morning light coming through the window."
    },
    {
      "speaker": "Student",
      "text": "先生、今日は韓国で起きた戒厳令のことを教えてもらえますか?",
      "imagePrompt": "The student (Taro) sitting at his desk with a serious expression, raising his hand to ask a question. Teacher is slightly surprised but attentive."
    },
    {
      "speaker": "Teacher",
      "text": "もちろんだよ、太郎くん。韓国で最近、大統領が「戒厳令」っていうのを突然宣言したんだ。",
      "imagePrompt": "TV screen showing a breaking news headline in Korean: 'President Declares Martial Law'. Students watching with concern."
    },
    {
      "speaker": "Student",
      "text": "戒厳令ってなんですか?",
      "imagePrompt": "A close-up of the student's puzzled face, with a speech bubble saying '戒厳令って?'"
    },
    {
      "speaker": "Teacher",
      "text": "簡単に言うと、国がすごく危ない状態にあるとき、軍隊を使って人々の自由を制限するためのものなんだ。",
      "imagePrompt": "Illustration of soldiers standing in the street, people being stopped and questioned, with a red 'X' on a protest sign. Moody and serious tone."
    },
    {
      "speaker": "Student",
      "text": "それって怖いですね。なんでそんなことをしたんですか?",
      "imagePrompt": "Student looking anxious, thinking deeply. Background shows a shadowy image of a politician giving orders to the military."
    },
    {
      "speaker": "Teacher",
      "text": "大統領は「国会がうまく機能していないから」と言っていたけど…",
      "imagePrompt": "A tense scene of military personnel entering a national assembly building in Korea, lawmakers looking shocked and resisting."
    },
    {
      "speaker": "Student",
      "text": "ええっ!?国会議員を捕まえようとするなんて、すごく危ないことじゃないですか。",
      "imagePrompt": "The student reacts with shock, comic-style expression with wide eyes and open mouth. Background fades into a dramatic courtroom or parliament chaos."
    },
    {
      "speaker": "Teacher",
      "text": "その通りだよ。もし軍隊が国会を占拠していたら…",
      "imagePrompt": "Dark visual of a locked parliament building with soldiers blocking the entrance, ominous sky in the background."
    },
    {
      "speaker": "Student",
      "text": "韓国ではどうなったんですか?",
      "imagePrompt": "Student leans forward, curious and worried. Background shows a hopeful scene of people holding protest signs with candles at night."
    },
    {
      "speaker": "Teacher",
      "text": "幸い、野党の議員や市民たちが急いで集まって抗議して…",
      "imagePrompt": "Peaceful protest scene in Seoul, citizens holding candles and banners, united. Hopeful tone."
    },
    {
      "speaker": "Student",
      "text": "それは大変なことですね…。日本ではそんなこと起きないんですか?",
      "imagePrompt": "Student looking toward the Japanese flag outside the school window, pensive mood."
    },
    {
      "speaker": "Teacher",
      "text": "実はね、今、日本でも似たような話があるんだよ。",
      "imagePrompt": "Teacher pointing to a newspaper headline: '緊急事態条項の議論進む'. Classroom chalkboard shows a map of Korea and Japan."
    },
    {
      "speaker": "Student",
      "text": "緊急事態宣言って、韓国の戒厳令と同じようなものなんですか?",
      "imagePrompt": "Split screen image: left side shows a soldier in Korea, right side shows a suited Japanese politician giving a press conference."
    },
    {
      "speaker": "Teacher",
      "text": "似ている部分があるね。たとえば、総理大臣が…",
      "imagePrompt": "Diagram-style visual showing the flow of emergency powers from PM to local governments. Simple, clean infographic style."
    },
    {
      "speaker": "Student",
      "text": "それって便利そうですけど、なんだか心配です。",
      "imagePrompt": "Student's concerned expression, behind him a blurry image of a street with emergency sirens glowing in red."
    },
    {
      "speaker": "Teacher",
      "text": "そうだね。もちろん、緊急時には素早い対応が必要だけど…",
      "imagePrompt": "Illustration of a balance scale: one side is 'freedom', the other 'security'. The scale is slightly tilting."
    },
    {
      "speaker": "Student",
      "text": "韓国みたいに、軍隊が政治に口を出してくることもあり得るんですか?",
      "imagePrompt": "Student imagining a military tank next to the Japanese parliament, shown as a thought bubble."
    },
    {
      "speaker": "Teacher",
      "text": "完全にあり得ないとは言えないからこそ、注意が必要なんだ。",
      "imagePrompt": "Japanese citizens reading newspapers and watching news with concerned faces, civic awareness growing."
    },
    {
      "speaker": "Student",
      "text": "ありがとうございます。とても良い勉強になりました。",
      "imagePrompt": "The student bows slightly to the teacher with a grateful expression. The classroom is peaceful again."
    },
    {
      "speaker": "Announcer",
      "text": "ご視聴、ありがとうございました。次回の放送もお楽しみに。",
      "imagePrompt": "Ending screen with soft background music, showing the show's logo and a thank-you message in Japanese."
    }
  ]
}

もし画像を繋げるのではなく、動画として動かしたい場合は、movieParams.provider と各 beatsmoviePrompt を追加すれば動画を生成できます。

例えば、

"movieParams": {
    "provider": "google"
  },
  "beats": [
    {
      "speaker": "Announcer",
      "text": "今日は、韓国で起きた戒厳令について、まりもちゃんが先生に聞きます。",
      "imagePrompt": "A classroom setting with a curious Japanese student (Marimo) and a kind teacher. Calm atmosphere, early morning light coming through the window.",
      "moviePrompt": "[MOVIE_PROMPT: A movie prompt for that image.]"
    },
...

のようにすれば、google で動画を生成します。(APIの利用がONになっている必要あり)

ただ、Googleのガードレイルがきつくてアニメ系の動画ではほとんどうまくいきませんでした。どのポリシーに違反しているかが明確にわからないので今回は諦めましたが、リアル画像系の場合うまく行ったのでアニメ系ではなくリアル系であれば完全動画化が可能なのではと思います。

リアル系のものから動画にできた例です。課題感ありますが、ここまでできるかという感じですね。レンポジ動画が簡単に作れるイメージです。(Tungsten Total Agility の説明動画、英語です)

https://youtu.be/H22BjC8UvoE

mulmocast すごいですね。こんなに簡単にプレゼンが作れるので、いろんなパターンで作ったり、同じパターンで作らせても良いと思います。このプレゼンテーションの内容を逆に製品開発にも使えるんじゃないかって思いました。

最後に、らんま1/2風に作った Total Agility のプレゼン動画を貼り付けます。背景等が貧弱になっている気がします。途中で、先生が生徒の肩に手を回しているのはコンプラ違反な気がしますが、全体的によく仕上がっています。

https://youtu.be/e2gCjwVmBFs



Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -