AWSLab

Presentonで自社フォーマットのスライドテンプレートを作る

スポンサーラベル
既存のPPTXがテンプレートになるまで。PPTXを渡すと1枚が1レイアウトに変換され、タイトル・箇条書き・表・画像の入る場所を定義したスキーマが付き、以後の生成で使える。スライドは画像とHTMLとしてモデルに渡されるためビジョン対応モデルが必須 AWS

当サイトはアフィリエイト広告を利用しています。

PresentonをAWSに構築するで作った検証環境で、しばらくスライドを生成してみました。内容の出来は悪くないのですが、出てくる体裁が社内の書式と違うという当然の問題にぶつかります。

Presenton には内蔵テンプレートが入っていて選ぶことはできますが、実務では「部の既定フォーマットで出してほしい」という要求のほうが多いはずです。

Presenton にはこれに応えるカスタムテンプレート機能があります。本記事では、4枚のサンプルPPTXを実際に取り込ませて、何がどこまで写し取られるのかを確かめました。所要時間は49秒、配色はほぼ正確、ただしフォントには落とし穴があります。

1. カスタムテンプレートで何ができるか

既存のPowerPointファイルを渡すと、次の流れで処理されます。

既存のPPTXがテンプレートになるまで。PPTXを渡すと1枚が1レイアウトに変換され、タイトル・箇条書き・表・画像の入る場所を定義したスキーマが付き、以後の生成で使える。スライドは画像とHTMLとしてモデルに渡されるためビジョン対応モデルが必須

要点はスライド1枚が1レイアウトに1対1で変換されるところです。一度作ってしまえば、レイアウトを1か所直すだけで以後生成するデッキすべてに反映されます。

公式サイトには重要な注意書きがあります。

Presenton sends each slide as a screenshot and HTML reference. Use a vision-enabled model for accurate layouts.

スライドは画像としてモデルに渡されます。 レイアウトの読み取りは画像認識に依存しているため、テキストしか扱えないモデルでは精度が出ません。 ローカルLLMで軽量なテキストモデルを選んでいると、通常の生成はできてもテンプレート作成だけ失敗する、という状態になります。

2. テンプレートの実体

仕組みを理解するために、検証環境のデータベースを直接見ました。

テンプレート1件の中身。template_v2テーブルの1行に、16色を定義したthemeと12個のlayouts、そしてassetsが入る。キャンバスは1280×720。レイアウトの実体はファイルではなくデータベースにある

テンプレート1件は template_v2 テーブルの1行として保存されています。

中身
theme配色16色と書体の定義
layoutsレイアウトの配列。組み込みの General では12個
assets画像・アイコン・書体への参照

配色は16色で、うち10色(graph_0graph_9)はグラフ用に確保されています。レイアウトは iddescription、座標を持つ components の3点で構成され、キャンバスは1280×720でした。

画像や書体のファイルだけは app_data/templates/ 配下にあります。検証環境ではSVG 137個・PNG 61個・TTF 15個で合計25MBでした。

3. 実際に取り込んでみる

