OpenAIリリースのWhisperをCPUだけで動かすために色々試した話

ローカルのCPUを使って、OpenAIリリースのWhisperを動かしてみました。 Google ColabなどでGPUを動かすときに上限制限が気になる人の参考になればと思い筆を取りました。
2022.10.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

皆さんこんにちは、クルトンです。 今回は、OpenAIがリリースしたWhisperをCPUだけで動かしてみました。 Google ColabなどでGPUを動かすときに上限制限が気になる人の参考になればと思い筆を取りました。 最終的にはローカルCPUで動かしているので、そこだけ見たいという方は「ローカルCPUでWhisperを動かす」からご覧ください。

キッカケ

社内で記事が出ており、そこから興味を持ったので動かそうとしました。

「まずは簡単に試したい」と考えたので、実際に動かそうとしたのはこちらの公式のチュートリアルです。

GPUを使って動かしてもよかったのですが、簡単にCPUで動かないかと考えて試そうとしました。

エラーと学習時間

Google ColabのチュートリアルをCPUで上から順番に実行していると、whisper.DecodingOptionsメソッドで次のようなエラーに遭遇すると思います。

RuntimeError: "slow_conv2d_cpu" not implemented for 'Half'

検索したところ、公式のGitHub上で既に議論されており、解決されていました。

こちらのページで書いている解決策の通り、fp16=Falseを引数に追加すると動きました。 fp16はGPUを使う際にtrueにするもので、明示的にfalseにする必要があります。 fp16とGPUの繋がりについて詳しくお知りになりたい方は、半精度浮動小数点数というキーワードでご検索ください。

そして実際に動かしたところ、当然の話ではあるのですが、学習に時間がかかります。 しかし想像以上に時間がかかりそうでした。(画像では3時間を超えると表示されています。) training on Google Colab

そこで、Google Colabでなく、ローカルで環境構築する事にしました。

ローカルCPUでWhisperを動かす

以下が、動作環境です。

% sw_vers
ProductName:	macOS
ProductVersion:	12.6
BuildVersion:	21G115

環境構築にはDockerが必要となっています。dockerコマンドが打てる事をご確認ください。 docker --versionなどと打つとコマンドが打てる状態であれば、自身が入れているDockerのバージョンに関する情報が出てきます。

DockerでWhisperを動かす手順は次のとおりです。

  1. Dockerfileの準備
  2. docker buildコマンドでイメージを構築
  3. 構築したイメージを使ってコンテナを動かす
  4. 動かしているコンテナにログインしてwhisperコマンドを叩く

順番通りに手順を説明します。

1. Dockerfileの準備

以下のようなファイルを用意します。

FROM python:3.9-slim

WORKDIR /workspace

RUN apt update && apt install -y \
    build-essential \
    gcc \
    git \
    ffmpeg \
    && rm -rf /var/lib/apt/lists/*

RUN pip install --upgrade pip

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

ファイルを作る場所は動作させても問題ない箇所に新規フォルダ作成する事をオススメします。 この時点で音声ファイルがある場合、Dockerfileと同じ階層に配置してください。

2. docker buildコマンドでイメージを構築

docker build -t whisper <Dockerfileがあるパス>

tオプションでイメージにwhisperと名前をつけておきます。

3. 構築したイメージを使ってコンテナを動かす

docker run -t -d -v $(pwd):/workspace/ whisper --name <お好きな名前>

whisperイメージを使ってコンテナを作成して実行します。 nameオプションを使ってコンテナに名前をつけていますが、省いても良いです。

4. 動かしているコンテナにログインしてwhisperコマンドを叩く

ログインするには次のようにします。

docker exec -it <コンテナの名前> bash

3.で作って動作しているコンテナにbashを使える状態でログインします。 docker runの時にnameオプションを省いた場合、docker psコマンドでdockerの名前が確認できます。

最後に、whisperコマンドです。

whisper <音声ファイルの名前.拡張子> --language ja

音声ファイルは、Dockerファイルがあるパスと同じ階層に配置すると実行が簡単です。

languageオプション無しでも動くのですが、最初に30秒で何の言語か特定するところから始まるので、言語がわかっている場合は書いたほうが実行時間が短くなります。

実行結果

自身で喋った音声を今回は認識させてみました。内容は次の通りです。

こんにちは、これはテスト音声です。 今回はWhisperを使って、音声の認識をやってみました。 WhisperというのはOpenAIがリリースしたものになります。

次に、whisperが認識した内容です。

[00:00.000 --> 00:06.000] こんにちは。これはテスト音声です。 [00:06.000 --> 00:15.000] 今回はウィスパーを使って、音声の認識をやってみました。 [00:15.000 --> 00:32.000] ウィスパーというのはオープンAIがリリースしたものになります。

日本語でAIなどと言った部分も認識できていますし、簡単ではありますが、高精度に認識できていました。

終わりに

今回は、Whisperを触ってみました。 触っているうちに他の音声ファイルでも試したのですが、wavファイルとm4dファイルが実行できている事を確認しています。 複数の拡張子に対応し、複数の言語に対応しているのでとても使いやすそうですね。

今回はここまで。

それでは、また!

参考にしたサイト