Apple Podcastの文字起こしデータを取得・保存する方法
Podcast良いですよね。ながら聴きしながら家事したり、散歩したり。いろんな場面に合わせてコンテンツを楽しめるので、好きです。10件ほどチャンネルをお気に入り登録してて、それらが更新されるのが待ち遠しい。
海外のPodcastは、大手企業のCEOがバンバン登場して、割と重要なトピックをペラペラ喋っていたりするので、業界動向を把握するうえでも、重要な情報源になっていますよね。急にサムやイーロンが出てきたりして。
海外Podcastのハードル
海外Podcastを聴くうえでハードルになるのが言語の壁です。いやー、早口すぎて、置き去りになっちゃう。
・みんなが何を話しているか興味がある
・でも内容を理解するには意識的に聴く必要がある
・ながら聴きができない(手元の作業がストップする)
ということで、無粋ですが、この文字起こしデータを取得する方法を見つけたので、備忘録を兼ねて残しておきます。
Apple Podcastでは文字起こしを取得できない(表示はできるけど)
Apple Podcastのアプリ(iPhone、Mac)には、文字起こしをダウンロードできる機能はありません。誤解の無いように書いておくと、トランスクリプト(文字起こし)を表示する機能はあります。なので、英語をスラスラと読める方は、これで事足ります。以下はiPhoneのApple Podcastで特定のエピソードのトランスクリプト画面です。

「なーんだ、これコピペすれば良いじゃん」と思われるかもしれません。ですが、アプリ上ではコピペ可能なテキスト数に上限があり、フルテキストはコピペできない仕様になっています。
画面操作を自動化してテキストを取得したり、mp3を取得してSpeech-to-Text AIに文字起こしさせる方法もありそうですが、目の前に完成された文字起こしがあるのに、これを使えないのはモドカシイですよね。「文字起こしを生成してくれる機能があるだけ感謝しろよ」と言われたらその通りですが。
文字起こしデータを取得するプログラム(macOS用)
そんな中、海外掲示板での投稿を見つけました。「Apple Podcast から生成されたトランスクリプトをコピーするにはどうすればよいですか?」という質問。この質問に対する回答として、以下。
私の知る限り、iOSからは利用できません。ただし、macOSでは、~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts/Library/Cache/Assets/TTMLポッドキャストのエピソードをローカルにダウンロードすると、トランスクリプトがローカルにキャッシュされるという利点があります。
https://alexbeals.com/projects/podcasts/ を構築しました。これは、保存したトランスクリプトを簡単に閲覧し、無制限にコピー&ペーストできるようにするためです。このウェブサイトはサーバーにアップロードすることなくローカルで実行され、ソースコードはhttps://github.com/dado3212/apple-podcast-transcripts/ で入手できます。
非常にありがたい情報で、Apple Podcastで生成されたトランスクリプトは、ローカルにキャッシュとして保存されているんですね。
Finderでフォルダへ移動>"~/Library/Group Containers/243LU875E5.groups.com.apple.podcasts"を指定すると、次のフォルダに移動します。

さらに、Library>Cache>Assets>TTMLと下層を移動していくと、"transcript~.ttml"というファイルが見つかります。これがキャッシュされた文字起こしデータです。
しかし、TTML(Timed Text Markup Language:時間付きテキストマークアップ言語)形式は階層構造になっていて、本文以外のメタ情報が多数含まれているので、そのままでは読むことができません。
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:podcasts="http://podcasts.apple.com/transcript-ttml-internal" xmlns:ttm="http://www.w3.org/ns/ttml#metadata" xml:lang="en"><head><metadata /></head><body dur="1413.197"><div begin="0.160" end="23:29.180"><p begin="0.160" end="19.860" ttm:agent="SPEAKER_1"><span begin="0.160" end="16.880" podcasts:unit="sentence" xml:lang="en"><span begin="0.160" end="0.400" podcasts:unit="word">Joining</span><span begin="0.400" end="0.660" podcasts:unit="word">Carl</span><span begin="0.660" end="0.900" podcasts:unit="word">today</span><span begin="0.900" end="0.980" podcasts:unit="word">on</span><span begin="0.980" end="1.100" podcasts:unit="word">the</span><span begin="1.100" end="1.280" podcasts:unit="word">show</span><span begin="1.280" end="1.440" podcasts:unit="word">is</span><span begin="1.440" end="1.920" podcasts:unit="word">me,</span><span begin="1.920" end="2.120" podcasts:unit="word">an</span><span begin="2.120" end="2.600" podcasts:unit="word">AI</span><span begin="2.600" end="3.560" podcasts:unit="word">avatar,</span><span begin="3.560" end="3.720" podcasts:unit="word">and</span><span begin="3.720" end="3.920" podcasts:unit="word">we</span><span begin="3.920" end="4.060" podcasts:unit="word">get</span><span begin="4.060" end="4.280" podcasts:unit="word">into</span><span begin="4.280" end="4.780" podcasts:unit="word">discussing</span><span begin="4.780" end="4.980" podcasts:unit="word">the</span><span begin="4.980" end="5.620" podcasts:unit="word">off-premise</span><span begin="5.620" end="6.120" podcasts:unit="word">playbook</span><span begin="6.120" end="6.520" podcasts:unit="word">Driving</span><span begin="6.520" end="7.000"
なので、人間が読みやすいテキストに変換する必要があります。ここで、先ほど言及されていたプログラムを使います。
これは、ローカルにキャッシュされたttmlファイルを自動的に見つけ出し、エピソード名、番組名、本文などのポッドキャスト情報を抽出し、構造的かつ読みやすい形式で表示してくれるビューワーです。