検証用に、機密情報を含まない4枚のPPTXを新しく作りました。表紙・目次・箇条書き+図版枠・3列の表という、社内フォーマットにありがちな構成です。ネイビー(#1F3A5F)を基調に、アクセントの赤(#C8102E)と罫線のグレー(#D8DDE3)を使っています。

3.1 使うエンドポイントに注意

ここでつまずきました。 ソースコードには pptx_slides/process という取り込み用エンドポイントが存在するのですが、実際に動いているアプリにはマウントされていません。 呼ぶと404が返ります。

稼働中のルートを列挙して確認したところ、本当の入口はこちらでした。

POST /api/v1/ppt/template/fonts-upload-and-slides-preview   ← PPTXを渡す
POST /api/v1/ppt/template/async                             ← レイアウト生成を開始
GET  /api/v1/async-tasks/status/{id}                        ← 進捗を見る(/ppt は付かない)

進捗確認のパスが async-tasksハイフン区切りなのも注意点です。テーブル名は async_tasks とアンダースコアなので、間違えると404になります。

3.2 スライドを画像化する

まずPPTXを渡します。

# PPTXを渡して、各スライドのスクリーンショットを作らせる
curl -X POST http://203.0.113.10/api/v1/ppt/template/fonts-upload-and-slides-preview \
  -H "Authorization: Bearer sk-presenton-XXXX" \
  -F "pptx_file=@sample.pptx"

4枚のPPTXが3.3秒で処理され、こう返りました。

{
  "slide_image_urls": [
    "/app_data/uploads/template-previews/2b36928d-.../slide_1.png",
    "/app_data/uploads/template-previews/2b36928d-.../slide_2.png"
  ],
  "pptx_url": "/app_data/uploads/template-previews/2b36928d-.../presentation.pptx",
  "modified_pptx_url": "...",
  "fonts": {}
}

サーバー側ではPPTXを展開してスライドのXMLを取り出し、Chromiumで各スライドを描画してスクリーンショットを撮っています。この画像がモデルに渡るわけです。

3.3 レイアウトを生成する

返ってきた pptx_urlslide_image_urls をそのまま次に渡します。

# レイアウト生成をバックグラウンドで開始する
curl -X POST http://203.0.113.10/api/v1/ppt/template/async \
  -H "Authorization: Bearer sk-presenton-XXXX" \
  -H "Content-Type: application/json" \
  -d '{"pptx_url": "...", "slide_image_urls": ["..."], "fonts": {}}'

タスクIDが返るので、進捗を追います。4枚のレイアウト生成は49.6秒で完了しました。

[  0.0s] pending    作成済み=0 残り=4
         …
最終ステータス: completed / error = None
  各スライド: ['completed', 'completed', 'completed', 'completed']

4. 何が抽出されたか

生成されたテンプレートをデータベースで確認しました。結果は想像より良好です。

4.1 配色はほぼ正確

サンプルで指定した色が、そのまま theme に入っていました。

抽出された値元のサンプル
primary = #1F3A5F見出しとバナーのネイビー
graph_1 = #C8102Eアクセントの赤
card = #F2F4F7図版枠の背景
stroke = #D8DDE3表の罫線

指定した5色が過不足なく拾われています。 ブランドカラーが決まっている組織なら、この時点でかなり実用に足ります。

4.2 レイアウト名が内容を表している

4枚それぞれに、中身を説明する名前が付きました。

title_slide_with_top_banner_and_left_aligned_heading_subtitle_7918
title_with_numbered_item_rows_8205
title_with_left_bullet_list_and_right_image_panel_4410
title_with_three_column_table_6448

「上部バナー付きの表紙」「番号付きの行」「左に箇条書き・右に画像枠」「3列の表」と、私が作った4枚の構成を正しく言い当てています。 画像認識が効いている証拠です。

4.3 フォントは渡さないと解決されない

ここが注意点です。フォントを渡さずに取り込むと、書体はこうなりました。

{"textFont": {"name": "Meiryo", "url": ""}}

名前は拾えていますが url が空です。 この状態では書体が再現されません。

そこで、同じPPTXをフォント付きで取り込み直して比べました。結果は明確です。

フォントなしフォントあり
書体{"name": "Meiryo", "url": ""}{"name": "Noto Sans JP", "url": "/app_data/fonts/…ttf"}
画像化3.3秒17.6秒
レイアウト生成49.6秒64.7秒
配色同一同一
レイアウト認識4件とも正解4件とも正解

差が出るのは書体の解決だけで、配色とレイアウト認識は変わりませんでした。 時間が伸びているのは、サーバーが渡されたフォントをChromiumに導入してからスクリーンショットを撮っているためです。

4.4 日本語フォントで2回つまずく

フォントを渡すのは簡単ではありませんでした。2つ引っかかります。

1つ目。font_files だけでは通りません。

{"detail": "Both font_files and original_font_names must be provided together"}

どのフォントの置き換えなのかを original_font_names で指定する必要があります。フォームパラメータとして Meiryo のように渡します。

2つ目。.ttc は受け付けられません。

{"detail": "Failed to extract font info for 'meiryo_....ttc':
            specify a font number between 0 and 3 (inclusive)"}

Windows の日本語フォントは .ttc(フォントコレクション)形式が多く、メイリオも游ゴシックもBIZ UDゴシックもすべて .ttc です。 そのままでは渡せません。

回避策は .ttf を使うことです。手元の環境では NotoSansJP-VF.ttf が使えました。社内書体が .ttc の場合は、コレクションから単体の .ttf を取り出す一手間が要ります。

5. 作ったテンプレートで生成してみる

テンプレートができたので、実際にそれを指定してスライドを作りました。

curl -X POST http://203.0.113.10/api/v1/ppt/presentation/generate \
  -H "Authorization: Bearer sk-presenton-XXXX" \
  -H "Content-Type: application/json" \
  -d '{"content": "社内の資料作成を効率化する取り組みについて",
       "n_slides": 3, "template": "<作ったテンプレートのID>",
       "language": "Japanese", "export_as": "pptx"}'

33.3秒で3枚が生成されました。 データベースを見ると、使われたレイアウトはすべて自作テンプレートのものでした。

layout_group: ad6b052e-…(作ったテンプレートのID)
  スライド0: title_slide_with_top_banner_heading_and_subtitle_…
  スライド1: title_with_left_bullet_list_and_right_image_panel_…
  スライド2: title_with_three_column_table_…
fonts: {"Noto Sans JP": "/app_data/fonts/….ttf"}

4つあるレイアウトから、内容に合う3つが選ばれています。 目次のレイアウトは3枚構成では使われませんでした。フォントの指定もテンプレートから引き継がれています。

自社フォーマットを取り込んで、それで生成するという一連の流れが通ることを確認できました。

6. つまずきどころ

6.1 APIキーで呼べないエンドポイントがある

PPTXの使用フォントを事前に調べる fonts/check を叩いたところ、こう返りました。

{"detail": "Admin browser session required"}

HTTPステータスは403です。APIキーは発行したユーザーとして動くため、管理者のブラウザセッションが要るエンドポイントは呼べません。 幸いテンプレート作成の本線(fonts-upload-and-slides-previewasync)はAPIキーで通りました。自動化する場合は、どれが通ってどれが通らないかを先に確かめておく必要があります。

6.2 Smartモードにするとテンプレート機能ごと消える

生成方式は PRESENTATION_GENERATION_MODE で切り替えます。

挙動
both(既定)方式を選べる。テンプレート機能も使える
standard固定レイアウト方式。テンプレート機能は使える
smart内容に応じて可変。テンプレート機能が画面から消える

自社フォーマットで統一したいなら standardboth にしておきます。

6.3 途中で止めると空のテンプレートが残る

template/init だけを呼んで先に進まないと、レイアウトが空のテンプレートがそのまま残りました。 削除は DELETE /api/v1/ppt/template/{id} でできます(204が返ります)。試行錯誤するとゴミが溜まるので、後片付けを忘れないようにしてください。

6.4 組み込みテンプレートは公表より多い

READMEには6種と書かれていますが、検証環境には8種入っていました。Editorial と Swift はREADMEに記載がありません。 自作する前に、まず8種を見てから決めたほうが早いかもしれません。

7. まとめ

  • 4枚のPPTXが49.6秒でテンプレートになった。 画像化に3.3秒、レイアウト生成に49.6秒
  • 配色は正確に抽出される。 指定した5色がそのまま theme に入った
  • レイアウト名が中身を的確に表す。 画像認識が効いており、ビジョン対応モデルが必須なのはこのため
  • フォントは渡さないと解決されない。 渡すと url が入る。ただし original_font_names とセットで指定する必要があり、Windows に多い .ttc は受け付けられない
  • 作ったテンプレートで実際に生成できた。 3枚を33.3秒。使われたレイアウトはすべて自作テンプレートのものだった
  • pptx_slides/process は動いていない。 実際の入口は template/fonts-upload-and-slides-preview。進捗確認は async-tasks(ハイフン区切り)
  • APIキーで呼べないエンドポイントがある。 fonts/check は管理者セッションが必要

自社フォーマットを持っている組織ほど、この機能の有無で使えるかどうかが変わります。手元の既定フォーマットを1本渡してみるところから始めるのが確実です。書体まで再現したいなら、フォントファイルも一緒に渡すことを忘れないでください。

コメント

タイトルとURLをコピーしました