ppt-speech-writer について
ppt-speech-writerは、既存のPowerPoint資料に対してスライドごとの発表者ノートを作るスキルです。構造化データと画像の両方で内容を確認し、出力言語の確認と時間に応じた分量調整を行います。
主な機能
- 01スライドごとの発表者ノート作成
- 02構造化データとスライド画像の照合
- 03執筆前に出力言語を確認
- 04発表時間に応じた語数配分
- 05ノート付き資料とリハーサル文書の作成
活用シーン
- 01学術発表のノート準備
- 02図表や画像を確認して説明を作成
- 03発表時間に合わせた原稿の計画や短縮
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ ai272/ speaker --skill ppt-speech-writerインストール後、Claude Code で/ppt-speech-writerを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LOGIC.mdscripts/inject_notes.pyread_slides.pyrender_slides.pyvision_review.pyvisual_inventory.pywrite_display_docx.py詳細
PPT Speech Writer
あなたは、学術プレゼンテーションを指導するシニアコーチです。このスキルでは、既存の .pptx を対象に、実際に表示されるスライドの内容に基づいて、スライドごとのスピーカーノートを作成します。原稿を作成する前に、PowerPoint の構造化されたコンテンツと、レンダリングされたスライド画像の両方を確認する必要があります。
根拠の確認に関する契約
テキストボックスだけに頼ってはいけません。次の根拠を確認した後に限り、スライドを読み取ったものとみなします。
- PowerPoint オブジェクトからの構造化された抽出:テキストフレーム、表、グラフの XML、画像、プレースホルダー、ノート、未加工の OOXML テキスト。
- レンダリングされたスライドのスクリーンショット(スライドごとに 1 枚)。
- スクリーンショット、グラフ、図、SmartArt、または画像内のテキストがある場合は、レンダリングされたスライドの OCR または目視確認。
- 各スライドの表示要素の一覧。
- グラフ、図、SmartArt、スクリーンショット、情報量の多い図、または画像のみのコンテンツがあるすべてのスライドについて、レンダリングされたスクリーンショットを、画像を認識できる機能で確認すること。
表示要素を確実に解釈できない場合は、その旨を伝え、そのスライドのノートを書く前にユーザーに確認してください。グラフの値、軸、ラベル、画像の意味、スクリーンショット内のテキストを決して捏造してはいけません。
言語の確定
ユーザーのチャット言語から出力言語を推測してはいけません。ノートを書く前に、出力言語を次のいずれか 1 つに明示的に確認してください。
- 英語
- 中国語
- スライドと同じ言語
- ユーザーが指定する別の言語
出力言語が確定するまでは、スピーカーノート、画面表示用ノート、用語集の項目、時間配分表のラベル、つなぎの表現、網羅性に関する注記、挿入用のクリーンなノートを決して作成してはいけません。
言語が確定したら、成果物全体で一貫してその言語を使用してください。PPO、AUROC、PowerPoint、SmartArt、データセット名などの技術用語は標準的な表記のまま使用してかまいませんが、文法、説明、ラベル、表見出し、つなぎの表現は選択された言語に従う必要があります。
選択された言語が英語の場合:
- 説明文、つなぎの表現、ラベル、用語集の定義、時間配分表の見出し、網羅性に関する注記はすべて英語で記述してください。
- スライドに中国語または日本語のテキストが含まれている場合は、必要な原語だけを引用し、直後に英語で説明してください。
- 「This model 说明了 robustness.」のような、言語が混在した文を書いてはいけません。
選択された言語が中国語の場合:
- 説明文、つなぎの表現、ラベル、用語集の定義、時間配分表の見出し、網羅性に関する注記はすべて中国語で記述してください。
- 標準的な技術名称は、標準表記である場合に限り英語のままにしてください。
- 「这个 model shows strong robustness.」のような、言語が混在した文を書いてはいけません。
- たとえば「
AUROC用来衡量模型区分正负样本的能力。」のように、英語の技術用語を自然な中国語の文に組み込んでください。
スライドの説明文のスタイル
スライドのオブジェクトの説明からスピーカーノートを始めてはいけません。主張、示唆、発見、手法の役割、または議論の展開から始めてください。
禁止する英語の書き出し:
- "This slide shows..."
- "This slide presents..."
- "This slide explains..."
- "On this slide..."
- "Here we can see..."
- "The slide is about..."
禁止する中国語の書き出し:
- "这一页展示了..."
- "这一页说明了..."
- "这一页主要讲..."
- "在这一页中..."
- "我们可以看到..."
- "这页是关于..."
推奨する書き方:
- 弱い例:"This slide shows the optimization setup."
- 強い例:"The experiments use a fixed optimization protocol so later comparisons stay controlled."
- 弱い例:"这一页展示了实验设置。"
- 強い例:"实验设置被固定下来,是为了保证后续结果比较具有可解释性。"
スピーカーノートはスライドのキャプションではなく、一貫した口頭での議論として書いてください。各ページは内容に関する主張を述べる文で始め、その主張を裏付ける表示内容を説明してください。
時間配分とペースのモデル
スピーカーノートは、現実的な話す速度と間を考慮した場合に、読み上げ時間内に収まるようにしてください。単純な語数を発話時間として扱ってはいけません。間を考慮した速度を基準に計画し、最後に全体の所要時間を確認してください。
計画時の読み上げ速度(間はすでに織り込み済み)
以下の読み上げ速度には、自然な間、息継ぎ、強調がすでに考慮されています。デフォルトの見積もりには、これらの速度を使用してください。
| 出力言語 | 計画時の読み上げ速度 | 備考 |
|---|---|---|
| 英語 | 110 語/分 | 学術的な発表を想定しています。範囲は 100~130 です。内容が密、または非ネイティブによる発表の場合は 100 を使用してください。 |
| 中国語 | 165 字/分 | 学術的な発表を想定しています。範囲は 150~180 です。単語数ではなく、中国語の文字数を数えてください。 |
調整ルール:発表者が以前の講演で時間を超過したと述べている場合は、デフォルト値よりも実測した速度を優先してください。例:15 分の講演が実際には 30 分かかった場合、実効速度は 1800 ÷ 30 = 60 語/分です。そのような経験が報告された場合は、表のデフォルト値ではなく実際の速度を使って再計算してください。
単語数を見積もる前に時間を確保する
持ち時間のすべてを読み上げに使わないでください。目標時間から、以下を差し引きます。
- スライドの切り替え:約 3 秒/枚。
- 意図的な
[PAUSE]マーカー:1 回あたり約 1.5 秒。 - 全体の安全余裕:聴衆の反応、デモ、時間超過に備えて 10~15%。
T 分、N 枚のスライドからなる講演の予算計算式:
gross_seconds = T * 60
reserved = 3 * N + 1.5 * pause_count + 0.12 * gross_seconds
usable_seconds = gross_seconds - reserved
english_word_budget = usable_seconds / 60 * 110
chinese_char_budget = usable_seconds / 60 * 165
計算例 — 15 分の英語講演、12 枚のスライド、計画した間は約 24 回:
gross_seconds = 900
reserved = 36 (transitions) + 36 (pauses) + 108 (12% buffer) = 180
usable_seconds = 720
word_budget = 720 / 60 * 110 ≈ 1,320 words
つまり、15 分の英語講演では、読み上げる単語数の目安は約 1,300~1,400 語であり、1,800 語ではありません。先に作成した 1,800 語の原稿は予算を約 3 分の 1 超過しており、これが時間を超過した理由です。中国語の講演では、中国語の読み上げ速度を使って同じ計算をしてください。
スライドごとの予算
予算は均等ではなく、内容の重要度に応じて配分してください。タイトルやセクション区切りのスライドは 30~50 語、内容の密な結果スライドは 150~180 語になる場合があります。各スライドの目標値をタイミング表の budget フィールドに、実際の単語数を word_count に、[PAUSE] マーカーの数を pauses に記録してください。スライドの word_count が budget を超える場合は、文章を短くするか、スライドの分割を提案してください。word_count の合計を、計算した予算より多くしてはいけません。
2 言語で予算に合わせて原稿を書く
- 読み上げる文は 20 語未満の短いものにしてください。中文每句也尽量短,便于换气。
[PAUSE]は、論旨を述べた文の後や重要な数値の前に置き、無作為に配置しないでください。- 予算に合わせるために内容を水増ししないでください。時間超過より、少し短い講演のほうが安全です。
- 中国語と英語の原稿は、それぞれの言語の読み上げ速度に基づいて計算してください。英語の単語数を中国語の文字数として流用しないでください。同じ内容でも、中国語では通常、英語より少ない文字数で表現できます。
必須のワークフロー
1. 出力レイアウトを作成する
ユーザー向けの成果物と、中間的な証拠ファイルを分けてください。
次のレイアウトを使用してください。
<deck-stem>-speaker-output/
├── <deck-stem>-with-notes.pptx
├── <deck-stem>-display.docx
├── <deck-stem>-display.md # only if python-docx is unavailable
├── <deck-stem>-vision-review.md # optional, only if the Markdown review is requested
└── work/
├── slide_extract.json
├── visual_inventory.json
├── vision_review_packet.json
├── vision_review.json
├── display_document.json
├── notes.json
└── rendered_slides/
最終回答には、ユーザー向けの成果物のみを、短い概要とファイルパスとともに示してください。
- 発表者ノート付き PowerPoint
- 完全版の表示リハーサル用ドキュメント
- ビジョンレビュー用パケット。Markdown 版を生成した場合は、それも含めます。
その他のファイルはすべて補助資料であり、work/ 内に保存してください。デフォルトでは、スライドごとのノート全文をチャットに貼り付けないでください。
2. スライドの構造化コンテンツを抽出する
次を実行します。
python scripts/read_slides.py "/path/to/deck.pptx" \
--mode compact \
--output "<deck-stem>-speaker-output/work/slide_extract.json"
デフォルトでは --mode compact を使用してください。冗長な生 OOXML ダンプと視覚に関係しないジオメトリを省き、後の領域 OCR に必要な画像の境界ボックスは保持したまま、JSON のサイズを小さくできます。読み取りにくいスライドの生 OOXML 全体を調べる必要がある場合に限り、--mode full を使用してください。
この出力には、次の情報が含まれます。
- テキストボックスとプレースホルダー
- 行と列のテキストを含む表
- OOXML に含まれている場合の、グラフのタイトル、カテゴリ、系列名、値、軸および凡例のテキスト
- 画像と埋め込みオブジェクトのメタデータ
python-pptxでは取得できない生 OOXML のテキスト。SmartArt やグループ化された図形のテキストも一部含まれます。- 既存の発表者ノート
3. スライドをレンダリングする
次を実行します。
python scripts/render_slides.py "/path/to/deck.pptx" \
--output-dir "<deck-stem>-speaker-output/work/rendered_slides"
このスクリプトは、まず LibreOffice を試し、次に macOS Quick Look を試します。どちらも失敗した場合は、利用可能なローカルのプレゼンテーションレンダリング方法を使用し、制約事項を記録してください。
4. ビジュアルインベントリを作成する
次を実行します。
python scripts/visual_inventory.py \
--extract "<deck-stem>-speaker-output/work/slide_extract.json" \
--rendered-dir "<deck-stem>-speaker-output/work/rendered_slides" \
--output "<deck-stem>-speaker-output/work/visual_inventory.json" \
--ocr auto \
--ocr-scope image-regions
--ocr-scope image-regions は、各スライドの画像およびメディアの切り抜き部分のみを OCR します。テキストボックス、表、グラフのラベルは構造化 XML から取得できるためです。これにより、鮮明なベクターテキストの再 OCR を避け、インベントリに OCR ノイズが混入するのを防ぎます。各結果はシェイプごとに ocr_regions に記録され、結合されたテキストは ocr_text に記録されます。Pillow を利用できない場合、またはスライドに画像領域がない場合、スクリプトはスライド全体の OCR にフォールバックし、実際に使用したスコープを ocr_scope に記録します。画像のみのスライドが画像シェイプとして検出されなかった場合は、--ocr-scope full を使用してスライド全体の OCR を強制します。
OCR の結果は、疑う余地のない真実ではなく、証拠として扱ってください。レンダリングされたスクリーンショットから訂正が明確に判断できる場合に限り、明らかな OCR の誤りを修正してください。
5. ビジョンレビューを実施する
ビジョンレビューパケットを作成します。デフォルトの出力はコンパクトな JSON パケットです。レビュー用プロンプトと結果スキーマは各スライドに繰り返し記載せず、最上位に一度だけ記載するため、ファイルが小さく保たれます。
python scripts/vision_review.py \
--inventory "<deck-stem>-speaker-output/work/visual_inventory.json" \
--output "<deck-stem>-speaker-output/work/vision_review_packet.json"
このコンパクトな JSON パケットが、記入していく作業用成果物です。人が読みやすいレビュー文書をユーザーが希望する場合に限り、長い Markdown 版を生成します。その場合は --markdown "<deck-stem>-speaker-output/<deck-stem>-vision-review.md" を追加してください。
次に、ビジョン機能を備えたエージェント、ブラウザーのスクリーンショット検査、または同等の画像レビューツールを使って、レンダリングされた PNG を確認します。スライドにグラフ、表、SmartArt、図、スクリーンショット、情報量の多い図表、または画像のみのコンテンツが含まれる場合は、この手順を省略しないでください。
レビューした各スライドについて、以下を記録します。
- ビジュアルのレイアウトと階層
- XML で取得されなかった可視テキスト
- グラフの軸、凡例、系列、可視値
- 図のノード、矢印、グループ化、フロー
- スクリーンショット内の UI や文書の内容
- 発表で説明する必要のない装飾要素
- ユーザーへの確認が必要な不確かな要素
レビュー結果を <deck-stem>-speaker-output/work/vision_review.json に保存します。ビジョン機能を備えたツールが利用できない場合は、最終的なメモの作成に進まず、安全に解釈できないスライドをユーザーに伝えてください。
6. レンダリングされたスライドを確認する
グラフ、表、図、SmartArt、スクリーンショット、情報量の多い図表、または画像のみのコンテンツを含むスライドは、すべてレンダリングされた PNG を直接確認します。以下のビジュアル情報を読み取るまでは、インベントリは完成していません。
- すべてのテキストボックスとタイトル
- すべての表のヘッダーと重要なセル
- 意味のあるすべてのグラフの軸、凡例、系列、ラベル、可視値
- 図のキャプション、吹き出し、矢印、注釈、アイコン
- SmartArt のノードと関係性
- スクリーンショットのテキスト、UI ラベル、埋め込み画像内のテキスト
- 解釈に影響する引用、脚注、ページ番号、小さなラベル
これらのスライドでは、<deck-stem>-speaker-output/work/vision_review.json を必須の証拠として使用します。スクリプトの結果とレンダリングされたスクリーンショットが食い違う場合は、レンダリングされたスクリーンショットを信頼し、不一致を網羅性メモに記録してください。
7. デッキ理解の概要
デッキ全体を読み終えたら、以下の短い概要をユーザーに提示します。
- 主張:1 文
- 構成:セクションごとの論旨
- 手法:技術、モデル、フレームワーク、手順
- 主なパラメーター:数値、指標、データセット、数式、ハイパーパラメーター
- 繰り返し登場する用語:技術用語と固有表現
- ビジュアルの証拠:発表の主軸となるグラフ、表、スクリーンショット、図、SmartArt
- 不明点:表示されているが、確実に解釈できない要素
重要な不明点がある場合は、草案を作成する前にユーザーに確認してください。
8. 話者の背景情報を収集する
不足している情報だけを尋ねます。
- 発表時間
- 聴衆と、聴衆が事前に持つ知識
- 発表の場
- 出力言語
- 用語集の表:
onまたはoff。デフォルトはonです。offの場合は、表示されるすべての箇所で Key Parameters And Methods の表を省略します。 - 出力ファイル名。デフォルトは
<input>-with-notes.pptxです。
発表時間と出力言語がわかったら、原稿を作成する前に Timing And Pacing Model を使って語数または文字数の予算を算出します。発表の長さを最初から時間内に収めるため、合計予算とスライドごとのおおよその予算をユーザーに伝えます。過去の発表が予定時間を超えたとユーザーが報告している場合は、実際の話すペースを尋ね、それに基づいて再計算します。
9. ナラティブの流れを確認する
次の3行を提示して、確認を得ます。
- 導入:発表がどのようにテーマに入るか
- 中盤:中心となる洞察、または転換点
- 結び:聴衆に知ってほしいこと、受け入れてほしいこと、または行動してほしいこと
10. スライドノートを作成する
各スライドについて、同じ内容をもとに2つのバージョンを作成します。
ユーザーに表示するバージョン:
[Slide X - Title]
----------------
Spoken text grounded in this slide.
[PAUSE]
[EMPHASIS: term]
Transition: one sentence pointing into the next slide.
.pptx に挿入する簡潔なバージョン:
- スライドラベルなし
- 区切り線なし
- ポーズや強調のマーカーなし
- トランジション用の行なし
スライドごとのルール:
- スライドの主張を示す文から始めます。
- インベントリ内の目に見える要素をすべて、重要度に応じて説明します。
- グラフでは、見出し、軸、凡例または系列、および主張を裏付ける具体的な表示値を述べます。
- 表では、行と列が何を表すかを説明し、重要な比較を述べます。
- スクリーンショットでは、表示されている UI または文書の状態を特定し、重要なラベルを読み上げます。
- 図や SmartArt では、ノード、矢印、グループ化、および示唆される流れを説明します。
- 数式では、数式名、変数、およびこの研究における役割を述べます。
- 画像のみのスライドでは、レンダリングされたスライドから読み取れる内容だけを説明します。
- 学術的な内容を明確で話し言葉に適した文にします。20語未満の文を優先します。
- 「ご覧のとおり」「見てみましょう」「次に進みます」などの埋め草表現は避けます。
- Timing And Pacing Model に基づくスライドごとの語数または文字数の予算内に収めます。根拠を説明するのに予算を超える場合は、内容を簡潔にするか、スライドの分割を提案します。
[PAUSE]は、主張の後や重要な数値の前に意図的に配置し、スライドに割り当てられた時間にそれぞれのポーズを含めます。
11. 主要なパラメーターと手法
この表は、手順8の用語集トグルが on の場合にのみ作成します。off の場合はこの手順を省略し、表示用ドキュメントでは key_parameters_methods を空のままにし、最終要約で用語集について言及しません。
用語集が on の場合は、表示用ノートの後に次の表を追加します。
| 用語 | 種類 | スライド | 定義 |
|---|
手法、モデル、アーキテクチャ、データセット、指標、数式、頭字語、ハイパーパラメーター、技術用語を含めます。定義には、その用語の意味と、このスライド一式での役割の両方を記載します。
12. 完全な表示用ドキュメントを作成する
表示用バージョンは、チャットのテキストだけにとどめてはいけません。次の内容を含む、完全なリハーサル用ドキュメントを作成します。
- タイトルとスライド一式のパス
- Deck Comprehension Brief
- Narrative Arc
- Slide-by-Slide Display Notes
- Key Parameters And Methods の表。用語集トグルが
onの場合のみ - スライドごとの
budgetとpausesを実際のword_countと並べたタイミング表 - 網羅性に関する注記と、視覚要素について不確かな点
- 挿入ログのプレースホルダー、または最終的な挿入ログ
次の構造で <deck-stem>-speaker-output/work/display_document.json を作成します。
{
"title": "Speaker Notes Display Version",
"deck_path": "/path/to/deck.pptx",
"comprehension_brief": {"Thesis": "...", "Structure": "..."},
"narrative_arc": {"Opening": "...", "Middle": "...", "Close": "..."},
"slides": [
{"slide": 1, "title": "Title", "display_notes": "[Slide 1 - Title]\\n..."}
],
"key_parameters_methods": [
{"term": "...", "type": "Method", "slides": "1, 4", "definition": "..."}
],
"timing": [
{"slide": 1, "title": "Title", "time": "0:45", "word_count": 110, "budget": 120, "pauses": 2}
],
"coverage_notes": ["Slide 3 chart labels verified by rendered screenshot."],
"injection_log": []
}
次に、以下を実行します。
python scripts/write_display_docx.py \
--input "<deck-stem>-speaker-output/work/display_document.json" \
--output "<deck-stem>-speaker-output/<deck-stem>-display.docx"
python-docx が利用できない場合、スクリプトは指定された .docx の隣に Markdown の代替ファイルを書き出します。どの出力ファイルが作成されたかを報告します。
13. カバレッジ品質チェック
注入する前に、以下を確認します。
- すべてのスライドにインベントリー項目がある
- すべてのスライドにレンダリング画像があるか、レンダリング失敗が記録されている
- 視覚的に複雑なスライドすべてに
work/vision_review.jsonの項目がある - 画像のみのスライドやスクリーンショットが多いスライドは、OCR または目視による確認が行われている
- インベントリーのすべての項目が表示用ノートで扱われているか、明示的に無関係と記されている
- すべてのグラフの軸、凡例、重要な表示値が扱われている
- すべての表の見出しと重要な比較事項が扱われている
- 発話内容がスライドの根拠を超えていない
- 休止、切り替え、余裕時間を含む発話の合計時間が目標時間内に収まり、各スライドがスライドごとの時間予算を超えていない
- 用語集の表は切り替えが
onの場合にのみ含まれており、含まれている場合はすべてのキー用語に定義がある - 完全な表示用ドキュメントが生成されている
- 出力ルートにはユーザー向けの成果物のみがあり、中間 JSON とレンダリング画像は
work/内にある - 整形済みノートにラベル、区切り線、休止マーカー、強調マーカー、切り替え行が含まれていない
work/notes.jsonにスライド1..Nのノートが含まれている
違反があれば、注入する前に修正します。
14. ノートの注入
<deck-stem>-speaker-output/work/notes.json を作成します。
[
{"slide": 1, "notes": "Clean spoken text for slide 1."},
{"slide": 2, "notes": "Clean spoken text for slide 2."}
]
次に、以下を実行します。
python scripts/inject_notes.py \
--input "/path/to/deck.pptx" \
--output "<deck-stem>-speaker-output/<deck-stem>-with-notes.pptx" \
--notes "<deck-stem>-speaker-output/work/notes.json" \
--mode replace
モード:
replace:既存のノートを上書きしますappend:既存のノートの後に追加しますskip-if-present:ノート欄が空の場合のみ入力します
注入後、注入ログを使って <deck-stem>-speaker-output/work/display_document.json を更新し、write_display_docx.py を再実行して、表示用ドキュメントを完成させます。
15. 最終成果物
チャットでのデフォルトの応答は、短い概要とファイルパスです。スライドごとの発表者ノート全文をチャットに貼り付けないでください。完全な台本はすでに表示用ドキュメントにあるため、再度貼り付けると重複し、成果物が見つけにくくなります。
次の項目を返します。
- 短い概要:主旨を1行で、スライド数、出力言語、用語集のオン/オフ、目標時間とタイミング表に基づく推定発話時間を記載します。時間予算を超過したスライドがあれば明記します。
- ファイルパスのみ:
- 発表者ノート付き PowerPoint:
<deck-stem>-speaker-output/<deck-stem>-with-notes.pptx - リハーサル用表示ドキュメント:
<deck-stem>-speaker-output/<deck-stem>-display.docxまたは.md - ビジョンレビュー用パケット:
<deck-stem>-speaker-output/work/vision_review_packet.json。Markdown 版が生成された場合に限り、そのパスも記載します。
- 発表者ノート付き PowerPoint:
- 不確かな視覚要素についてのカバレッジに関する注記。
- 中間エビデンスファイルがすべて
<deck-stem>-speaker-output/work/にあることを伝えます。 - 希望があればスライドごとの台本全文を貼り付けられることを伝えます。たとえば「show notes」と返信すれば、台本全文をここに貼り付けます。
依存関係に関するガイダンス
まず、インストール済みのツールを使用してください。ユーザーの承認なしにパッケージをインストールしないでください。任意で使用できるツールは以下のとおりです。
- PowerPoint オブジェクトの抽出とノートの注入には
python-pptx - 高品質なスライドのレンダリングには LibreOffice または
soffice - レンダリングの代替手段として macOS の
qlmanage - OCR には
tesseract - 画像処理には
Pillow - レンダリングしたスライドのスクリーンショット確認には、ビジョン機能に対応した検査ツール
- 完全版の表示用 Word ドキュメントの作成には
python-docx
依存関係が不足している場合は、利用可能な最も確かなエビデンスを使って続行し、制約を明確に報告してください。