Whisperを使って音声ファイル/動画ファイルからテキストを抽出する

はじめに

音声ファイル、動画ファイルからテキストファイルを抽出したかったのでメモ

環境

Windows 11 Professional
WSL2 Ubuntu 24.04 LTS
Docker Desktop 4.34.2 (167172)
python 3.11
whisper

準備

を使う。

Docker上で、python + whisperを使うので、適当な作業ディレクトリを用意する。

プロジェクト構成

├── Dockerfile
├── compose.yml
├── model.py 
├── audio (テキストを抽出したい音声ファイル)
├── movie (テキストを抽出したい動画ファイル)
└── text (テキストファイル)

pythonDocker上で使いたいので、compose.ymlDockerfileを用意する。

compose.yml
services:
  app:
    build: 
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/app
Dockerfile
FROM python:3.11-slim-bullseye

# install git
RUN apt-get update && \
    apt-get install git ffmpeg -y

    # install pip
RUN pip install --upgrade pip

# install whisper
RUN pip install git+https://github.com/openai/whisper.git 
RUN pip install moviepy

WORKDIR /app

CMD ["tail", "-f", "/dev/null"]

pythonプログラム

model.py
import os
from moviepy.editor import VideoFileClip
import whisper

model = whisper.load_model("medium")

video_folder = "movie"
audio_folder = "audio"
text_folder  = "text"

# video_folderを走査してmp3ファイルを作成する
for filename in os.listdir(video_folder):
    # mp4, mkv
    if filename.endswith(".mp4") or filename.endswith(".mkv"):
        video_path = os.path.join(video_folder, filename)
        video = VideoFileClip(video_path)
        output_audio_path = os.path.join(audio_folder, filename + ".mp3")
        video.audio.write_audiofile(output_audio_path)

# audio_folderを走査してtextファイルを作成する
for filename in os.listdir(audio_folder):
    if filename.endswith(".mp3"):
        output_audio_path = os.path.join(audio_folder, filename)
        result = model.transcribe(output_audio_path)
        output_text_path = os.path.join(text_folder, filename + ".txt")
        # result をテキストファイルとして保存する
        with open(output_text_path, "w") as f:
            f.write(result["text"])

実行

compose.ymlの階層で下記を実行する。

docker compose up -d

model.pyを実行する。

docker compose exec app python model.py

textにテキストファイルが出力される。

試したもの

今回はサンプル音声 https://pro-video.jp/voice/announce/ を利用させていただいた。

これの G-01の音声をダウンロードし、音声ファイルとして入れてテキストを抽出したところ、以下が出力された。

無添加のシャボン玉石鹸ならもう安心。天然の保湿成分が含まれるため、肌に潤いを与え、すこやかに保ちます。お肌のことでお悩みの方は、ぜひ一度、無添加シャボン玉石鹸をお試しください。お求めは0120-0055-95まで。

modelmediumだと結構正確に出力されるが、smallだと句読点がなかったり、漢字が間違っていたりなどするので、正確性を求めるのであれば modelsizeを変えたほうが良い。
一番性能が良いのは largeだが、実行時間と正確性を両立している turboがよさそうか。

参考

おわりに

会議の動画の文字起こしに使えるので積極的に使っていきたい。
ChatGPTやClaude, Geminiなどに起こした文字を渡して、要約してもらうという使い方もよさそうだ。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。