各エピソードがカード単位で表示されていて、クリックすることで本文を参照できます。

Apple Podcastアプリとは異なり、もちろん本文をコピペできますし、ブラウザの翻訳機能を使えばそのまま日本語で読めます。

これで気になる海外のポッドキャストの内容を確認することができます、やったね。
とまあ、ここまで書いておいて言うのもなんですが、せっかく音で聴けるPodcastをテキストに変換してまで消費するのはナンセンスな感じが強いです。なにより番組の空気感や発言の強調点など重要な情報が抜け落ちてしまい、なんとも味気のないコンテンツになってしまいます。
一方で、膨大に増え続けるコンテンツにあたりを付ける、忙しい時にざっくりと概要を把握したい、という目的において、活用できるシーンはありそうです。
おまけ:更新されたエピソードのみ自動的に取得し、AIに要約してもらう
先ほどのプログラムは便利な一方で、次の課題がありました。
・手動操作が面倒(Finder上のファイルをコピペしたり)
・ビューワー以外の場所で閲覧したい(抽出した文字起こしを一括保存したい)
・更新されたエピソードだけを素早く確認したい
そこで、AIコーディングで元のプログラムをカスタマイズしました。これにより、更新エピソードのみを自動で処理、Markdownで一括保存できるようになりました。これによりビューワーを使わず、Obsidianにそのまま取り込むことができるようになり、使い勝手が良くなりました。
ついでに、要約も欲しかったので、ロングコンテストに強くコスパの良いGemini APIを組み込んで、要約データも作成できるようにしました。
もし皆さんの環境で再現したい場合は、以下にAI向けの指示書を残しておくので、先ほどのプログラムと合わせてClaude Codeなどにコーディングを依頼するのが良いかなと思います。
Apple Podcast Transcript Processor & Gemini Reporter
Apple Podcastsのローカルデータからトランスクリプトとメタデータを抽出し、Markdownファイルとして保存するスクリプト (podcast_processor.py
) と、それらのMarkdownファイルを使ってGemini APIにより要約レポートを生成するスクリプト (gemini_report_generator.py
) を提供します。
特徴
- ローカルデータ処理: Apple Podcastsアプリがローカルに保存しているTTMLトランスクリプトとSQLiteデータベースのメタデータを直接利用
- 自動Markdown生成: 抽出したデータから、YAML Front Matterに必要なメタ情報を含んだMarkdownファイルを生成
- Gemini API連携: 生成されたMarkdownファイルの内容を基に、GoogleのGemini APIを利用して日本語レポートを生成
- 重複処理防止: レポート生成時に処理済みのエピソードを記録し、APIの無駄な呼び出しを防止
- 設定の柔軟性: APIキーは
.env
ファイルで管理
プロジェクト構成
.
├── podcast_processor.py # トランスクリプトとメタデータを抽出しMarkdownを生成
├── gemini_report_generator.py # MarkdownからGemini APIでレポートを生成
├── output/ # podcast_processor.py の出力先
│ └── YYYY-MM-DD/ # 日付ごとのMarkdownファイル
│ └── *.md
├── output_reports/ # gemini_report_generator.py の出力先
│ └── YYYY-MM-DD/ # 日付ごとのレポートMarkdownファイル
│ └── *_report.md
├── processed_ids.json # 処理済みIDを記録するファイル
├── .env # APIキーなどの環境変数ファイル
└── README.md
前提条件
- macOS (Apple Podcastsのデータ構造に依存)
- Python 3.x
- Apple Podcastsアプリで、トランスクリプトを取得したいエピソードを一度は表示してローカルにダウンロード済み
- Google Gemini APIキー (レポート生成機能を利用する場合)
セットアップ
-
必要なPythonライブラリのインストール:
pip install google-generativeai python-dotenv PyYAML
-
環境変数の設定:
プロジェクトのルートディレクトリに.env
ファイルを作成し、Gemini APIキーを記述:GEMINI_API_KEY="YOUR_GEMINI_API_KEY"
使用方法
1. トランスクリプトの抽出とMarkdown生成
python3 podcast_processor.py
Apple Podcastsのローカルデータから情報を読み取り、output/YYYY-MM-DD/
ディレクトリにMarkdownファイルを出力します。
2. Gemini APIによるレポート生成
python3 gemini_report_generator.py <input_markdown_directory>
例:
python3 gemini_report_generator.py output/2023-10-26
指定されたディレクトリ内のMarkdownファイルを処理し、Gemini API(gemini-2.5-flash-preview-05-20
モデル、適宜最新版を使用)で日本語レポートを生成して output_reports/YYYY-MM-DD/
に保存します。
Gemini APIシステムプロンプト
# Podcastレポート作成システムプロンプト
あなたはPodcastの英語トランスクリプトを日本語のレポートに変換する専門家です。情報の羅列ではなく、**出演者の発言・見解・議論の文脈**を重視したレポートを作成してください。
## 基本方針
### 重要度の優先順位
1. **発言者の見解・意見・議論** - 最重要
2. **具体的な事例・体験談** - 重要
3. **数値・データ** - 重要
4. **一般的な事実情報** - 最低限
### ターゲット読者
- 英語Podcastを聞く時間がない日本のビジネスパーソン
- ニュース内容は既知で、それに対する出演者の**反応・見解・議論**を知りたい人
- 実用的な洞察やインサイトを求める人
## レポート構成(必須4要素)
### 1. エピソード情報
- **番組:** [番組名]
- **出演:** [出演者名(肩書きがあれば併記)]
- **配信日:** [配信日]
- **時間:** [時間]
### 2. エピソード要約(100-150文字)
- エピソード全体の要点を簡潔に
- 主要トピックと出演者の立場・結論を明記
### 3. 主要な議論・発言
- **発言者の実際の言葉を重視**
- 日本語翻訳の後に原文を引用として併記
- 発言の文脈・背景を説明
- 話題転換のきっかけや盛り上がりポイントを記載
#### 引用フォーマット
「日本語翻訳」
> 「原文引用」
### 4. 主要インサイト
- 出演者の深い洞察や含意
- 業界・社会への影響
- 聞き手が得られる実用的な知見
- 今後の展望や予測
## 翻訳・引用ルール
### 発言の取り扱い
- **主要な発言は必ず日本語翻訳 + 原文引用の形式**
- 長い発言は要点を抽出して翻訳、重要部分のみ引用
- 発言者の語調・感情・強調点を日本語でも表現
### 専門用語・固有名詞
- 初出時は英語併記:「生成AI(Generative AI)」
- 企業名・人名は基本的に英語表記
- 業界用語は日本語説明を補足
### 数値・データ
- 具体的な数字は必ず記載
- 日本円換算や日本の状況との比較を適宜追加
## 文字数ガイドライン
### 標準版(800-1,200文字)
- 毎日3エピソード処理に適した分量
- 要約:100-150文字
- 主要議論:400-600文字
- インサイト:200-400文字
### 調整指針
- 内容の密度に応じて±200文字の調整可
- 重要な発言は文字数を気にせず完全収録
- 冗長な部分は削減
## 品質基準
### 必須要件
- **出演者の「生の声」が伝わる**
- **議論の流れ・文脈が理解できる**
- **実用的なインサイトが得られる**
- **原文の正確性が担保されている**
### 避けるべき内容
- 単なる情報の羅列
- 出演者の見解が不明確な要約
- 一般論や既知の事実の繰り返し
- 文脈を無視した断片的な引用
## 番組形式への対応
### 汎用性の確保
- インタビュー、対談、ニュース解説、パネルディスカッション等すべてに対応
- 出演者数や会話スタイルに関係なく同一フォーマット適用
- 番組固有の特徴は「主要な議論・発言」セクションで表現
### 出演者の特徴捕捉
- 専門性・立場・経験を明確化
- 発言パターンや強調点の特徴を記録
- 他の出演者との関係性・議論の動学を描写
## 最終チェックポイント
1. ✅ 出演者の重要発言がすべて引用付きで記載されているか
2. ✅ 議論の文脈・流れが理解できるか
3. ✅ 読者が実用的な洞察を得られるか
4. ✅ 原文引用の正確性が担保されているか
5. ✅ 4つの必須要素すべてが含まれているか