📝

Dockerを使ってOpenAIのWhisperをサクッと試す

2022/09/29に公開

少し前から界隈を賑わせているWhisper。

https://openai.com/blog/whisper/

どうやらスゴイらしい。
嬉しいことに

  • 日本語対応
  • しかも無料

という太っ腹ぷり。

アーキテクチャ・どんなにスゴイかすっ飛ばして「環境つくり/テスト」に焦点を当てます。
(Colabの記事は既にいくつかあったので、dockerを使った環境構築を想定して書きます。)

結論から言うと、「めっちゃ簡単」でした。
こういうのってハマりどころが多いなと思って、備忘録として書いたのですが、簡単だったので内容が薄いです。。

とくにかく触ってみたい

huggingfaceさんがデモを公開してくれています(いつもお世話になります)。
https://huggingface.co/spaces/openai/whisper

手っ取り早く試したい人はここから試すと良いでしょう。

環境構築(CPU)

環境はubuntuです。

こんな感じでDOCKERFILEを作ります。

FROM python:3.9-slim

WORKDIR /workspace

RUN apt-get update && apt-get 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のあるディレクトリで以下を実行します。

イメージをbuildします。

docker build -t whisper .

カレントディレクトリをマウントした状態でイメージを起動します。

docker run -it -d -v $(pwd):/workspace/ --name whisper whisper

テスト用の音声ファイルを用意します。
自前で用意しても良いですが、今回はここの無料ファイルをダウンロードして使いました。
http://pro-video.jp/voice/announce/

まずは、一番上の「CM原稿(せっけん)」の音声で試してみます。
(ちなみにこれは非常にクリアで聞き取りやすい音声です。)

mp3ファイルはカレントディレクトリに持ってきておきます。

次にコンテナに入ります。

docker exec -it whisper bash

コマンドラインからだと、以下のように音声ファイルと言語を指定するだけです。

whisper 001-sibutomo.mp3 --language ja

デフォルトだとモデルの「small」が使用されます。

コマンドラインから動かす場合、これだけです。
たぶんハマりどころはありません。

結果

まず、以下が正しい書き起こしです。

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

whisperの結果を見てみます。

天下のシャボン生石犬ならもう安心。天然の保湿成分が含まれるため肌に潤いを与え、少やかに保ちます。
お肌のことでお悩みの方は是非一度無天下シャボン生石犬をお試しください。
お求めは0120 005595まで。

ところどころを間違いはあるものの良いんじゃないでしょうか。

せっかくなので、largeでも試してみました。

whisper 001-sibutomo.mp3 --language ja --model large

結果は以下のとおりです。

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

もう完璧ですね。抑揚に合わせてか「!」ついているし、句読点もパーフェクト。電話番号もちゃんとハイフン入ります。いや、スゴい。。

ちなみにAzureのデモだと以下の結果でした。
https://azure.microsoft.com/ja-jp/products/cognitive-services/speech-to-text/#features

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

」はhomophone(音声は同じだが、意味が異なる単語)ですね。それ以外は問題なさそうですね。

まぁ音声が非常にクリアで聞きやすい声なので、このくらいだと今のモデルにとっては簡単なのかもしれないですね。

次は「医療WEBドラマ 医師役」と書かれた医療用語を多く含んだ音声で試します。

まずは正しい書き起こしです。

血管収縮には血管平滑筋細胞内のカルシウムノードが関与しており、血管平滑筋細胞内へのカルシウム流入をブロックすれば血管収縮を抑制できます。しかし近年、カルシウム流入とは独立した経路としてロックが見出され、血管収縮に深く関与していることが明らかになりました。

次にsmallでの書き起こし結果です。

血管収縮には血管併活金細胞内のカルシウムノードが関与しており、血管併活金細胞内へのカルシウム流入をブロックすれば血管収縮を抑制できます。しかし近年、カルシウム流入とは独立した経路としてロックが見出され、血管収縮に深く関与していることが明らかになりました。

largeだと以下のとおりです。

血管収縮には血管閉活菌細胞内のカルシウム濃度が関与しており、血管閉活菌細胞内へのカルシウム流入をブロックすれば、血管収縮を抑制できます。しかし近年、カルシウム流入とは独立した経路としてロックが見出され、血管収縮に深く関与していることが明らかになりました。

いずれも「平滑筋」は漢字が正しくないのですが、それ以外は問題なさそうでした。
(ちなみにazureだと「平滑筋」を含めて、キレイに書き起こしできていました。)

今回は2つとも音声自体は非常に良質だったこともあり、この程度だと全然苦にしない印象です。
(もっと日常に近いレベルの騒音・集音環境で検証してみたいです。)

課題

推論時間は実運用を考える場合のボトルネックになりそうです。
自分の環境ではCPUの場合は20~30秒の音声で推論にsmallで1分弱かかりました。
largeだと、3分くらいかかってました。

環境構築(GPU)

せっかくなので、GPUでも試してみます。

まず、cudaに対応したイメージを作るため、DOCKERFILEの先頭行を以下のように変更します。

-    FROM python:3.9-slim
+    FROM pytorch/pytorch:1.9.0-cuda10.2-cudnn7-runtime

マシンのドライバーのバージョンでないとエラーになるので、以下から適したバージョンを選択してください。
https://hub.docker.com/r/pytorch/pytorch/tags?page=1&name=10.2

buildはcpuの場合と同じです。

docker build -t whisper_gpu

はじめてdockerでGPUを使う場合、コンテナを動かす際、うまくマシンのドライバーが認識できずに以下のようなエラーが出るかもしれないです。

docker run --gpus all -it -d -v $(pwd):/workspace/ --name whisper_gpu whisper_gpu
docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]]

公式に従って以下の手順でnvidia-container-runtimeをインストールすることで解決できます。

https://github.com/NVIDIA/nvidia-container-runtime

curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install nvidia-container-runtime

最後にdockerを再起動します。

service docker restart

再度runコマンドを動かすと、エラーなく起動できます。

docker run --gpus all -it -d -v $(pwd):/workspace/ --name whisper_gpu whisper_gpu

後は、cpuと同じ手順で動かせます。

docker exec -it whisper_gpu bash

実行環境はQuadro RTX 8000(48GB)と割と良いGPUを使ったのですが、

  • smallで10秒
  • largeで30秒

くらいでした。

結語

whisperスゴい。そして手軽に試せて良い。
そのおかげで大して情報のない記事になってしまいました。

Discussion