解決する課題
話し言葉、コードスイッチング、低資源言語を研究する研究者は、自然な会話データを十分に見つけるのに苦労しています。多くの動画には字幕がなく、存在する字幕も品質の異なる人手と自動のものが混在しています。多くの言語を扱え、各文字起こしの出所を記録できる一貫したパイプラインが必要です。
最初のバージョンに含めるべき機能
- 動画ごとの利用可能な字幕言語の検出
- 字幕のない動画向けの99言語対応AI音声認識
- 複数言語が混ざる話し言葉のためのコードスイッチング対応
- アライメント用の単語単位タイムスタンプ
- すべての文字起こしの言語と字幕ソースのメタデータ
開発手順(ステップごとに解説)
- 01
候補動画を探す
対象言語を扱うことがわかっているチャンネルや再生リストを解決し、/transcripts/{video_id}/languagesを呼び出して存在する字幕トラックを確認します。
- 02
可能な場合は字幕を使う
手動字幕が存在する場合はそれを取得します。通常、最も正確だからです。
- 03
音声認識で空白を埋める
字幕のない動画では、言語を指定または自動検出してASRをリクエストし、複数言語が混ざる話し言葉にはcodeSwitchingを有効にします。
- 04
アライメントデータとともに保存する
format.wordsをリクエストして単語単位のタイムスタンプを取得し、各文字起こしの言語とソースをテキストと一緒に保存します。
サンプルコード
このアイデアは「レシピ3:再生リストをナレッジベースに一括登録」パターンをベースにしています。チャンネル、プロンプト、保存先はご自身のものに置き換えてください。
import requests
API = "https://www.youtubetranscript.dev/api/v2"
HEADERS = {"Authorization": "Bearer yt_sk_live_YOUR_KEY"}
playlist = requests.post(f"{API}/playlists/resolve", headers=HEADERS,
json={"playlist_url": "https://www.youtube.com/playlist?list=PLAYLIST_ID",
"limit": 100}).json()
ids = [v["video_id"] for v in playlist["items"]]
batch = requests.post(f"{API}/batch", headers=HEADERS, json={
"video_ids": ids,
"format": {"timestamp": True, "paragraphs": True},
}).json()
# Large batches run async: poll GET /batch/{batch_id} until status is "completed"
for r in batch.get("results", []):
if r["status"] == "completed":
for p in r["data"]["transcript"].get("paragraphs") or []:
store(video_id=r["video_id"], start=p["start"], text=p["text"]) # your vector DB作る価値がある理由
研究室やAIチームは、本来は収集コストの高い言語で評価・研究データを得られます。特定の言語や分野に特化した、整理され文書化されたデータセットは、モデル開発者にとっても価値があります。
避けるべき失敗
- 自動字幕を正解データとみなすこと:ソースをラベル付けし、サンプルを手作業で検証しましょう。
- メタデータなしで方言を混在させること:結果を解釈できるよう、チャンネルと地域を記録しましょう。
- ライセンスを見落とすこと:データセットを再配布する前にプラットフォーム規約と著作権を確認しましょう。
このアイデアに関する質問
音声認識は何言語に対応していますか?
AI音声認識は99言語に対応しており、言語の自動検出と、複数言語が混ざる話し言葉向けのオプションのコードスイッチングに対応しています。
単語単位のタイムスタンプは取得できますか?
はい。format.wordsをリクエストすると各単語のタイミングを取得でき、アライメントや音声学の研究に役立ちます。
YouTubeから作ったデータセットを再配布できますか?
YouTubeの規約、著作権法、所属機関のポリシーによります。多くの研究者は、文字起こしそのものではなく動画IDとコードを共有しています。