動画コンテンツを文字に変える技術革命!Whisperによる音声データ変換

動画コンテンツを文字に変える技術革命!Whisperによる音声データ変換 AI

私たちの日常生活において、YouTubeは情報源として欠かせない存在になっています。
しかし、動画の情報を文字データとして保存したい場面もしばしばあります。

そこで注目されているのが、OpenAIが開発した最先端の音声認識技術「Whisper」です。
この技術は、動画コンテンツからの音声を正確にテキスト化することで、
コンテンツのアクセシビリティを飛躍的に向上させます。

本記事では、そのための手順を具体的に紹介しています。

本記事の内容

  • YouTubeからの音声ダウンロード
  • 音声データのテキスト変換
  • 動画スクリプトの評価

それでは、上記に沿って解説していきます 。

YouTubeからの音声ダウンロード

YouTubeから音声をダウンロードします。
音声のダウンロードには、yt-dlpを用います。

yt-dlpは、音声だけをダウンロードすることができます。
そのためには、まず以下のコマンドでダウンロード可能なファイル形式を調べます。

yt-dlp --list-formats https://www.youtube.com/watch?v=EmCPHumbMvo

対象の動画は、以下の形をサポートしていることがわかります。

ID  EXT   RESOLUTION FPS CH │   FILESIZE   TBR PROTO │ VCODEC          VBR ACODEC      ABR ASR MORE INFO
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb3 mhtml 48x27        0    │                  mhtml │ images                                  storyboard
sb2 mhtml 80x45        0    │                  mhtml │ images                                  storyboard
sb1 mhtml 160x90       0    │                  mhtml │ images                                  storyboard
sb0 mhtml 320x180      0    │                  mhtml │ images                                  storyboard
233 mp4   audio only        │                  m3u8  │ audio only          unknown             [ja] Default
234 mp4   audio only        │                  m3u8  │ audio only          unknown             [ja] Default
599 m4a   audio only      2 │    2.97MiB   31k https │ audio only          mp4a.40.5   31k 22k [ja] ultralow, m4a_dash
600 webm  audio only      2 │    3.11MiB   32k https │ audio only          opus        32k 48k [ja] ultralow, webm_dash
139 m4a   audio only      2 │    4.71MiB   49k https │ audio only          mp4a.40.5   49k 22k [ja] low, m4a_dash
249 webm  audio only      2 │    4.57MiB   47k https │ audio only          opus        47k 48k [ja] low, webm_dash
250 webm  audio only      2 │    5.90MiB   61k https │ audio only          opus        61k 48k [ja] low, webm_dash
140 m4a   audio only      2 │   12.50MiB  129k https │ audio only          mp4a.40.2  129k 44k [ja] medium, m4a_dash
251 webm  audio only      2 │   12.31MiB  128k https │ audio only          opus       128k 48k [ja] medium, webm_dash
597 mp4   256x144     15    │    3.11MiB   32k https │ avc1.4d400b     32k video only          144p, mp4_dash
602 mp4   256x144     15    │ ~  9.17MiB   93k m3u8  │ vp09.00.10.08   93k video only
598 webm  256x144     15    │    2.38MiB   25k https │ vp9             25k video only          144p, webm_dash
394 mp4   256x144     30    │    6.13MiB   64k https │ av01.0.00M.08   64k video only          144p, mp4_dash
269 mp4   256x144     30    │ ~ 16.83MiB  170k m3u8  │ avc1.4D400C    170k video only
160 mp4   256x144     30    │    4.70MiB   49k https │ avc1.4D400C     49k video only          144p, mp4_dash
603 mp4   256x144     30    │ ~ 15.77MiB  159k m3u8  │ vp09.00.11.08  159k video only
278 webm  256x144     30    │    7.79MiB   81k https │ vp09.00.11.08   81k video only          144p, webm_dash
395 mp4   426x240     30    │   10.66MiB  110k https │ av01.0.00M.08  110k video only          240p, mp4_dash
229 mp4   426x240     30    │ ~ 30.69MiB  310k m3u8  │ avc1.4D4015    310k video only
133 mp4   426x240     30    │    8.65MiB   90k https │ avc1.4D4015     90k video only          240p, mp4_dash
604 mp4   426x240     30    │ ~ 29.27MiB  296k m3u8  │ vp09.00.20.08  296k video only
242 webm  426x240     30    │   10.58MiB  110k https │ vp09.00.20.08  110k video only          240p, webm_dash
396 mp4   640x360     30    │   20.40MiB  211k https │ av01.0.01M.08  211k video only          360p, mp4_dash
230 mp4   640x360     30    │ ~ 79.36MiB  803k m3u8  │ avc1.4D401E    803k video only
134 mp4   640x360     30    │   21.30MiB  221k https │ avc1.4D401E    221k video only          360p, mp4_dash
18  mp4   640x360     30  2 │ ≈ 34.59MiB  350k https │ avc1.42001E         mp4a.40.2       44k [ja] 360p
398 mp4   1280x720    30    │   68.10MiB  706k https │ av01.0.05M.08  706k video only          720p, mp4_dash
232 mp4   1280x720    30    │ ~254.35MiB 2572k m3u8  │ avc1.4D401F   2572k video only
136 mp4   1280x720    30    │   76.38MiB  791k https │ avc1.4D401F    791k video only          720p, mp4_dash
609 mp4   1280x720    30    │ ~162.74MiB 1646k m3u8  │ vp09.00.31.08 1646k video only
247 webm  1280x720    30    │   45.31MiB  469k https │ vp09.00.31.08  469k video only          720p, webm_dash
399 mp4   1920x1080   30    │  119.99MiB 1243k https │ av01.0.08M.08 1243k video only          1080p, mp4_dash
270 mp4   1920x1080   30    │ ~463.52MiB 4688k m3u8  │ avc1.640028   4688k video only
137 mp4   1920x1080   30    │  136.53MiB 1415k https │ avc1.640028   1415k video only          1080p, mp4_dash
614 mp4   1920x1080   30    │ ~276.64MiB 2798k m3u8  │ vp09.00.40.08 2798k video only
248 webm  1920x1080   30    │  118.05MiB 1223k https │ vp09.00.40.08 1223k video only          1080p, webm_dash
616 mp4   1920x1080   30    │ ~569.57MiB 5760k m3u8  │ vp09.00.40.08 5760k video only          Premium

高品質なm4a形式のID「140」をダウンロードします。
そのためのコマンドは、以下。

yt-dlp -o EmCPHumbMvo.m4a -f 140 https://www.youtube.com/watch?v=EmCPHumbMvo

上記コマンドを実行すると、数秒でダウンロードできます。
ファイル名は、指定した「EmCPHumbMvo.m4a」で保存できています。

再生時間は、約13分30秒となります。

音声データのテキスト変換

音声をテキストに変換しましょう。
その際に、Faster Whisperを利用します。

Faster Whisperであれば、最も精度の高いlarge-v3でも動く可能性があります。
GPUが8GBあれば、なんとか動くと言われています。

そのFaster Whisperを用いたコードは、以下となります。

from faster_whisper import WhisperModel

model_size = "large-v3"

# Run on GPU with FP16
model = WhisperModel(model_size, device="cuda", compute_type="float16")

# or run on GPU with INT8
# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")
# or run on CPU with INT8
# model = WhisperModel(model_size, device="cpu", compute_type="int8")

# ダウンロードした音声ファイルを指定
segments, info = model.transcribe("EmCPHumbMvo.m4a", beam_size=5)

print("Detected language '%s' with probability %f" % (info.language, info.language_probability))

# ファイルに追記するために開きます
with open("transcription.txt", "a") as file:
    for segment in segments:
        # segment.start, segment.end, segment.text の各部分を改行しながらファイルに追記します
        # file.write("[%.2fs -> %.2fs] %s\n" % (segment.start, segment.end, segment.text))
        file.write(segment.text + "\n")  # 各セグメントのテキストの後に改行を追加

各自のマシンスペックに応じて、動作タイプを選択してください。

  • GPU with FP16
  • GPU with INT8
  • CPU with INT8

コードを実行すると、少し待たされます。
RTX 3090(24GB)だと、130秒ほどかかっています。

CPUも影響してくるので、一概にGPUだけは語れませんけどね。
とりあえず、約13分30秒の音声は2分ちょっとぐらいという結果です。

動画のスクリプトは、「transcription.txt」に保存されています。

動画スクリプトの評価

まずは、「transcription.txt」の内容を確認してみてください。
完璧とは言い切れませんが、十分なレベルだと思います。

人間の主観ではなく、ここは冷静沈着なAIに判断してもらいましょう。
そのためには、ChatGPTに次のように入力するだけです。

その返答は、以下。

これらに加えて、ポイントも教えてくれています。

ここまでレシピを構成できるということは、スクリプトは問題ないと言えそうです。
最後は、実際に動画と見比べて判断してみてください。

タイトルとURLをコピーしました