
2026/07/14 5:13
Show HN: YouTube ギタータブ解析ツール
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
この CLI ツールは、Anthropic API キーを指定するといった最小限の設定で YouTube ギターレッスン動画をギターのタブ譜 PDF ファイルに変換します。その核心となるワークフローでは、Claude Vision を用いて動画フレームを分析し、水平バンドグリッドを使用してタブ領域を検出するとともに、最初のバンドと最後のバンドの中央値を取ることで楽譜を堅牢に識別します。
yt-dlp(高画質制限を遵守しつつ)で動画をダウンロードした後、ffmpeg を使用して設定可能な間隔ごとにフレームを抽出します。各フレームは検出された領域に合わせて切り出され、近似的に同一の連続的な切り出し部分は知覚ハッシュング(dHash)を用いて除去されて API コストの削減を図ります。その後、Claude はバー/小節番号を読み取り、実際のタブ内容とイントロやタイトルカードを区別し、各行のカursor フレームをバー番号の変化に基づいて単一ページに統合して collapses します。最後に pdf-lib がビデオ順に異なるタブ行を A4 ページ上に垂直に積み重ねて出力を生成し、ファイルは out/<video-title>.pdf に保存され、ビデオタイトルをヘッダーとして含み、ドキュメントメタデータも付与されます。
要件:
- Node.js ≥ 20
- PATH 上に外部ツール
およびyt-dlp
が用意されていること(例:ffmpeg
)brew install yt-dlp ffmpeg
または環境変数を通じて Anthropic API キーを提供する必要があること.env
設定と使用方法:
を実行し、その後npm install
を実行します。npm run build
を.env.example
にコピーし、.env
を設定するか(または変数を export する)ANTHROPIC_API_KEY- 以下のように実行します:
node --env-file=.env dist/cli.js "<youtube-url>"
デバッグ用ショートカット:node --env-file=.env --import tsx src/cli.ts "<url>"
主要なコマンドラインオプション:
:スクリーンショットの間隔(デフォルト 2)-i, --interval <seconds>
:Claude vision モデル ID(デフォルト--model <id>
)claude-sonnet-5
:タブ領域検出に使用するフレーム数(デフォルト 6)--sample <n>
:プリデダップ用ハンミング距離コスト制御(デフォルト 12)--dedup-threshold <n>
:ダウンロード解像度の上限(デフォルト 720)--max-height <px>
: 中間フレーム/切り出し結果を保持する--keep-temp
メリット:
- 手動スクリーンショットや汎用 OCR を必要とせずにタブ抽出を自動化します。
- 学習者に直ちに整理された印刷可能な楽譜を提供します。
- 教育者には、好まれる印刷向けフォーマットを提供し音楽教育のデジタル化ワークフローを簡素化するなど、アクセシビリティを大幅に向上させるのを助けます。
本文
YouTube 動画からギタータブ PDF を自動生成する CLI ツール
このツールは、YouTube のギターレッスン動画を**PDF ファイルに変換するコマンドラインインターフェース(CLI)**です。 動画を購入し、フレームサンプリングを行い、Claude Visionを用いてタブ部分を自動的に検出・抽出します。小節番号に基づいて重複を除去し、異なるタブの行を縦に縫い合わせて PDF を作成します。
セットアップ完了後は特別な設定なしで、
out/ ディレクトリに <動画タイトル>.pdf として出力されます。ファイル名、最初のページの見出し、メタデータにも動画タイトルが自動適用されます。
📋 環境要件
以下の準備が必要です:
- Node.js: バージョン 20 以上
- 依存ツール:
にPATH
とyt-dlp
がインストールされていることffmpeg- Homebrew ユーザーの場合は
で入手可能brew install yt-dlp ffmpeg
- Homebrew ユーザーの場合は
- API キー: Anthropic API キー(Claude Vision へのアクセスに必須)
🛠 セットアップ手順
以下のコマンドで環境を構築してください。
npm install npm run build cp .env.example .env # 次に、このファイルに自身の ANTHROPIC_API_KEY を設定してください
<動画タイトル>.pdf が出力されるディレクトリは out/ です。
🚀 使用方法
1. .env
ファイルを用意する場合(推奨)
.env.env ファイルに API キーを設定済みの状態で実行します。
node --env-file=.env dist/cli.js "https://www.youtube.com/watch?v=WgU5tDGC-Vc"
2. 環境変数で指定する場合
export ANTHROPIC_API_KEY を設定済みの場合に使用します。
export ANTHROPIC_API_KEY=sk-ant-... node dist/cli.js "https://www.youtube.com/watch?v=WgU5tDGC-Vc"
3. 開発環境での直接実行
ビルドステップを省略してソースコードから直接使用したい場合です。
node --env-file=.env --import tsx src/cli.ts "<url>"
出力情報
- 保存先:
out/<動画タイトル>.pdf- 標準出力: ファイルパス
- 標準エラー出力: 進捗情報のログ
⚙️ オプションパラメータ
すべてのオプションには健全なデフォルト値が設定されています。通常は URL 指定のみで十分です。
| コマンド | 説明 | デフォルト値 |
|---|---|---|
| スクリーンショットの撮像間隔 | 秒 |
| 使用する Claude Vision モデル | |
| タブ領域検出に使用するフレームの数 | |
| 事前重複除去用のハミング距離によるコスト制御閾値 | |
| ダウンロード時の解像度上限 | |
| 中間フレームおよびクロップ結果を保持する | なし |
🔍 動作原理の詳解
ツールは以下の工程で動画を PDF に変換します。
-
ダウンロード
を使用して動画を配信に取得。yt-dlp- 必要に応じて
パラメータで高さを制約します。--max-height
-
フレーム抽出
を使用し、指定した間隔(ffmpeg
)ごとに 1 フレームずつ抽出します。--interval
-
検出(領域認識)
- サンプリングされたフレーム上に、水平方向の帯域を区切ったグリッドを生成します。
- Claude Vision に「どの帯域に楽譜が含まれているか」を報告させます。
- 外れ値対策: 中央値として最初の帯域と最後の帯域を取得し、これらを合わせて垂直方向の範囲を決定します(幅はそのまま維持)。
- 注記: 粗やかなラベル付けされた帯域を使用するのは、視覚モデルに対して正確なピクセル座標を直接尋ねるよりも信頼性が高いです。
-
クロップ
- 抽出された各フレームを、上記で検出された領域に対してシャープに切り出します。
-
事前重複除去
- **dHash(知覚的ハッシュ)**を使用して、ほぼ同一の連続するクロップをフィルタリングします。
- これは最終的なタブ判定ではなく、次のステップにおける Vision コール数を削減するためのコスト制御のみです。
-
小節番号に基づく重複除去
- 判別基準: 各行の開始位置に表示されている**小節番号(measure/bar number)**が存在するものを「楽譜」とみなします。
- 処理ロジック: 出現した順序を基準として、異なる小節番号ごとに正確に 1 枚のみを保持し(最初の出現分を選択)ます。
- 不要なフレームの削除: タブではないフレーム(タイトル画面、イントロ・アウトロなど)を排除します。
- 圧縮効果: 再生カーソルが横断中も小節番号は不変であり、楽譜ページが変わるまで変更されません。このため、ほぼ同一なカーソルフレーム群をすべて単一のページに圧縮・整理することが可能です。
-
PDF 作成
を使用して、発見された異なるタブの行順を追って A4 ページ内に縦方向に積み重ねます。pdf-lib- 動画タイトルは
から取得され、出力ファイル名・最初のページの見出し・ドキュメントメタデータのタイトルとしても採用されます。yt-dlp