원클릭으로
notebooklm-radio
// 公開済みの blog post から NotebookLM Audio Overview (日本語ポッドキャスト) を生成し、記事フロントマターに紐付ける
// 公開済みの blog post から NotebookLM Audio Overview (日本語ポッドキャスト) を生成し、記事フロントマターに紐付ける
Hugo ブログ記事を新規作成し、PR を作成する
既存 blog post に対してファクトチェックを単独実行する。skill 自身が claim を抽出 → claim-atom-verifier (Haiku) を claim 単位で並列 fan-out する swarm を回す
wiki section または個別ページに対して claim 単位の swarm ファクトチェックを実行する。skill 親セッションが claim を抽出し claim-atom-verifier (Haiku) を並列起動する
Wiki ページの `lastmod` を section 別の閾値で評価し、touch されずに古びた候補を浮かせる。refresh サブコマンドで wiki-fact-checker agent を起動して claim を再検証する
ブログ記事を読み込んで Wiki ページを自動生成・更新する
Wiki の健全性チェック(矛盾検出、孤立ページ、欠落リンク、古い記述)
| name | notebooklm-radio |
| description | 公開済みの blog post から NotebookLM Audio Overview (日本語ポッドキャスト) を生成し、記事フロントマターに紐付ける |
| arguments | [{"name":"target","description":"対象 post の URL (`https://eotel.github.io/blogs/posts/YYYY/MM/<slug>/`) または md ファイルパス (`content/posts/YYYY/MM/<slug>.md`)","required":true},{"name":"format","description":"音声形式: deep_dive (既定) / brief / critique / debate","required":false},{"name":"length","description":"長さ: short / default (既定) / long","required":false},{"name":"force","description":"true なら同タイトルの notebook が既存でも上書き再生成","required":false}] |
公開済みの blog post から NotebookLM の 日本語 Audio Overview を生成し、GitHub Release Assets
(audio rolling tag) に upload して、記事 frontmatter に audio_url を埋め込んでください。
実装は 2 層:
scripts/notebooklm-radio-tui.sh — fzf ベースの対話 TUI。post を絞り込み・プレビューしながら選び、言語/長さ/形式/focus を fzf ピッカーで決め、最後に確認して dispatch。ターミナルから手動で使うときはこちらを推奨scripts/notebooklm-radio.sh — フラグ駆動の本体。/notebooklm-radio <target> 経由や cron / batch から呼ぶ用配信先:
static/audio/<slug>/overview.m4a (.gitignore 済、再 upload 用に保持)https://github.com/Eotel/blogs/releases/download/audio/<slug>.m4a/blog で公開済みの記事に音声解説を後付けしたいときnlm CLI がインストール済み (uv tool install notebooklm-mcp-cli)nlm login --profile blogs で blog 専用 profile を作成済み.envrc に export NOTEBOOKLM_HL=ja が設定済み(フォールバック)direnv allow 済みnlm doctor は cookie の存在しか見ないため、
真の認証チェックは nlm notebook list --profile blogs --json を実機で叩く こと。
スクリプトの preflight はこれを実装している。
./scripts/notebooklm-radio-tui.sh
これで以下が順に出る:
notebooklm-radio.sh を exec で起動★ が既に付いた post を選ぶと「再生成しますか?」と聞かれ、--force 付きで実行される。
# URL 指定
./scripts/notebooklm-radio.sh https://eotel.github.io/blogs/posts/2026/05/2026-05-21-some-slug/
# ファイルパス指定
./scripts/notebooklm-radio.sh content/posts/2026/05/2026-05-21-some-slug.md
# dry-run (slug 解決・タイトル抽出までで停止)
./scripts/notebooklm-radio.sh <target> --dry-run
# 言語切替(既定は $NOTEBOOKLM_HL or ja)
./scripts/notebooklm-radio.sh <target> --language en-US
# focus topic を与える
./scripts/notebooklm-radio.sh <target> --focus "セキュリティ観点を強調"
# 短尺・別形式
./scripts/notebooklm-radio.sh <target> --length short --format brief
# 既存 notebook があっても再生成
./scripts/notebooklm-radio.sh <target> --force
完了後:
hugo --gc
# 該当記事を localhost で開き、ヘッダー直下に "音声解説" バッジ付きの <audio> プレイヤーがあるか確認
| エラー | 原因 | 対処 |
|---|---|---|
Profile not found: blogs | profile 未作成 | nlm login --profile blogs でブラウザログイン |
Authentication expired | cookie 期限切れ (~2-4 週) | 同上 (nlm login --profile blogs) |
source add / ingest failed | URL が公開前 or NotebookLM がクロール失敗 | 公開反映を待つ。Hugo build → push → Pages 反映後に再実行 |
timed out waiting for audio artifact | 15 分以内に生成完了せず | nlm studio status <nb> --profile blogs で状況確認。生成中なら --id <artifact-id> で download を直叩き |
download produced empty file | artifact_id mismatch | nlm studio status <nb> --json で正しい artifact_id を取得し直す |
nlm notebook list --profile blogs を棚卸し).m4a (mime audio/mp4)。NotebookLM の既定出力に合わせている/blog との自動連携はしない(cookie 期限切れで blog 公開フロー全体が止まるリスク回避)deep_dive 既定(NotebookLM の象徴的 2 ホスト対談)audio)m4a はリポジトリには commit せず、固定の release audio に asset として upload する。
https://github.com/Eotel/blogs/releases/download/audio/<slug>.m4astatic/audio/<slug>/overview.m4a (.gitignore 済)gh release create audio --title "Eotel Blog Audio Overviews" --notes-file <notes.md> --latest=falsegh release upload audio <file> --clobber で同一 tag に追加し続けるgh release delete audio を絶対に走らせない(全 post の音声リンクが切れる)NOTEBOOKLM_RADIO_REPO=<owner/repo> / NOTEBOOKLM_RADIO_RELEASE_TAG=<tag> で URL 先を切替可能GitHub Pages の 1GB 制限を回避し、帯域も無料。gh release upload には repo write 権限が要るので、GH_TOKEN の scope は repo を含める。
nlm login switch がグローバル設定をいじる仕様なので、download 段は static/audio/.../profile-switch.lock の mkdir-based atomic lock で直列化される。同じ post を複数セッションから同時に回しても download 自体は安全(順番に処理される)が、生成中の notebook が重複作成される。並列で叩くなら別 post に限ること。
詳細設計と背景は docs/exec-plans/active/2026-05-21-notebooklm-radio-skill.md を参照。