Created
May 4, 2025 06:53
-
-
Save aipro-jp/bd081206dcc71dbb140369554f38259e to your computer and use it in GitHub Desktop.
youtube_transcript_apiを使用してYouTube動画の文字情報を取得する
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 必要なモジュールをインポートします | |
import sys # 標準エラー出力 (stderr) を使用するためにインポートします | |
from youtube_transcript_api import YouTubeTranscriptApi, NoTranscriptFound, TranscriptsDisabled # YouTube Transcript APIライブラリから必要なクラスと例外をインポートします | |
def get_transcript(video_id): | |
""" | |
指定されたYouTube動画IDの文字起こしを取得する関数。 | |
日本語または英語の文字起こしを優先的に取得します。 | |
Args: | |
video_id (str): YouTube動画のID。 | |
Returns: | |
str or None: 取得した文字起こしのテキスト(結合された文字列)、 | |
またはエラー発生/文字起こしが見つからない場合はNone。 | |
""" | |
try: | |
# 指定されたvideo_idの利用可能な文字起こしのリストを取得します。 | |
# これにより、その動画で利用可能な全ての言語の文字起こし情報が得られます。 | |
transcript_list = YouTubeTranscriptApi.list_transcripts(video_id) | |
# 日本語('ja')または英語('en')の文字起こしを探します。 | |
# まず自動生成された文字起こしを優先して探します。 | |
try: | |
# find_generated_transcriptは指定された言語リストの順に自動生成文字起こしを探します。 | |
# ここでは ['ja', 'en'] としているので、まず日本語、なければ英語を探します。 | |
transcript = transcript_list.find_generated_transcript(['ja', 'en']) | |
print(f"取得した文字起こしの言語: {transcript.language} (自動生成)") # 取得言語と種類を表示 | |
except NoTranscriptFound: | |
# 自動生成された日本語または英語の文字起こしが見つからない場合、 | |
# 次に手動で作成された文字起こしを探します。 | |
try: | |
# find_manually_created_transcriptは指定された言語リストの順に手動生成文字起こしを探します。 | |
transcript = transcript_list.find_manually_created_transcript(['ja', 'en']) | |
print(f"取得した文字起こしの言語: {transcript.language} (手動生成)") # 取得言語と種類を表示 | |
except NoTranscriptFound: | |
# 自動生成、手動生成のどちらでも指定した言語の文字起こしが見つからなかった場合。 | |
# エラーメッセージを標準エラー出力に表示します。 | |
print(f"エラー: 動画ID '{video_id}' の日本語または英語の文字起こしが見つかりません。", file=sys.stderr) | |
# Noneを返して処理を終了します。 | |
return None | |
# fetch()メソッドで実際の文字起こしデータ(辞書のリスト)を取得します。 | |
# 各辞書には 'text', 'start', 'duration' が含まれます。 | |
transcript_data = transcript.fetch() | |
# 文字起こしデータのリストから、各項目の 'text' の値(実際のテキスト部分)を抽出します。 | |
# リスト内包表記を使って効率的に処理します。 | |
# 抽出したテキストセグメントをスペースで結合して、一つの連続した文字列にします。 | |
# 修正: item['text'] ではなく item.text を使用します | |
transcript_text = " ".join([item.text for item in transcript_data]) | |
# 結合した文字起こしテキストを関数の結果として返します。 | |
return transcript_text | |
except TranscriptsDisabled: | |
# 指定された動画で文字起こし機能自体が無効にされている場合の例外処理です。 | |
# エラーメッセージを標準エラー出力に表示します。 | |
print(f"エラー: 動画ID '{video_id}' では文字起こしが無効になっています。", file=sys.stderr) | |
# Noneを返して処理を終了します。 | |
return None | |
except NoTranscriptFound: | |
# list_transcriptsで文字起こしリスト自体が見つからなかった場合など、 | |
# 何らかの理由で文字起こしが存在しない場合の例外処理です。 | |
# (内部のtry-exceptで捕捉されなかった場合や、list_transcripts自体が失敗した場合など) | |
# エラーメッセージを標準エラー出力に表示します。 | |
print(f"エラー: 動画ID '{video_id}' の文字起こしが見つかりません。", file=sys.stderr) | |
# Noneを返して処理を終了します。 | |
return None | |
except Exception as e: | |
# 上記以外の予期しないエラー(ネットワークエラー、APIの変更など)が発生した場合の例外処理です。 | |
# エラーの種類と内容を標準エラー出力に表示します。 | |
print(f"文字起こし取得中に予期しないエラーが発生しました ({type(e).__name__}): {e}", file=sys.stderr) | |
# Noneを返して処理を終了します。 | |
return None | |
# このスクリプトがPythonインタープリタによって直接実行された場合にのみ、以下のコードブロックが実行されます。 | |
# `python youtube_transcript.py` のように実行した場合に該当します。 | |
if __name__ == "__main__": | |
# --- テスト実行 --- | |
# テストに使用するYouTube動画のIDを設定します。 | |
test_video_id = "xxxxxxxxxxxxx" | |
# 設定した動画IDを使って get_transcript 関数を呼び出します。 | |
print(f"動画ID '{test_video_id}' の文字起こしを取得します...") | |
transcript_result = get_transcript(test_video_id) | |
# get_transcript 関数から結果が返ってきたか(Noneでないか)を確認します。 | |
if transcript_result: | |
# 文字起こしが正常に取得できた場合、その内容を表示します。 | |
print("\n--- 取得した文字起こし ---") | |
print(transcript_result) | |
print("------------------------") | |
else: | |
# 文字起こしが取得できなかった場合(Noneが返ってきた場合)、その旨を表示します。 | |
print("文字起こしの取得に失敗しました。エラーメッセージを確認してください。") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment