Google Apps ScriptでWhisper APIを使い字幕を作成する【GAS】

Youtube動画を世界展開するにはまず、動画に対して適切な字幕ファイルを用意する必要があります。Youtubeには自動翻訳はありますが、あくまでも自動翻訳でそれが適してるかどうかはわからない。しかし字幕ファイルを用意するのは結構な労力を要します。

そこで、以前GeminiでM4Aファイルからチャレンジしましたが、イマイチでした。ということで、今回はOpenAIのWhisper APIを利用して字幕ファイルを簡単に生成できないか?チャレンジしてみました。

今回利用するファイル等

これまでOpenAIのWhisperは音声を扱うモデルがあり優れた結果を出していました。現在は上位版のgpt-4o-transcribeがリリースされて利用可能ですが、Whisperを指定しないとSRT出力は現在できないです。このAPIをテストで利用することのできるページで使ってみましたが、かなり正確に日本語を認識しつつ肝心の字幕ファイルであるSRTとして出力するのに重要な「タイムスタンプ」も非常に正確に出力できました。

そこで、このモデルを使って動画やM4Aといった音声ファイルから字幕ファイルを生成してみたいと思います。

※GeminiもGemini 2.5 Proを利用したところ、Whisperと同じくらい精度の高いものが出せるようになりました。以下のエントリーにまとめています。

Google Apps ScriptでGeminiを叩いて音声から字幕生成【GAS】

制限事項

ファイルサイズに制限があります。最大25MBまで。Google Apps Scriptの制約が最大50MBまでなのでGASのQuota上は問題はありませんが、25MBまでとなるとSRTファイルを作る上ではM4Aのファイルが10分で11MBと考えると20分くらいの動画の字幕までは作れる計算になります。

しかし長尺の動画となると制約に引っかかってしまうことになるので、その場合ファイルを分割した上で、1つ目のファイルの終わりの時間分だけ2つ目のファイルはタイムスタンプをあとでズラしてあげる必要があります。

また、出力トークンは最大で16,384トークンがGPT-4oの上限となっているので、ものすごく短時間に喋る人ではない限り、20分の動画ということであれば十分SRTファイルとして出力出来るのでは無いかと思います。

Gemini 2.0 APIの場合出力トークンが8192トークンが上限であるため、10分の動画であっても半分で上限に達してしまい出力しきれなかったですが、ChatGPTは出力トークン上限が2倍あるので、10分程度の動画であれば十分出力可能。尺が20分だと足りないかもしれない。

Whisper WebUIで試してみる

gpt-4o-transcribeの前身であるWhisper APIを使っての変換を行えるWebサイトがあります。ただし自分のアカウントのAPIキーを利用する必要があるので自己責任での利用となりますが、実際に試してみました。元になった動画からM4Aファイルを作り(10分でおよそ11MB)、アップロードしてSRTファイルを作る事が可能です。

事前にOpenAIアカウントにてAPIキーを発行しておく必要があります。

  1. こちらのウェブサイトにアクセスする
  2. 左サイドバーにAPIキーを入力する
  3. transcription or translationでは、Create transcriptionを選択する
  4. Audio FileではBrowseをクリックして、M4Aファイルを選択しアップロードする
  5. Option customizationにて、Input LanguageはJapaneseを選択する
  6. Promptでは英語にて指定する。ただし、英訳してからSRT生成してなどの指定は出来なかった
  7. Output FormatではSRTを選択する
  8. 最後にTranscribe Audioボタンをクリックする
  9. Click to Download SRT Fileをクリックすると字幕ファイルが手に入る

コスト的にはこの11MBの音声ファイルで12KBのファイルが生成されて、$0.6程度でした。この出力結果のファイルをYoutube Studioの字幕から該当のファイルに対して追加すればOK。

出力結果はタイムスタンプは非常に正確で、Geminiの時とは全く違う結果になりました。APIキーは一応利用したら削除しておきましょう。出力結果のSRTファイルはこちらになります。

図:Whisper GUIで設定してる様子

Microsoft365専用関数で変わる世界

事前準備

APIキーの取得

まずは、OpenAIのアカウントからAPIキーを取得する必要があります。以下の手順でキーを作成しましょう。

  1. OpenAIのアカウントにログインする
  2. 左サイドバーのOrganizationにあるAPI Keyをクリックする
  3. Create new secret keyをクリックする
  4. Nameは適当に入力し、プロジェクトはすでに作ってあるものを選択し、Create secret keyをクリックする
  5. キーが生成されるのでコピーしてDoneをクリックして閉じる(キーはこの時にしかコピーできない)

このキーを次項のスクリプトプロパティに格納して使います。

図:キーを生成する

スクリプトプロパティに保存

前述で取得したAPI Keyだけでなく、SRTファイルを生成するGoogle Drive上のフォルダのIDをスクリプトプロパティに格納しておきます。これら2つの値を以下のように格納しておきます。

  • apikey : ChatGPTのAPI Keyの値を格納する
  • folderid : SRTファイルを生成するフォルダのIDを格納する

図:スクリプトプロパティに格納する

ドライブにM4Aファイルを配置する

また、今回はYoutubeの動画ではなく、前回記事同様に動画ファイルからmacOSのQuick Time Playerを使って生成したM4Aファイルをアップして変換します。Youtubeにアップする用の動画には動画と音声の2つが含まれており、動画と同じ長さの音声ファイルが入っています。この音声ファイルを取り出して、Geminiにて字幕ファイルを作成することになります。

macOSでの事例になりますが、標準で存在してるQuickTime Playerで簡単にM4A音源だけを抽出することが可能です。

  1. QuickTime PlayerでMP4動画を読み込ませる
  2. メニューからファイル→書き出す→オーディオのみを選択
  3. 保存場所を指定して完了
  4. このファイルをGoogle DriveにアップロードしてファイルIDを控えておく

これでM4Aファイルが生成されます。

BGM無しの音声のみの動画を用意して抽出したものならば、さらに精度があがるかもしれない。

図:オーディオのみに変換で一発

ソースコード

今回の動画は日本語の動画であるため、まずはこのAPIで日本語の文字起こしをしたSRTファイルを生成する。その結果をGPT-4oにて日本語の自然言語に修正しつつ、英語に翻訳したものをSRTで出力するという二段構えで生成と変換を行う必要があります。

文字起こし段階では会話の途中で分断されて次のブロックが始まっている箇所などがあるので、これをまず修正する為の校正処理が自然言語での修正となります。

ただし、IT用語などがうまく拾えていない部分があったりするので一度日本語でSRTファイルを出力させた後に手修正で直して、それを再度翻訳するような形の半自動化のほうがスムーズでより正確なSRTファイルを作れるのではないかと思います。

SRTファイルを生成する

Whisper APIは難しいプロンプト無しでダイレクトにSRT形式が出力可能です。Whisperに送る場合にはBase64エンコードはせずにBlobで取得したものをそのまま送信します

payloadではpromptを指定することもできますが、英訳してみたいな指示はできません。出力後のテキストに対して別途ChatGPTのAPIに問い合わせをして変換が必要です。

またtranscribeAudio関数では文字起こししてSRT形式にしてくれますが、このままだとおかしな日本語などが記録されていたりするので、次項の日本語して校正を掛けてあげると良い感じになります。10分の音声ですがそこそこ時間は掛かりますが、Geminiと異なり長文でしっかりと最後までデータが出力されました

日本語の文章校正を行う

今回の音声の場合、Microsoft365の関数名などが文字起こしの場合にはうまく文字起こしができずにおかしな箇所がありました。そこで続けて、文字起こししたSRT形式のまま、以下の関数でChatGPTに文章校正をしてあげると殆どが修正されて、良い感じに仕上がります。

図:文章校正したらいい感じになった

英訳してSRTとして出力

今回さらにそのまま英訳できるかなと思ったのですが、勝手にタイムスタンプが変わったり、やたら長文に整理されてしまったりしました・・・もうちょっとプロンプトを正しく処理してくれるように修正が必要ですが、以下のような関数でSRTデータを英訳することが可能です。

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)