Step 3: AI要約を作ろう(OpenAI API)🚀: YouTube動画要約アプリを作ろう! | SkillhubAI(スキルハブエーアイ)

Step 3: AI要約を作ろう(OpenAI API)🚀: YouTube動画要約アプリを作ろう!

日本語はそのまま要約/英語は日本語に翻訳して要約 ― 初心者向けハンズオン

この章で学ぶこと

  • OpenAI API を使って日本語の字幕テキストを要約する
  • 英語の字幕を日本語に翻訳して要約する
  • 「最小のコード」で動くところから始める考え方

まずは “日本語→要約” の小さな成功を作ってから、”英語→日本語で要約” に広げます。 例のごとく、動く芯を作ってから少しずつ育てましょう。


事前準備(初回だけ)

  1. ライブラリを入れます
  • Windows: pip install openai
  • Mac: pip install openai

    1. APIキーを環境変数に設定します
  • Windows(PowerShell): setx OPENAI_API_KEY "sk-...あなたのキー..."(新しいターミナルを開き直す)

  • Mac/Linux: export OPENAI_API_KEY="sk-...あなたのキー..."

OpenAI の最新Pythonクライアントは from openai import OpenAI; client = OpenAI() で使い始めます。実行リクエストは client.responses.create(...) がシンプルです。(OpenAI Platform)


3-A: 日本語テキストを要約しよう(最小コード)

何を作る?

Step 2 で保存した transcript_ja.txt(日本語の全文字幕)を300〜500字の日本語要約にします。画面にも出し、summary_ja.md にも保存します。

まずコード

以下の内容で 03A_ai_summary_ja.py を作成してください。

# 03A_ai_summary_ja.py
from openai import OpenAI
import pathlib

INPUT_FILE = "transcript_ja.txt"     # Step 2 で作った日本語字幕
OUTPUT_FILE = "summary_ja.md"        # 要約の保存先

# ① 入力テキストを読む
text = pathlib.Path(INPUT_FILE).read_text(encoding="utf-8")

# ② OpenAI クライアントを用意
client = OpenAI()  # OPENAI_API_KEY を環境変数に設定済みであること

# ③ 日本語要約の依頼文(プロンプト)
prompt = (
    "次の文章を日本語で300〜500字に要約し、最後に重要ポイントを3〜5個の箇条書きで示してください。\n"
    "専門用語は噛み砕いて、初学者にも分かる説明にしてください。\n\n"
    f"=== 元テキスト ===\n{text[:12000]}\n"
)

# ④ モデルにリクエスト(最小形)
res = client.responses.create(
    model="gpt-4.1",        # 軽量モデルに変えてもOK(例: gpt-4.1-mini / gpt-4o-mini)
    input=prompt
)

summary = res.output_text  # ⑤ 生成された要約テキスト

# ⑥ 画面に出す + ファイル保存
print(summary)
pathlib.Path(OUTPUT_FILE).write_text(summary, encoding="utf-8")
print(f"\n✅ Saved: {OUTPUT_FILE}")

どう読む?(行ごとの“やさしい説明”)

  • 入力テキストを読むread_text はファイルの中身を1つの長い文字列として手に入れます。
  • OpenAI クライアントOpenAI() と書くと「AIにお願いする窓口」を作れます(キーは環境変数から自動取得)。(OpenAI Platform)
  • プロンプト:AIに何をして欲しいかを自然文で伝えるところです。今回は「日本語で要約+箇条書き」。 長文すぎると入らないことがあるので、まずは text[:12000] として先頭だけ渡しています(後で改良可能)。
  • client.responses.create(...):AIに「これを処理して」と依頼します。
  • res.output_text:返ってきた要約の本文だけを取り出すお手軽プロパティです。(OpenAI Platform)
  • 保存write_text でMarkdownとして保存。まずはシンプルに“1ファイルに全部”でOKです。

うまくいきましたね!🎉 これで「日本語→要約」が完成です。


3-B: 英語の字幕を“日本語に翻訳して”要約しよう(最小コード)

何を作る?

Step 4(英語対応)で保存した transcript.txt(英語の全文字幕)を読み込み、 内容を分かりやすい日本語に翻訳したうえで要約します。出力は summary_from_en_ja.md

まずコード

以下の内容で 03B_ai_summary_en_to_ja.py を作成してください。

# 03B_ai_summary_en_to_ja.py
from openai import OpenAI
import pathlib

INPUT_FILE = "transcript.txt"           # 英語の字幕ファイル
OUTPUT_FILE = "summary_from_en_ja.md"   # 日本語要約の保存先

text = pathlib.Path(INPUT_FILE).read_text(encoding="utf-8")
client = OpenAI()

prompt = (
    "次の英語テキストの内容を日本語に翻訳し、全体を300〜500字で分かりやすく要約してください。"
    "最後に重要ポイントを3〜5個、短い日本語の箇条書きで示してください。"
    "訳語は専門用語を避け、初学者に伝わる平易な表現を優先してください。\n\n"
    f"=== Source (EN) ===\n{text[:12000]}\n"
)

res = client.responses.create(
    model="gpt-4.1",    # 例: gpt-4.1-mini / gpt-4o-mini でもOK
    input=prompt
)

summary = res.output_text

print(summary)
pathlib.Path(OUTPUT_FILE).write_text(summary, encoding="utf-8")
print(f"\n✅ Saved: {OUTPUT_FILE}")

どう読む?(行ごとの“やさしい説明”)

  • 英語→日本語へ:プロンプトの文章で「翻訳してから要約」という手順の希望をハッキリ伝えています。
  • 平易な表現:読み手が初学者なので、難しい単語を避けるように頼んでいます。
  • 処理の流れ:読み込み → プロンプト作成 → responses.createoutput_text 取り出し → 画面+保存、というシンプルな直線です。

実行してみよう

日本語の要約

python 03A_ai_summary_ja.py

できあがった summary_ja.md を開いて、内容がコンパクトにまとまっていることを確認しましょう。

英語→日本語で要約

python 03B_ai_summary_en_to_ja.py

summary_from_en_ja.md を開いて、読みやすい日本語になっているか確認してみましょう。

🎉 おめでとうございます! ここまでで 「日本語も英語も、日本語の要約として使える」 ところまで来ました。


了解!**Step 3 の末尾に“そのまま足すだけ”**の最小ログ(verbose)を用意しました。 既存コードのロジックは変えず、送信前後にちょっとだけ print を足すだけです。


3-C(追記):見える化(A. 自分で出すログ)👀

対象:03A_ai_summary_ja.py03B_ai_summary_en_to_ja.py 目的:何を送り、何が返って、何秒かかったかを毎回確認できるようにする

追記手順(両ファイル共通)

  1. 上の importimport time を1行足す
  2. client.responses.create(...)直前と直後に以下を追加
# ▼ 送信前ログ(どのモデルに / どれくらいの長さを / どんな指示で?)
print("▶ Request")
print("  - model: gpt-4.1")  # 使っているモデル名(あなたのコードの指定に合わせて)
print(f"  - input length (chars): {len(prompt)}")
print(f"  - prompt preview: {prompt[:60]}...")

# ▼ 呼び出し本体(処理時間を計測)
start = time.time()
res = client.responses.create(model="gpt-4.1", input=prompt)  # ← 元の1行をこのまま使う
elapsed = time.time() - start

# ▼ 返却メタ情報(ID / model / 所要時間)
print("\n✓ Response")
print(f"  - response.id: {getattr(res, 'id', None)}")
print(f"  - response.model: {getattr(res, 'model', None)}")
print(f"  - elapsed: {elapsed:.2f}s\n")

# (この下は既存のまま)
summary = res.output_text

置き場所の目安: 既存の

> res = client.responses.create(model="...", input=prompt)
> summary = res.output_text
> 

に入れるイメージです(上記コードはその行も含んでいるので、重複しないよう注意)。

何が見えるようになる?

  • Request:モデル名/入力文字数/プロンプト冒頭
  • Response:応答ID(問い合わせの識別子)/実際に使われたモデル名/処理秒数

実行イメージ

▶ Request
  - model: gpt-4.1
  - input length (chars): 4872
  - prompt preview: 次の文章を日本語で300〜500字に要約し、最後に重要ポイントを...

✓ Response
  - response.id: resp_abc123...
  - response.model: gpt-4.1
  - elapsed: 0.92s

これで、送ったものと返ってきたものを毎回目で確認できます。 「遅い?」と思ったら elapsed を、「思った文言じゃない?」と思ったら prompt preview をまずチェックしましょう。


必要なのはこの追記だけ。レッスン本文の流れはそのままでOKです。 次は Step 4(StreamlitでUI化) に進みましょう!

うまくいかないとき(最初に見るチェックリスト)

  1. キーが未設定
  • 環境変数 OPENAI_API_KEY を設定したか
  • 新しいターミナルを開き直したか

    1. 文字数が多すぎる
  • text[:12000] の数字を小さくして再実行(まずは動かす)

    1. ライブラリのインストール
  • pip show openai で入っているか確認

    1. 英語入力なのに日本語出力じゃない
  • プロンプトに「日本語で」を入れているか確認(言い方はとても大事)


ちょい発展(興味が出てきたら)

  • 入力が長いときに**分割(チャンク)**して順番に要約 → 最後にまとめ直す
  • 出力をセクション見出し・箇条書きできれいなMarkdownに整型
  • モデルの種類を切り替えて、速度・精度・コストの違いを体験
  • 要約の長さ(例:短い要約/長い要約)を引数で選べるようにする

参考(公式ドキュメント)

  • OpenAI Python クライアント/Responses API の基本的な使い方(from openai import OpenAI, client.responses.create(...) など)(OpenAI Platform)

次はいよいよ Step 4: Streamlit でUI化 に進みましょう。 同じ処理を“ボタン一発”の画面にすれば、毎回の作業がグッと楽になります ✨