Dockerを使ってOpenAIのWhisperをサクッと試す
少し前から界隈を賑わせているWhisper。
どうやらスゴイらしい。
嬉しいことに
- 日本語対応
- しかも無料
という太っ腹ぷり。
アーキテクチャ・どんなにスゴイかすっ飛ばして「環境つくり/テスト」に焦点を当てます。
(Colabの記事は既にいくつかあったので、dockerを使った環境構築を想定して書きます。)
結論から言うと、「めっちゃ簡単」でした。
こういうのってハマりどころが多いなと思って、備忘録として書いたのですが、簡単だったので内容が薄いです。。
とくにかく触ってみたい
huggingfaceさんがデモを公開してくれています(いつもお世話になります)。
手っ取り早く試したい人はここから試すと良いでしょう。
環境構築(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
テスト用の音声ファイルを用意します。
自前で用意しても良いですが、今回はここの無料ファイルをダウンロードして使いました。
まずは、一番上の「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のデモだと以下の結果でした。
無添加のシャボン玉石鹸ならもう安心。 天然の保湿成分が含まれるため、肌に潤いを与え、健やかに保ちます。 お肌のことでお悩みの方は是非1°無添加シャボン玉石鹸をお試しください。 お求めは0120005595まで。
「1°」は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
マシンのドライバーのバージョンでないとエラーになるので、以下から適したバージョンを選択してください。
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
をインストールすることで解決できます。
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