---
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
bash ${CLAUDE_SKILL_DIR}/scripts/setup.sh
```

`setup.sh` は Python 依存パッケージのインストール後、動画生成ツール（LibreOffice, ffmpeg, pdftoppm）の可用性を自動チェックする。
出力に `[--]` のツールがある場合、**ユーザーが動画出力を希望していれば** インストール手順を案内すること。
動画が不要と確認済みなら、ツール未検出の警告は無視してよい。

## スクリプト実行の共通パターン

すべてのPythonスクリプトは `run.sh` ラッパー経由で実行する（venvの自動解決）:

```bash
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh <script_name.py> [args...]
```

## ワークフロー選択（ステップ再開対応）

ユーザーに以下を確認する:
1. **フル実行**: テーマからすべて自動生成
2. **ステップ指定**: 特定のステップから開始（既存ファイルを利用）

出力ディレクトリはユーザーに確認する（デフォルト: `./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 からやり直したい」と言った場合:**

1. 下表の「必要な入力」が揃っているか確認する
2. 不足があればユーザーに伝える
3. 揃っていれば、該当ステップから最後まで順に実行する

| 再開ステップ | 必要な入力 | 典型的なユースケース |
|---|---|---|
| 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アウトラインを生成する:

```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
# まずアウトラインMarkdownをファイルに保存（Writeツール使用）
# 次にスクリプトで所定のパスに保存
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形式

```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
# まずスライド仕様JSONをファイルに保存（Writeツール使用）
# 次にスクリプトでバリデーション＆保存（--durationで持ち時間を指定）
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh enrich_outline.py output/slide_spec.json --stdin --duration 5 < output/slide_spec_draft.json
```

15分発表の場合:
```bash
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
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` 実行済みなら自動インストール済み）。未インストールの場合:
```bash
pip install cairosvg
```

#### 手順

1. **Write ツール**で SVG ファイルを `output/images/` に作成する
2. スライド仕様JSONの `image` フィールドに **SVG パス** を直接指定する
3. Step 2 の `create_slides.py` 実行時に自動でPNG変換→挿入される

手動変換は不要。ただし事前にプレビューしたい場合:
```bash
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
<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>
  <!-- Step 1 -->
  <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>
  <!-- Arrow 1→2 -->
  <line x1="560" y1="500" x2="720" y2="500" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
  <!-- Step 2 -->
  <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>
  <!-- Arrow 2→3 -->
  <line x1="1160" y1="500" x2="1320" y2="500" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
  <!-- Step 3 -->
  <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
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1920 1080">
  <rect width="1920" height="1080" fill="#1E293B"/>
  <!-- Before -->
  <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>
  <!-- After -->
  <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
<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>
  <!-- Frontend -->
  <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>
  <!-- Arrow -->
  <line x1="960" y1="220" x2="960" y2="360" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
  <!-- API -->
  <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>
  <!-- Arrow -->
  <line x1="960" y1="520" x2="960" y2="660" stroke="#818CF8" stroke-width="4" marker-end="url(#arr)"/>
  <!-- Database -->
  <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>
```

---

### ワークフロー

1. Step 1.5 のスライド仕様JSONで `image` フィールドに出力パスを指定する
   - Nano Banana: `.png` パスを指定
   - SVG: `.svg` パスを指定（自動変換される）
2. 本ステップで画像を生成
3. Step 2 でスライド生成時に自動的に画像が挿入される

---

## Step 2: スライド作成

### スクリプト実行

```bash
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh create_slides.py output/slide_spec.json output/presentation.pptx
```

カスタムテンプレートを使う場合:
```bash
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）がやること

1. 現在のノートを読み出す:
```bash
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh write_talk_script.py output/presentation.pptx --read
```

2. `references/talk-styles.md` を参照し、ユーザーの希望する文体で全スライドのスクリプトを再生成する
   - 文体: `casual`（デフォルト） / `keynote` / `formal` / `humorous`

3. JSON配列として保存し、PPTXに書き込む:
```bash
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
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
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
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh synthesize_audio.py output/presentation.pptx output/audio/ --engine edge --script output/tts_script.txt
```

修正不要の場合（従来通りPPTXノートから直接合成）:
```bash
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh synthesize_audio.py output/presentation.pptx output/audio/ --engine edge
```

VOICEVOX使用時（事前にVOICEVOX Engineの起動が必要）:
```bash
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
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
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh make_slideshow.py output/presentation_with_audio.pptx output/presentation_final.pptx
```

表示時間を調整する場合:
```bash
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で代替可） |

未インストールの場合:
```bash
# Ubuntu/Debian
sudo apt install libreoffice ffmpeg poppler-utils

# macOS
brew install libreoffice ffmpeg poppler
```

**snap版LibreOfficeの注意**: 出力ディレクトリは `$HOME` 配下を使用すること。
`/tmp` 等への書き込みはサンドボックス制限で失敗する場合がある。

### スクリプト実行

```bash
bash ${CLAUDE_SKILL_DIR}/scripts/run.sh make_video.py output/presentation_final.pptx output/audio output/presentation.mp4
```

オプション指定:
```bash
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
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](https://bugs.documentfoundation.org/show_bug.cgi?id=101527)）
- LibreOffice で再生する場合は**手動でスライドを送る**か、LibreOffice上で「スライド切り替え」パネルから各スライドの「自動切り替え」時間を手動設定する必要がある
- **PowerPoint（Windows / macOS）では自動ページ送りが正常に動作する**

---

## リファレンス

- `references/pptx-guide.md`: レイアウト・プレースホルダーの詳細
- `references/talk-styles.md`: トークスクリプトの文体定義
- `references/tts-plugins.md`: TTSプラグインの追加方法
