👋

Azure OpenAI Whisper + Speech Services で動画に英語字幕・音声を自動生成する

に公開

日本語の動画に英語字幕と英語音声を自動で付与する方法をまとめました。Azure OpenAI ServiceのWhisperとSpeech Servicesを使用します。

概要

今回の目的は、日本語音声の動画を以下のように多言語対応させることです:

  • 日本語版: 元の動画(日本語音声、字幕なし)
  • 英語版: 英語音声 + 英語字幕

使用サービス

サービス 用途
Azure OpenAI Service (Whisper) 日本語音声 → 英語テキストへの翻訳
Azure Speech Services (TTS) 英語テキスト → 英語音声の合成
FFmpeg 音声抽出・動画結合

手順

1. 環境準備

必要なツール

# FFmpegのインストール(macOS)
brew install ffmpeg

# Pythonライブラリ
pip install python-dotenv requests

Azure設定(.env)

AZURE_OPENAI_ENDPOINT=https://xxxxx.openai.azure.com
AZURE_OPENAI_API_KEY=your-api-key
AZURE_OPENAI_DEPLOYMENT_NAME=whisper
AZURE_OPENAI_API_VERSION=2024-06-01

2. 動画から音声を抽出

Azure Whisper APIには25MBのファイルサイズ制限があるため、音声を圧縮して抽出します。

ffmpeg -i input.mp4 -vn -acodec libmp3lame -b:a 64k -ar 16000 audio.mp3

3. Whisperで英語字幕を生成

Azure OpenAI ServiceのWhisper APIを使用して、日本語音声を英語に翻訳しながら文字起こしします。

import requests

url = f"{AZURE_ENDPOINT}/openai/deployments/whisper/audio/translations?api-version=2024-06-01"

headers = {
    "api-key": AZURE_API_KEY,
}

with open("audio.mp3", "rb") as audio_file:
    files = {"file": audio_file}
    data = {"response_format": "srt"}  # SRT形式で出力

    response = requests.post(url, headers=headers, files=files, data=data)

# SRTファイルとして保存
with open("subtitles_en.srt", "w") as f:
    f.write(response.text)

ポイント: translationsエンドポイントを使用すると、日本語音声が直接英語テキストに翻訳されます。

4. Speech Servicesで英語音声を生成

生成された字幕テキストをAzure Speech Servicesで音声合成します。

url = f"https://{REGION}.tts.speech.microsoft.com/cognitiveservices/v1"

headers = {
    "Ocp-Apim-Subscription-Key": API_KEY,
    "Content-Type": "application/ssml+xml",
    "X-Microsoft-OutputFormat": "audio-16khz-128kbitrate-mono-mp3",
}

ssml = f"""<speak version='1.0' xmlns='http://www.w3.org/2001/10/synthesis' xml:lang='en-US'>
    <voice name='en-US-JennyNeural'>
        {text}
    </voice>
</speak>"""

response = requests.post(url, headers=headers, data=ssml.encode('utf-8'))

5. タイミングを同期した音声を作成

字幕のタイムスタンプに合わせて音声を配置するため、以下の処理を行います:

  1. 各字幕セグメントごとに個別の音声を生成
  2. タイムスタンプに基づいて無音を挿入
  3. 全セグメントを結合
# 各セグメントの処理
for subtitle in subtitles:
    # 前のセグメントからの間隔に無音を挿入
    if gap > 0:
        create_silence(gap, silence_path)

    # TTSで音声生成
    text_to_speech(subtitle['text'], speech_path)

    # 音声が長すぎる場合はテンポを調整
    if actual_duration > segment_duration:
        speed = actual_duration / segment_duration
        # ffmpegのatempoフィルタで速度調整

6. 英語版動画を作成

最後に、元動画の映像と英語音声を結合します。

ffmpeg -i original.mp4 -i english_audio.mp3 \
    -c:v copy -map 0:v:0 -map 1:a:0 -shortest \
    output_en.mp4

生成されるファイル

ファイル 説明
original.mp4 日本語版(元動画)
output_en.mp4 英語版(英語音声入り)
subtitles_en.srt 英語字幕ファイル

YouTubeへのアップロード

日本語版

  • 元動画をそのままアップロード

英語版

  1. 英語音声入り動画をアップロード
  2. YouTube Studio → 字幕タブでSRTファイルを追加

費用について

サービス 料金(目安)
Azure OpenAI Whisper $0.006 / 分
Azure Speech Services $16 / 100万文字

8分程度の動画で数十円程度です。

まとめ

Azure OpenAI ServiceのWhisperとSpeech Servicesを組み合わせることで、日本語動画の英語化を自動化できます。

メリット:

  • 高精度な翻訳(Whisperの翻訳機能)
  • 自然な英語音声(Neural TTS)
  • タイムスタンプ付き字幕の自動生成

注意点:

  • 音声の長さと字幕タイミングの調整が必要
  • 専門用語や固有名詞は手動で修正が必要な場合あり

リポジトリ構成

.
├── .env                    # Azure認証情報
├── .gitignore              # data/を除外
├── generate_subtitles.py   # 字幕生成スクリプト
├── generate_audio.py       # 音声生成スクリプト
├── generate_synced_audio.py # 同期音声生成スクリプト
├── viewer.html             # 字幕プレビュー用ビューアー
└── data/                   # メディアファイル(git管理外)
    ├── original.mp4
    ├── output_en.mp4
    ├── subtitles_en.srt
    └── audio_en.mp3

Discussion