動画/音声の「話し言葉」をテキストにします。ここには血と汗の染み込んだ固定ルートがあります。順番を厳守し、ステップ0を賢しらにすっ飛ばさないでください。
鉄則(これが最も重要、最初に覚えること)
常に「既存字幕」を探せ。本当にない場合のみ「音声認識」を使え。 まともな講演、カンファレンス、ポッドキャストのほとんどはYouTubeにアップロードされており、YouTubeにはほぼ必ず字幕がついています。たった1コマンドで数秒で字幕を取得でき、無料、動画全体をダウンロードせず、GPUも使いません。
今日、この近道を選ばず、愚かにも450MBの動画をダウンロードし、CPUで30分間音声認識を実行し、しかも誤字だらけの結果を得ました。この轍は二度と踏ませません。
ステップ0 リンクを入手したら、まず2つのことを区別し、それから順番を決める
テキスト化(この動画の文字起こしが欲しい)と出典調査(誰が話しているのか、元の動画はいつ公開されたのか、完全版かどうか)は別のタスクです。一緒にしないでください。旧バージョンでは「Xのリンクを見たら無条件でYouTubeを探す」という間違いを犯していました。X自体にも字幕がついていることが多く、YouTubeへの無駄足になるからです。
テキスト化:常に今持っているリンク自体の字幕を先に調べること。最初からYouTubeに行く必要はない。
- 直接grab.pyを実行——スクリプトがまずそのリンク自体の字幕を取得します(Xにはen/esなどの字幕がよくあります)。取れれば終了。これが最速の近道です。
- 以下の2つの場合のみ、元の動画を探しにYouTubeに行く価値がある:
- Xに字幕がまったくない(YouTubeにはある可能性が高い)。
- X上の動画が切り抜きである——元の長い動画を参照しているが、Xの投稿は1〜2分だけ(それだけを取得しても断片に過ぎない。全編が必要なら元の動画を探す)。 探し方:「話者 + テーマ/タイトル + イベント名」でYouTubeの元動画を検索し、それを使ってステップ1に進む。
再生時間が物語る: 先に
yt-dlp --no-download --print "%(duration_string)s"で長さを確認すること。Xの切り抜きと説明の長さが一致している(「28分」と言っているのに実際27分)=完全転載、そのまま取得。大幅に短い=切り抜き、元動画を探すべし。
出典調査(誰が/いつ話したのか/完全かどうか)は別タスク。ユーザーが尋ねた場合のみ実行。テキスト化の必須ステップではない。 しかも、十分な情報が得られたらそこで止めること:ユーザーの質問に答えられる情報が得られたら、正確な日付や公式版など、ユーザーが要求していない精度を追求して繰り返し検索しないでください(2026-07-22 にこの罠にはまりました)。
ステップ1 ワンコマンドでスクリプト実行(字幕か音声認識かを自動判断)
python "C:/Users/Administrator/.claude/skills/视频转文字/scripts/grab.py" "<リンクまたはローカルファイル>" "出力フォルダ名" [言語]
第3引数【言語】はオプション:中国語動画なら zh(強制的に中国語+簡体字出力)、英語なら en、省略時は自動判定。
スクリプト内部ロジック(固定):
- まず既存字幕を取得 → 成功すれば即座に
完全文字稿.txtを出力、終了。 - 字幕が取得できない → 自動で音声を抽出し、GPUで音声認識を実行(CPUではない)。
- 成果物はすべてデスクトップの
<出力フォルダ名>に格納:完全文字稿.txt(クリーンなプレーンテキスト)+ 元の字幕/字幕ファイル。
実行後、完全文字稿.txt の場所と単語数をユーザーに報告するだけでよい。
Bilibili / 国内サイト(YouTubeとは異なる点を個別に記録)
- ダウンロード可能:ダウンロードツールはBilibili(B站)および多くの国内サイトをサポートしています。動画/音声の取得は問題ありません。
- しかし「既存字幕を取得する」という無料の近道は基本的に期待できない:BilibiliにはYouTubeのような全動画の機械字幕はなく、一部のUP主が手動でCC字幕をアップロードしている場合だけ取得可能です。弾幕は字幕ではありません(弾幕は視聴者のコメントであって台詞ではありません)。弾幕を取得しようとしないでください。
- そのため、Bilibiliの動画はほとんどの場合、直接「GPU音声認識」を使う。中国語動画の場合は第3引数に
zhを指定してください:python ".../grab.py" "<Bilibiliリンク>" "出力フォルダ名" zh - 中国語精度に関する注意:現在は小規模(small)モデルを使用しています。中国語は「大体聞き取れる」程度で、誤字が発生しやすいです。より正確にするには中規模(medium)モデル(約1.5GB、一度ダウンロード、現在未インストール)に交換する必要があります。ユーザーは2026-07-21に「とりあえず小モデルで我慢する」と選択しました。より正確さが必要になった時点でmediumをインストールし、スクリプトの
--model smallをmediumに変更してください。 - ログイン:Bilibiliのメンバー限定/高画質/ログイン必須動画は、ダウンロード時にアカウントのCookieが必要です。そのような場合は先にユーザーに確認し、無断でアカウントを操作しないでください。
リンクを取得できない動画(WeChat Video Channel / 有料暗号化ページ / 画面上でしか再生できないもの)→ 画面音声を録音
ダウンロードツールがこれらの動画にアクセスできない場合(Video Channelはアプリ内に閉じ込められている、有料ページは暗号化されている)の唯一の一般的な方法:動画を再生しながら、同時にPCの出力音声を録音し、それをテキスト化する。このマシンには内部録音機能(soundcardライブラリ、ドライバ不要/設定不要)がインストール済みです。
3ステップ:
- 録音開始(バックグラウンドで実行、停止するまで録音):
python "C:/Users/Administrator/.claude/skills/视频转文字/scripts/record.py" "出力フォルダ名" - 動画を最初から最後まで再生(リアルタイム録音。3時間の動画なら3時間かかります。早送り不可)。
- 録音プロセスを停止(エージェントがバックグラウンドタスクを強制停止しても問題ありません)。その後、
录音.pcmをgrab.pyに直接渡してテキスト化します(pcm形式を認識します。中国語の場合はzhを追加):python "C:/Users/Administrator/.claude/skills/视频转文字/scripts/grab.py" "<デスクトップパス>/<フォルダ>/录音.pcm" "<フォルダ>" zh
- 録音中は随時ディスクに書き込まれるため、途中で強制終了してもデータ全体が失われることはありません(pcmは常に存在し、後処理に依存しません)。
- リンクを取得できるなら録音を使うな:ダウンロードは数分で完了するが、録音は動画の全長と同じ時間がかかる。録音は本当にリンクを取得できない場合のみに限定すること。
ステップ2 音声認識を使った場合のみ気にすること
- 必ずGPUを使用すること:このマシンにはNVIDIA GTX 1060(5GB VRAM)が搭載されており、スクリプトは自動的にGPUを優先します。もしログに「CPU」と表示された場合、「GPU対応torch」がまたCPU版に戻っていることを意味します。以下の【GPU環境】セクションに従って修復してください。
- 動画が長い(>20分)場合、処理に時間がかかるのは正常です。ただしGPU使用時は数分以内で完了するはずです。もし30分もかかるようであれば、確実にCPUにフォールバックしています。
- 音声認識には誤字/脱落がつきものです。「大体聞き取る」程度の精度であり、ネイティブ字幕には及びません。字幕を取得できる場合は音声認識を使わないでください。
GPU環境(音声認識に必須。壊れたらここを直せ)
音声認識にGPUを使用するには、「GPU対応」のtorchがインストールされている必要があります。セルフチェック:
C:/Users/Administrator/portable-python311/runtime/python.exe -c "import torch;print(torch.__version__, torch.cuda.is_available())"
...+cu126 Trueと表示 = 正常、GPU使用可能。...+cpu Falseと表示 = CPUのみの状態に戻っている。再インストール:
C:/Users/Administrator/portable-python311/runtime/python.exe -m pip install --force-reinstall torch==2.11.0 --index-url https://download.pytorch.org/whl/cu126
(ドライバCUDA 12.6 → cu126ソースを使用。この5GB GPUは音声認識/OCR/中小モデルを実行可能。8GB VRAM以上が必要な大規模モデルは非対応。)
よく使う手動コマンド(スクリプト以外、参考用)
- 字幕言語を確認:
yt-dlp --no-download --list-subs "<url>" - 英語字幕のみを動画なしでダウンロード:
yt-dlp --skip-download --write-auto-subs --sub-langs "en-orig,en.*" --convert-subs srt -o "%(title)s.%(ext)s" "<url>" - 再生時間/公開日を確認:
yt-dlp --no-download --print "%(title)s | %(duration_string)s | %(upload_date)s" "<url>"