Web上の英語動画から音声を抽出してWhisperで文字起こし→日本語翻訳をやってみた
はじめに
IT技術の学習において、英語の動画コンテンツは非常に価値の高い情報源です。しかし、時には翻訳機能が備わっていなかったり、字幕がつけれないプレイヤーで視聴する機会もあるかと思います。
このような字幕がない英語動画を理解するのは、特に専門用語が多い技術分野では困難を伴います。
今回は、Web上に埋め込まれた英語の技術動画から音声を抽出し、OpenAI Whisperを使って文字起こしを行い、さらに日本語翻訳まで実現する方法を試してみました。
ただし、動画は著作権が存在することがほとんどなので取り扱いには十分注意しましょう。
今回のブログ記事においては、具体的な手順のみをお伝えしていきます。
この記事では、以下の流れで実際に検証した手順を共有します:
- デベロッパーツールを使った動画URLの特定
- yt-dlpによる音声ファイルの抽出
- OpenAI Whisperでの文字起こし
- 精度の高い日本語翻訳の実現
基本的に無料で実現することを優先しつつ、翻訳の精度を考慮してコストを最小限に抑えた方法で実現していきたいと思います。
前提条件と環境準備
必要なツール
- Python 3.8以上
- yt-dlp
- OpenAI Whisper
- 翻訳API(今回はDeepL Free APIを使用)
環境構築
まず、必要なパッケージをインストールします。
# yt-dlpのインストール
pip install yt-dlp
# OpenAI Whisperのインストール
pip install git+https://github.com/openai/whisper.git
# DeepL APIリクエスト時のHTTP通信
pip install requests
DeepL API Free の登録とAPI Keyの取得
DeepL にアクセスして 無料ではじめる
を選択します。
DeepL API Free
で登録します。
APIキーと制限
の APIキー
をコピーします。
ローカルのプロンプトで環境変数としてコピーした APIキー
を設定します。
export API_DEEPL="<APIキー>"
手順1: デベロッパーツールを使った動画URLの特定
m3u8形式の動画URLを見つける
動画の抽出で利用する yt-dlp
は、Webページから動画URLを自動で認識して取得可能ですが、条件によって失敗することもあり、その場合は動画URLを指定します。
今回は動画URLを特定してから抽出します。
- 対象の動画が表示されているWebページを開く
- ブラウザのデベロッパーツール(cmd + opt + i)または(F12)を開く
- 「Network」タブに移動
- 動画が埋め込まれたページに遷移、または動画を再生
- フィルターで「m3u8」を検索
Web上に埋め込まれた動画の多くは、HLS(HTTP Live Streaming)形式で配信されており、その場合は m3u8
ファイルを使用しています。
フィルタは「Media」または「XHR」を指定すると効率よく見つけれます。
その他の形式の動画のときもあるので、.mp4
、.mpd
、.ts
などのファイル拡張子で検索してみるのも有効です。
URLの確認と保存
見つかったm3u8ファイルのURLを右クリックして「Copy link address」でURLをコピーします。このURLが後の手順で使用する動画のソースURLになります。
例: https://example.com/video/playlist.m3u8
手順2: yt-dlpによる音声ファイルの抽出
yt-dlpの基本的な使用方法
yt-dlpは、YouTube以外の様々な動画サイトからも動画をダウンロードできる強力なツールです。
基本的なダウンロードコマンドは以下のようにします。
# 基本的なダウンロードコマンド
yt-dlp "<VIDEO_URL>"
音声のみを抽出する設定
今回は文字起こしが目的なので、音声ファイル(mp3形式)のみを抽出します。
# 音声のみをmp3形式で抽出
# 実際は動画ファイルが存在しないURLですが、本記事においては例として以下のURLで進めていきます
yt-dlp -x --audio-format mp3 "https://example.com/video/playlist.m3u8" -o awesome-contents.mp3
ローカルに音声ファイル(MP3)が出来ていれば成功です。
主要なオプションの説明:
-x
: 音声のみを抽出--audio-format mp3
: 出力形式をmp3に指定-o
: ファイル名の形式を指定
コマンドオプションの参考資料:
手順3: OpenAI Whisperでの文字起こし
Whisperの基本的な使用方法
OpenAI Whisperは、高精度な音声認識を無料で利用できる優れたツールです。
Python で抽出するためのコードを用意します。
import whisper
import os
audio_file_path = "awesome-contents.mp3" # ここを実際のファイル名に置き換えてください
if not os.path.exists(audio_file_path):
print(f"エラー: 音声ファイル '{audio_file_path}' が見つかりません。パスを確認してください。")
else:
# Whisperモデルをロード
print("Whisperモデルをロード中...")
model = whisper.load_model("base")
# 文字起こしを実行
# language="en" で英語の文字起こしを明示的に指定
print(f"'{os.path.basename(audio_file_path)}' の文字起こしを開始します...")
result = model.transcribe(audio_file_path, language="en", verbose=True)
# 結果を表示・保存します
print("\n--- 文字起こし結果 ---")
print(result["text"])
# 結果をテキストファイルに保存
output_filename = os.path.splitext(audio_file_path)[0] + "_transcription.txt"
with open(output_filename, "w", encoding="utf-8") as f:
f.write(result["text"])
print(f"\n文字起こし結果を '{output_filename}' に保存しました。")
このPythonスクリプトの audio_file_path
を値を適切なものにして実行すると、音声ファイルを英語で文字起こしをしてテキストファイルが生成されます。
モデルサイズの選択
Whisperには複数のモデルサイズがあります:
モデル | サイズ | 精度 | 処理速度 |
---|---|---|---|
tiny | 39MB | 低 | 高速 |
base | 74MB | 中 | 中速 |
small | 244MB | 中高 | 中速 |
medium | 769MB | 高 | 低速 |
large | 1550MB | 最高 | 最低速 |
今回、上記のスクリプト内では base
を選択していますが、状況に合わせて精度や処理速度のバランスをとるように設定します。
model = whisper.load_model("base")
手順4: DeepL APIで日本語翻訳
翻訳方法の比較検討
翻訳方法については様々なAIがありますが、今回は無料〜低コストの無料〜低コストで利用できる翻訳方法を比較しました。
最新の生成AIモデルなどが使える場合は、精度に関してはそちらを積極的に使っていくのがおすすめです。
方法 | コスト | 精度 | API制限 |
---|---|---|---|
Google Translate(無料版) | 無料 | 中 | あり |
DeepL API Free | 無料 | 高 | 月50万文字 |
OpenAI GPT-3.5 Turbo | 有料(低額) | 高+ | トークン課金 |
DeepL API Freeを使用した翻訳
APIの制限があるものの精度とコストのバランスを考慮し、DeepL API Freeを選択しました。
DeepLの翻訳処理を前のスクリプトに追加実装します。
※事前準備でAPIキーを環境変数に渡しているか再度確認してください
import whisper
import os
import requests
# 環境変数からDeepLのAPI KEYを受け取ります
auth_key = os.getenv('API_DEEPL')
audio_file_path = "awesome-contents.mp3" # ここを実際のファイル名に置き換えてください
if not os.path.exists(audio_file_path):
print(f"エラー: 音声ファイル '{audio_file_path}' が見つかりません。パスを確認してください。")
else:
# Whisperモデルをロード
print("Whisperモデルをロード中...")
model = whisper.load_model("base")
# 文字起こしを実行
# language="en" で英語の文字起こしを明示的に指定
print(f"'{os.path.basename(audio_file_path)}' の文字起こしを開始します...")
result = model.transcribe(audio_file_path, language="en", verbose=True)
# 結果を表示・保存します
print("\n--- 文字起こし結果 ---")
print(result["text"])
# 結果をテキストファイルに保存
output_filename = os.path.splitext(audio_file_path)[0] + "_transcription.txt"
with open(output_filename, "w", encoding="utf-8") as f:
f.write(result["text"])
print(f"\n文字起こし結果を '{output_filename}' に保存しました。")
# ここから翻訳処理を行います
def translate_with_deepl(text, auth_key):
"""
DeepL APIを使用してテキストを翻訳
"""
url = "https://api-free.deepl.com/v2/translate"
params = {
'auth_key': auth_key,
'text': text,
'source_lang': 'EN',
'target_lang': 'JA'
}
response = requests.post(url, data=params)
if response.status_code == 200:
result = response.json()
return result['translations'][0]['text']
else:
print(f"エラー: {response.status_code}")
return None
# 翻訳を開始
japanese_text = translate_with_deepl(result["text"], auth_key)
# 翻訳結果を表示・保存します
print("\n--- 翻訳結果 ---")
print(japanese_text)
ja_output_filename = "ja_" + output_filename
with open(ja_output_filename, "w", encoding="utf-8") as f:
f.write(japanese_text)
print(f"\n翻訳結果を '{ja_output_filename}' に保存しました。")
これでローカルに英語の文字起こしテキストと、それを元に翻訳した日本語の文字起こしテキストファイルができるかと思います。
実際の検証結果
処理時間とコスト
実際に29分50秒の英語動画で試した結果、以下の処理時間で実行することができました。
- 音声抽出: 約1秒
- 文字起こし: 1分37秒
- 翻訳: 約3秒
文字起こしのところで若干時間がかかっていますが、Faster Whisper
といったWhisperの派生で超高速なモデルも登場しています。
実行環境などで気をつける点はありますが、格段に処理速度があがりそうです。
その際は下記の記事などもご参考いただけるとよいかと思います。
まとめ
今回は、Web上の英語動画から音声を抽出し、OpenAI Whisperで文字起こしを行い、DeepL APIで日本語翻訳するまでの一連の流れを検証しました。
データソースが英語音声しかなく、日本語でも正しい理解がしたいと思った時に活用いただけると幸いです。