| name | daida-ai |
| description | 登壇プレゼン資料を自動生成するスキル(LT〜30分講演まで対応)。 テーマからアウトライン作成、PowerPoint/ODPスライド生成、 トークスクリプト(台本)の記入、音声合成、音声埋め込み、 MP4動画エクスポートまで一括対応。 使用場面: (1) 登壇テーマからプレゼンを一括作成したい, (2) 既存アウトラインからスライドを作りたい, (3) スライドにトークスクリプトを追加したい, (4) スクリプトから音声を合成してスライドに埋め込みたい, (5) プレゼンを動画としてエクスポートしたい。 トリガー: LT, ライトニングトーク, プレゼン作成, スライド作成, 代打, 登壇, presentation, slides, talk script, 音声合成, 講演, 動画, MP4, video。
|
代打AI — 登壇プレゼン自動生成スキル
概要
テーマ入力から完成プレゼンまでの一連のパイプラインを実行する。
Step 6(スライドショー設定)までで PPTX として完成 する。
さらに Step 7 で MP4動画としてもエクスポート可能 だが、追加の外部ツール(LibreOffice, ffmpeg)が必要。
動画が不要なユーザーも多いため、Step 6 完了後に動画も作るか確認し、不要なら Step 7 はスキップすること。
ヘルプ表示
ユーザーが「ヘルプ」「使い方」「流れを教えて」等と聞いた場合、以下のパイプライン図を表示する:
╔══════════════════════════════════════════════════════════════╗
║ 代打AI パイプライン ║
╠══════════════════════════════════════════════════════════════╣
║ ║
║ Step 1 テーマ → アウトライン (Markdown) ║
║ │ ║
║ Step 1.5 アウトライン → スライド仕様 (JSON) ║
║ │ ║
║ Step 1.7 画像生成 (SVG / Gemini) ─── オプション ║
║ │ ║
║ Step 2 スライド仕様 → PPTX 生成 ║
║ │ ↕ ユーザーがPPTXを確認・修正可能 ║
║ Step 3 トークスクリプト更新 ────── オプション ║
║ │ ║
║ Step 4 読み辞書 → TTSスクリプト → 音声合成 ║
║ │ ↕ ユーザーが読みを確認・修正可能 ║
║ Step 5 音声ファイル → PPTX に埋め込み ║
║ │ ║
║ Step 6 スライドショー自動再生設定 ║
║ │ ║
║ ▼ ║
║ 完成! presentation_final.pptx ║
║ │ ║
║ Step 7 MP4 動画エクスポート ────── オプション ║
║ │ (自動バリデーション付き) ║
║ ▼ ║
║ 動画! presentation.mp4 ║
║ ║
╠══════════════════════════════════════════════════════════════╣
║ テンプレート: tech / casual / formal ║
║ TTS: edge (デフォルト) / voicevox ║
║ 出力: PPTX / ODP (変換オプション) / MP4 (動画オプション) ║
╚══════════════════════════════════════════════════════════════╝
補足説明(ヘルプ表示時にパイプライン図と合わせて伝える):
- 全ステップを自動実行するか、任意のステップから再開できる
↕ マークのステップではユーザーが手動修正して戻れる
- Step 1.7(画像生成)と Step 3(スクリプト更新)はオプション
- Step 7(動画エクスポート)もオプション。追加ツール(LibreOffice, ffmpeg)が必要で、動画が不要ならスキップしてOK
前提条件
初回実行時、以下でセットアップする:
bash ${CLAUDE_SKILL_DIR}/scripts/setup.sh
setup.sh は Python 依存パッケージのインストール後、動画生成ツール(LibreOffice, ffmpeg, pdftoppm)の可用性を自動チェックする。
出力に [--] のツールがある場合、ユーザーが動画出力を希望していれば インストール手順を案内すること。
動画が不要と確認済みなら、ツール未検出の警告は無視してよい。
スクリプト実行の共通パターン
すべてのPythonスクリプトは run.sh ラッパー経由で実行する(venvの自動解決):
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh <script_name.py> [args...]
ワークフロー選択(ステップ再開対応)
ユーザーに以下を確認する:
- フル実行: テーマからすべて自動生成
- ステップ指定: 特定のステップから開始(既存ファイルを利用)
出力ディレクトリはユーザーに確認する(デフォルト: ./output/)
動画出力の確認
ワークフロー開始時に、MP4動画も必要か を確認する。
AskUserQuestion ツールが利用可能な場合は、必ずそれを使って確認すること。
PPTXの完成後、MP4動画としてもエクスポートできます(Step 7)。
動画が必要な場合は LibreOffice と ffmpeg のインストールが必要です。
動画も作りますか?(不要ならスキップします)
- 「はい」「動画も」「MP4も」 → Step 7 まで実行する。
setup.sh 実行時にツールの可用性を確認する
- 「いいえ」「不要」「PPTXだけ」 → Step 6 で完了。Step 7 への案内もスキップする
- 未回答・曖昧 → Step 6 完了時に改めて確認する(Step 6 の案内セクション参照)
ステップ再開・割り込み
ユーザーが途中のファイル(PPTX、TTSスクリプト等)を修正した後、
指定したステップからワークフローを再開できる。
ユーザーが「Step N からやり直したい」と言った場合:
- 下表の「必要な入力」が揃っているか確認する
- 不足があればユーザーに伝える
- 揃っていれば、該当ステップから最後まで順に実行する
| 再開ステップ | 必要な入力 | 典型的なユースケース |
|---|
| Step 1 | テーマ(口頭) | 最初からやり直す |
| Step 1.5 | output/outline.md | アウトラインを手動修正した |
| Step 1.7 | output/slide_spec.json | JSON仕様を手動修正した |
| Step 2 | output/slide_spec.json | JSON仕様を手動修正した |
| Step 3 | output/presentation.pptx | PPTXを手動修正した |
| Step 4 | output/presentation.pptx | スクリプトを変更した / 読みを修正したい |
| Step 5 | output/presentation.pptx + output/audio/ | 音声を差し替えた |
| Step 6 | output/presentation_with_audio.pptx | 音声埋め込み済みPPTXを修正した |
| Step 7 | output/presentation_final.pptx + output/audio/ | 動画を再生成したい |
よくある割り込みパターン:
- 「PPTXを修正したので、音声を作り直したい」 → Step 4 から再開
- 「読みを修正したので、音声だけ作り直したい」 → Step 4c から再開(
--script 付き)
- 「スライドの内容を変えたい」 → Step 1.5 から再開(JSON修正 → Step 2以降)
- 「テンプレートを変えたい」 → Step 1.5 の metadata.template を変更 → Step 2 から再開
- 「音声エンジンを変えたい」 → Step 4 から再開(
--engine 変更)
- 「動画だけ再生成したい」 → Step 7 から再開
Step 1: アウトライン生成
あなた(Claude)がやること
ユーザーから以下を聞き取る:
- テーマ: 何について話すか
- 対象者: 誰に向けたLTか
- 持ち時間: 何分か(デフォルト5分)
- イベント名: 任意
以下の構造でMarkdownアウトラインを生成する:
# プレゼンタイトル
## 導入
- ポイント1
- ポイント2
## 本題1: セクション名
- ポイント
- ポイント
## 本題2: セクション名
- ポイント
- ポイント
## まとめ
- ポイント
原則:
- LT(5分): セクション3〜4個、各2〜3項目、スライド10枚以内
- 通常発表(15分): セクション5〜7個、スライド30枚以内
- 講演(30分): セクション7〜10個、スライド60枚以内
- 1スライド30秒〜1分が目安
スクリプト実行
生成したMarkdownをファイルに保存してからスクリプトに渡す:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh generate_outline.py output/outline.md --stdin < output/outline_draft.md
Step 1.5: コンテンツ充実化
あなた(Claude)がやること
Step 1で生成したアウトラインを読み、以下の指針でスライド仕様JSONを生成する:
充実化の指針:
- 具体的な数値・データを追加(「速い」→「10倍高速」)
- 対比・比較がある場合は
two_content レイアウトを選択
- 1スライド1メッセージの原則を守る
- 箇条書きは3〜5項目に絞る(推奨。ガードレールとしては1〜8項目を許容)
- コード例がある場合は
title_only + コードブロックをnoteに記載
- 最初のスライドは必ず
title_slide
- セクション区切りには
section_header
ユーザーに確認する:
- テンプレート:
tech(デフォルト) / casual / formal
- 図表の密度:
少なめ / 普通(デフォルト) / 多め
図表密度レベル
image フィールドを持つスライドの割合を密度レベルに応じて調整する。
| 密度 | image付きスライドの割合 | 指針 |
|---|
| 少なめ | ~20% (1-2枚/10枚中) | キーとなる図のみ。テキスト・箇条書き主体 |
| 普通 | ~40% (3-4枚/10枚中) | セクションごとに1つの図解。フローチャートや比較図を適度に |
| 多め | ~60% (5-6枚/10枚中) | ほぼ毎スライドにビジュアル要素。アーキテクチャ図、チャート、イラストを積極的に |
テンプレート別デフォルト密度(Step 1.5 で決定):
| テンプレート | デフォルト密度 |
|---|
tech | 普通 |
casual | 普通 |
formal | 少なめ |
ユーザーが明示的に指定した場合はそちらを優先。未指定時はテンプレートのデフォルトを使用する。
参考: トークスタイルと推奨密度(Step 3 で選択):
| トークスタイル | 推奨密度 |
|---|
casual | 普通 |
keynote | 多め |
formal | 少なめ |
humorous | 普通 |
トークスタイルはStep 3で選択するため、Step 1.5時点ではテンプレートのデフォルトを使用する。テンプレートとトークスタイルで名前が共通するもの(casual, formal)は同じ密度に対応している。
JSON形式
{
"metadata": {
"title": "プレゼンタイトル",
"subtitle": "登壇者名",
"event": "イベント名",
"template": "tech"
},
"slides": [
{
"layout": "title_slide",
"title": "プレゼンタイトル",
"subtitle": "2026/03/10 @ イベント名 - 登壇者名",
"note": "みなさんこんにちは。本日は〇〇についてお話しします。"
},
{
"layout": "section_header",
"title": "セクション名",
"note": "それではまず、〇〇について見ていきましょう。"
},
{
"layout": "title_and_content",
"title": "スライドタイトル",
"body": ["ポイント1", "ポイント2", "ポイント3"],
"note": "トークスクリプト(台本)"
},
{
"layout": "two_content",
"title": "比較タイトル",
"left": {"heading": "左見出し", "body": ["項目1", "項目2"]},
"right": {"heading": "右見出し", "body": ["項目1", "項目2"]},
"note": "トークスクリプト"
},
{
"layout": "title_only",
"title": "図・コード用スライド",
"note": "このスライドの説明"
},
{
"layout": "title_only",
"title": "アーキテクチャ図",
"image": "images/architecture.png",
"note": "この図はシステム全体の構成を示しています"
},
{
"layout": "blank",
"image": "images/fullscreen_photo.jpg",
"note": "この写真はプロジェクトの成果を示しています"
}
]
}
利用可能なレイアウト: title_slide, section_header, title_and_content, two_content, title_only, blank
画像の挿入: image フィールドに画像ファイルパスを指定すると、スライドに画像が挿入される。
- パスはスライド仕様JSONファイルからの相対パスで指定する(例: specが
output/slide_spec.json なら images/foo.png → output/images/foo.png として解決)
- 画像はコンテンツ領域内にアスペクト比を維持して自動フィットし、水平・垂直とも中央配置される
- 画像はテキストプレースホルダの背面に配置される
- 全レイアウトで使用可能。推奨:
title_only(タイトル+図)、blank(フルスクリーン図)
- 対応フォーマット: PNG, JPEG, GIF, BMP, TIFF, SVG(自動PNG変換、要cairosvg)
重要: 全スライドの note フィールドにトークスクリプト(台本)を必ず含めること(title_slide や section_header も含む)。ノートがないスライドは音声が生成されず、スライドショーで短時間(3秒)で切り替わってしまう。Step 3で更新可能だが、ここで初版を生成しておく。
スクリプト実行
生成したJSONをファイルに保存してからスクリプトに渡す(JSONが大きい場合、echoパイプだと失敗する可能性がある):
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh enrich_outline.py output/slide_spec.json --stdin --duration 5 < output/slide_spec_draft.json
15分発表の場合:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh enrich_outline.py output/slide_spec.json --stdin --duration 15 < output/slide_spec_draft.json
--duration に応じて、スライド枚数上限と推定発話時間上限が自動的に調整される。
Step 1.7: 画像生成(オプション)
スライドに図やイラストを含めたい場合、画像を生成する。
方式の選択
以下のフローチャートに従って方式を決定する:
1. GEMINI_API_KEY は設定されているか?
├─ No → 全て SVG で生成する(後述「SVG生成」セクション)
└─ Yes → 2へ
2. 画像の内容は?
├─ SVG向き(後述リスト参照) → 「SVG生成」セクションへ
└─ Nano Banana向き(後述リスト参照) → 「Nano Banana」セクションへ
SVG向き(Claude が直接生成)
以下に該当する画像は SVG を使う。APIキー不要・即時生成・編集可能。
- フローチャート・プロセス図・ステップ図
- アーキテクチャ図・システム構成図
- 比較図(Before/After、A vs B)
- 棒グラフ・円グラフ・簡易チャート
- アイコン・ロゴ・シンボル
- タイムライン・ロードマップ
- テーブル・マトリクス図
- テキスト主体の概念図・マインドマップ
Nano Banana向き(Gemini API で生成)
以下に該当する画像は Nano Banana を使う。GEMINI_API_KEY が必要。
- 写真風の背景・風景・人物
- リアルな質感のイラスト・3Dレンダリング風
- 具体的な物体の描写(製品写真風など)
- 手書き風・水彩風・油絵風のアート
- スクリーンショット風のモックアップ
迷ったらSVG。SVGは即時生成でき、修正も容易。Nano Bananaは「SVGでは表現できないリアルさ」が必要な場合のみ使う。
ユーザーに確認する
- 画像が必要なスライドと、それぞれの内容
- Nano Banana 使用時: アスペクト比 (
16:9 / 4:3 / 1:1)、解像度 (1K / 2K / 4K)
Nano Banana(Gemini画像生成API)
前提条件: GEMINI_API_KEY 環境変数
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh generate_image.py \
--prompt "A professional conference stage with spotlight, modern tech event atmosphere" \
--output output/images/slide1_background.png \
--aspect-ratio 16:9 \
--size 1K \
--model pro
| Alias | Model ID | 用途 |
|---|
pro | gemini-3-pro-image-preview | 高品質、複雑なプロンプト、テキスト描画 |
flash | gemini-3.1-flash-image-preview | 高速生成、大量生成 |
legacy | gemini-2.5-flash-image | 旧モデル |
生成後、Read ツールで画像をユーザーに見せ、必要に応じてプロンプトを調整する。
SVG生成(API不要)
あなた(Claude)がSVGコードを直接生成する。
SVGファイルはスライド仕様JSONの image フィールドにそのまま指定できる(ビルド時に自動でPNGに変換される)。
前提条件: cairosvg がインストールされていること(setup.sh 実行済みなら自動インストール済み)。未インストールの場合:
pip install cairosvg
手順
- Write ツールで SVG ファイルを
output/images/ に作成する
- スライド仕様JSONの
image フィールドに SVG パス を直接指定する
- Step 2 の
create_slides.py 実行時に自動でPNG変換→挿入される
手動変換は不要。ただし事前にプレビューしたい場合:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh svg_to_png.py input.svg output.png
SVGサイズ
| 用途 | viewBox | 説明 |
|---|
| スライド全面 | 0 0 1920 1080 | 16:9、blank レイアウト向き |
| コンテンツ領域 | 0 0 1200 900 | 4:3、title_only レイアウト向き |
| アイコン・ロゴ | 0 0 400 400 | 1:1 |
SVGフォントサイズ要件
SVGの font-size はviewBox座標系のpx単位だが、PPTXに埋め込まれると画像として縮小されるため、
実際の表示サイズは以下の数式で決まる:
rendered_pt = f_svg × display_w_emu / (viewBox_w × 12700)
display_w_emu = min(max_w, max_h × viewBox_w / viewBox_h)
max_w = slide_w − 2 × 457200(左右マージン)
max_h = slide_h − img_top − 457200(title_only: img_top=1600200, blank: img_top=457200)
12700 = 1pt あたりの EMU(OOXML標準)
登壇資料の最低基準: 12pt。以下の最低SVG font-size を守ること:
| viewBox | レイアウト | 最低 font-size | 推奨 body | 推奨 heading |
|---|
1920×1080 | title_only | 35 px | 40 px | 56 px |
1920×1080 | blank | 28 px | 32 px | 48 px |
1200×900 | title_only | 29 px | 32 px | 48 px |
1200×900 | blank | 24 px | 28 px | 40 px |
注意: create_slides.py 実行時にSVG内のフォントサイズが自動検証される。
最低値を下回るテキストがある場合、警告が出力される。
テンプレート別カラースキーム
| テンプレート | 背景 | アクセント1 | アクセント2 | テキスト |
|---|
| tech | #1E293B | #38BDF8 | #818CF8 | #E2E8F0 |
| casual | #FFF8F0 | #FF6B35 | #06D6A0 | #2D3748 |
| formal | #FFFFFF | #1B2D45 | #C49B66 | #1B2D45 |
注意: フォントは必ず font-family="sans-serif" を指定する。cairosvg が自動的に日本語フォントのフォールバックを注入するため、日本語テキストが豆腐(□)になることはない。font-family に Hiragino / Yu Gothic / Noto Sans CJK JP などを既に含む場合は注入をスキップする。
SVGパターン集
フローチャート(3ステップ):
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080">
<rect width="1920" height="1080" fill="#1E293B"/>
<defs>
<marker id="arr" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto">
<polygon points="0 0,10 3.5,0 7" fill="#818CF8"/>
</marker>
</defs>
<rect x="160" y="420" width="400" height="160" rx="16" fill="#38BDF8"/>
<text x="360" y="510" text-anchor="middle" fill="#1E293B"
font-size="40" font-family="sans-serif" font-weight="bold">Step 1</text>
<line x1="560" y1="500" x2="720" y2="500" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
<rect x="760" y="420" width="400" height="160" rx="16" fill="#38BDF8"/>
<text x="960" y="510" text-anchor="middle" fill="#1E293B"
font-size="40" font-family="sans-serif" font-weight="bold">Step 2</text>
<line x1="1160" y1="500" x2="1320" y2="500" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
<rect x="1360" y="420" width="400" height="160" rx="16" fill="#38BDF8"/>
<text x="1560" y="510" text-anchor="middle" fill="#1E293B"
font-size="40" font-family="sans-serif" font-weight="bold">Step 3</text>
</svg>
比較図(Before / After):
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080">
<rect width="1920" height="1080" fill="#1E293B"/>
<rect x="80" y="120" width="840" height="840" rx="20" fill="#334155" stroke="#475569" stroke-width="2"/>
<text x="500" y="200" text-anchor="middle" fill="#EF4444"
font-size="56" font-family="sans-serif" font-weight="bold">Before</text>
<text x="500" y="400" text-anchor="middle" fill="#94A3B8"
font-size="40" font-family="sans-serif">手動で3時間</text>
<text x="500" y="460" text-anchor="middle" fill="#94A3B8"
font-size="40" font-family="sans-serif">ミスが多い</text>
<text x="500" y="520" text-anchor="middle" fill="#94A3B8"
font-size="40" font-family="sans-serif">属人化</text>
<rect x="1000" y="120" width="840" height="840" rx="20" fill="#334155" stroke="#38BDF8" stroke-width="2"/>
<text x="1420" y="200" text-anchor="middle" fill="#38BDF8"
font-size="56" font-family="sans-serif" font-weight="bold">After</text>
<text x="1420" y="400" text-anchor="middle" fill="#E2E8F0"
font-size="40" font-family="sans-serif">自動で5分</text>
<text x="1420" y="460" text-anchor="middle" fill="#E2E8F0"
font-size="40" font-family="sans-serif">品質が安定</text>
<text x="1420" y="520" text-anchor="middle" fill="#E2E8F0"
font-size="40" font-family="sans-serif">誰でも実行可能</text>
</svg>
アーキテクチャ図(3層):
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080">
<rect width="1920" height="1080" fill="#1E293B"/>
<defs>
<marker id="arr" markerWidth="10" markerHeight="7" refX="10" refY="3.5" orient="auto">
<polygon points="0 0,10 3.5,0 7" fill="#818CF8"/>
</marker>
</defs>
<rect x="660" y="80" width="600" height="140" rx="16" fill="#38BDF8"/>
<text x="960" y="160" text-anchor="middle" fill="#1E293B"
font-size="40" font-family="sans-serif" font-weight="bold">Frontend</text>
<line x1="960" y1="220" x2="960" y2="360" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
<rect x="660" y="380" width="600" height="140" rx="16" fill="#818CF8"/>
<text x="960" y="460" text-anchor="middle" fill="#FFFFFF"
font-size="40" font-family="sans-serif" font-weight="bold">API Server</text>
<line x1="960" y1="520" x2="960" y2="660" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
<rect x="660" y="680" width="600" height="140" rx="16" fill="#334155" stroke="#38BDF8" stroke-width="2"/>
<text x="960" y="760" text-anchor="middle" fill="#38BDF8"
font-size="40" font-family="sans-serif" font-weight="bold">Database</text>
</svg>
ワークフロー
- Step 1.5 のスライド仕様JSONで
image フィールドに出力パスを指定する
- Nano Banana:
.png パスを指定
- SVG:
.svg パスを指定(自動変換される)
- 本ステップで画像を生成
- Step 2 でスライド生成時に自動的に画像が挿入される
Step 2: スライド作成
スクリプト実行
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh create_slides.py output/slide_spec.json output/presentation.pptx
カスタムテンプレートを使う場合:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh create_slides.py output/slide_spec.json output/presentation.pptx --template path/to/template.pptx
生成後、ユーザーにPPTXの確認を依頼する。
Step 3: トークスクリプト更新(オプション)
Step 1.5でnoteが既に含まれている場合、このステップはスキップ可能。
ユーザーが文体変更やスクリプト再生成を希望する場合に実行する。
あなた(Claude)がやること
- 現在のノートを読み出す:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh write_talk_script.py output/presentation.pptx --read
-
references/talk-styles.md を参照し、ユーザーの希望する文体で全スライドのスクリプトを再生成する
- 文体:
casual(デフォルト) / keynote / formal / humorous
-
JSON配列として保存し、PPTXに書き込む:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh write_talk_script.py output/presentation.pptx --notes-json output/notes.json --output output/presentation.pptx
Step 4: 音声合成
ユーザーに確認する
- TTSエンジン:
edge(デフォルト) / voicevox
- 音声: デフォルトは
ja-JP-NanamiNeural(edge)、1=ずんだもん(voicevox)
Step 4a: TTSスクリプトのエクスポート
スピーカーノートを読み上げ用テキストファイルとしてエクスポートする。
読み辞書(--dict)を指定すると、頻出の誤読パターンが自動置換される。
読み辞書あり(推奨):
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh export_tts_script.py output/presentation.pptx output/tts_script.txt --dict ${CLAUDE_SKILL_DIR}/assets/pronunciation_dict.tsv
読み辞書なし:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh export_tts_script.py output/presentation.pptx output/tts_script.txt
Step 4b: 読み上げテキストの確認・修正
エクスポートしたスクリプトファイルの内容をユーザーに提示する。
辞書で自動修正されなかった箇所や、プロジェクト固有の用語がないか確認を促す。
辞書で自動修正される例:
- 「生成」→「せいせい」、「Claude」→「クロード」、「LLM」→「エルエルエム」
手動修正が必要な場合:
- プロジェクト固有の略語やプロダクト名
- 辞書に未登録の専門用語
ユーザーが修正不要と判断した場合はStep 4cへ進む(--scriptなしで従来通り合成)。
辞書に追加すべきエントリがあれば pronunciation_dict.tsv を更新する。
Step 4c: スクリプト実行
修正済みスクリプトファイルがある場合(--script付き):
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh synthesize_audio.py output/presentation.pptx output/audio/ --engine edge --script output/tts_script.txt
修正不要の場合(従来通りPPTXノートから直接合成):
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh synthesize_audio.py output/presentation.pptx output/audio/ --engine edge
VOICEVOX使用時(事前にVOICEVOX Engineの起動が必要):
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh synthesize_audio.py output/presentation.pptx output/audio/ --engine voicevox --script output/tts_script.txt
TTS障害時の対応
TTS APIが一部または全スライドで失敗した場合、失敗したスライドはスキップされ、成功分のみ音声ファイルが生成される(部分成功)。
- スクリプトは失敗数をstderrに報告し、正常終了する
- 音声なしスライドはStep 6でデフォルト時間(3秒)で自動送りされる
- TTS復旧後、Step 4cを再実行すれば全スライドの音声が生成される
- Step 2で生成したPPTXはそのまま利用可能(音声なしでも発表は可能)
Step 5: 音声埋め込み
スクリプト実行
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh embed_audio.py output/presentation.pptx output/audio/ output/presentation_with_audio.pptx
Step 6: スライドショー自動再生設定
音声埋め込み済みPPTXに、自動ページ送りと音声自動再生を設定する。
PowerPoint(Windows / macOS)では、スライドショーを開始するだけで最後まで完全自動で再生される。
LibreOffice Impress では自動ページ送りが動作しないため、手動でスライドを送る必要がある(詳細は「クロスプラットフォーム互換性ノート」を参照)。
- 音声付きスライド: 音声再生完了 + バッファ(デフォルト1秒)で自動ページ送り
- 音声なしスライド(表紙・中表紙等): 固定時間(デフォルト3秒)で自動ページ送り
スクリプト実行
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh make_slideshow.py output/presentation_with_audio.pptx output/presentation_final.pptx
表示時間を調整する場合:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh make_slideshow.py output/presentation_with_audio.pptx output/presentation_final.pptx --silent-duration 5000 --audio-buffer 2000
ユーザーへの案内(必須)
スライドショー設定完了後、必ず以下の注意事項をユーザーに伝えること:
スライドショー再生前の確認事項
PowerPoint(Windows / macOS)の場合:
「スライドショーの設定」で 「タイミングを使用」にチェック が入っていることを確認してください。
- Windows: 「スライドショー」タブ →「スライドショーの設定」→「タイミングを使用」にチェック
- macOS: 「スライドショー」メニュー →「スライドショーの設定...」→「オプション」→「タイミングを使用」にチェック
このチェックが外れていると、自動ページ送りと音声自動再生が動作しません。
LibreOffice Impress の場合:
自動ページ送りは動作しません。スライドショー中は手動でスライドを送ってください(クリックまたは矢印キー)。音声は各スライドで自動再生されます。
Step 7 への案内(必須)
Step 6 の案内に続けて、必ず以下を確認すること:
このプレゼンをMP4動画としてもエクスポートできます。
YouTube等への投稿や、PowerPointが使えない環境での共有に便利です。
ただし追加ツール(LibreOffice, ffmpeg)のインストールが必要です。
動画が不要であればここで完了です。動画も作りますか?
ユーザーが「不要」「いらない」等と回答した場合は Step 7 をスキップ してパイプラインを終了する。
Step 7: MP4動画エクスポート(オプション)
PPTXと音声ファイルからMP4動画を生成する。
スライドショーを動画として配布・共有したい場合に実行する。
ユーザーに確認する
Step 7 への案内でユーザーが「動画を作る」と回答した場合、以下を確認する:
- 動画のフレームレート(デフォルト: 30fps)
- 音声なしスライドの表示秒数(デフォルト: 3秒)
前提条件
動画生成には追加ツールが必要。setup.sh 実行時に可用性が表示される。
| ツール | 用途 | 必須 |
|---|
| LibreOffice | PPTX → PDF → PNG レンダリング | ✅ |
| ffmpeg | 動画クリップ生成・結合 | ✅ |
| pdftoppm (poppler-utils) | PDF → PNG 変換(高品質) | 推奨(ffmpegで代替可) |
未インストールの場合:
sudo apt install libreoffice ffmpeg poppler-utils
brew install libreoffice ffmpeg poppler
snap版LibreOfficeの注意: 出力ディレクトリは $HOME 配下を使用すること。
/tmp 等への書き込みはサンドボックス制限で失敗する場合がある。
スクリプト実行
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh make_video.py output/presentation_final.pptx output/audio output/presentation.mp4
オプション指定:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh make_video.py output/presentation_final.pptx output/audio output/presentation.mp4 --fps 30 --silent-duration 3.0
自動バリデーション
生成後、以下のチェックが自動実行される:
| チェック項目 | 内容 |
|---|
| ファイル存在 | MP4ファイルが存在し、サイズ > 0 |
| ffprobe読取 | ファイルが破損していないこと |
| コーデック | 映像: H.264 / 音声: AAC |
| 解像度 | 幅・高さが偶数(libx264互換) |
| デュレーション | 正の値であること |
バリデーション失敗時はエラー詳細が表示される。--skip-validation で無効化可能。
ユーザーへの案内
動画生成完了後、以下を伝える:
動画出力について
presentation.mp4 が生成されました
- 各スライドの表示時間は音声ファイルの実尺に基づいています
- 音声なしスライドはデフォルト3秒表示です
- 一般的な動画プレイヤー(VLC、QuickTime等)で再生できます
フォーマット変換(オプション)
ODP形式が必要な場合:
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh convert_format.py output/presentation.pptx --outdir output/
前提: LibreOfficeがインストールされていること。
クロスプラットフォーム互換性ノート
macOS PowerPoint との互換性
代打AIが生成するPPTXは macOS / Windows の両PowerPoint および LibreOffice Impress で動作する。
以下の技術的制約に注意すること。
音声自動再生(Step 6)
| 方式 | macOS | Windows | LibreOffice |
|---|
p:cmd type="call" cmd="playFrom(0)" | ✅ | ✅ | ✅ |
p:audio > p:cMediaNode | ❌ 破損扱い | ✅ | ✅ |
- macOS PowerPoint は
p:audio > p:cMediaNode(OOXML メディアノード方式)を破損ファイルとして扱う
- 代わりに
p:cmd type="call" cmd="playFrom(0)" (コマンドアニメーション方式)を使用する
nodeType="afterEffect" + grpId="0" で「前のアニメーション後に自動実行」を指定する
- この方式は Windows PowerPoint / LibreOffice Impress でも正常に動作する
音声アイコン(Step 5)
| アイコン | macOS | Windows |
|---|
| 32×32 可視アイコン | ✅ 表示される | ✅ 表示される |
| 1×1 透明PNG | ❌ 非表示 | ✅ 自動でスピーカーアイコン表示 |
- macOS PowerPoint は透明アイコンをそのまま透明に表示する(Windows は自動でスピーカーアイコンに置換する)
- そのため、音声埋め込み時に32×32 の可視スピーカーアイコンを使用する
- アイコンはスライド寸法に基づいて右下隅に動的配置される(右端・下端からマージン0.25")
- 4:3 / 16:9 いずれのアスペクト比でも正しく右下に配置される
自動ページ送り
| 方式 | macOS | Windows | LibreOffice |
|---|
p:transition advTm | ✅ | ✅ | ❌ 非対応 |
- LibreOffice Impress では自動ページ送りが動作しない。PPTX内のタイミング設定(
advTm、mainSeq.dur)を正しく設定してもLibreOffice側で無視される既知の制限がある(Bug 101527)
- LibreOffice で再生する場合は手動でスライドを送るか、LibreOffice上で「スライド切り替え」パネルから各スライドの「自動切り替え」時間を手動設定する必要がある
- PowerPoint(Windows / macOS)では自動ページ送りが正常に動作する
リファレンス
references/pptx-guide.md: レイアウト・プレースホルダーの詳細
references/talk-styles.md: トークスクリプトの文体定義
references/tts-plugins.md: TTSプラグインの追加方法