自分の備忘録としてのやってみた系の話。OpenAIが提供するモデルを使って文字起こしをするC++実装のwhisper.cppを試してみた。
環境
Apple M1 MacBook Air 2020 (Memory 16GB)
uname -a Darwin hogehoge.local 22.3.0 Darwin Kernel Version 22.3.0: Mon Jan 30 20:39:35 PST 2023; root:xnu-8792.81.3~2/RELEASE_ARM64_T8103 x86_64
whisper.cppのビルド
以下のコマンドを実行してビルドする。
git clone https://github.com/ggerganov/whisper.cpp.git cd whisper.cpp make
ビルドが成功すると、カレントディレクトリに main という名前のバイナリが出来上がる。
モデルのダウンロード
次にモデルのダウンロードをしておく。
./models/download-ggml-model.sh large
文字起こしする音声ファイルのwavファイルを用意
- whisper.cppはwavファイルしか受け付けないので、ffmpegで動画ファイルをwavにする。
- ちょうど手元に会社で公開している勉強会の動画があったので、これを使ってみる
- あと長いので最初の2分間だけを抽出。
ffmpeg -i ~/Downloads/2023-02-13.mp4 -ar 16000 -to 120 2023-02-13.wav
whisper.cppで文字起こし
先ほど出力したwavファイルからwhisper.cppを使って文字起こしする。
./main -m models/ggml-large.bin -f 2023-02-13.wav -l auto
注意点
-m
でダウンロードしたモデルファイルを使う。large
だと精度が高い-l auto
を指定しないと日本語の文字起こししてくれないので指定する。もしくは-l ja
でもOK
文字起こしの結果。ちなみに2分の音声ファイルを文字起こしするのに82秒ぐらいかかっている。
[00:00:00.000 --> 00:00:01.000] お願いします [00:00:01.000 --> 00:00:02.000] お願いします [00:00:02.000 --> 00:00:11.120] はい 本日 Dpエンジニアリングまで 第60回始めていきたいと思います [00:00:11.120 --> 00:00:12.120] お願いします [00:00:12.120 --> 00:00:13.120] お願いします [00:00:13.120 --> 00:00:14.120] お願いします [00:00:14.120 --> 00:00:21.840] 今日は React 18かな 18から新しく 出たディファードバリューっていう [00:00:21.840 --> 00:00:28.440] やつの紹介ですね もともとデバウンス とかスロットルみたいな感じで [00:00:28.440 --> 00:00:33.840] 各種ライブラリーが似たような やつやってたんですけど そうじゃ [00:00:33.840 --> 00:00:38.800] なくて結構UIのアップデートで 最適化したやつが出ましたよっていう [00:00:38.800 --> 00:00:44.320] ので もともとデバウンスっていう 本当はスロットルも出したかったん [00:00:44.320 --> 00:00:49.200] ですけど React 18でスロットルのやつ がバグっていてとあるライブラリー [00:00:49.200 --> 00:00:54.000] でパッてデモが用意できなかったん ですけど 一応デバウンスだけ紹介 [00:00:54.000 --> 00:01:04.120] しておくと 18入力した後に時間差 で18入力されるという 今これ1秒 [00:01:04.120 --> 00:01:09.680] かな 1秒ってやってるので 最後に 入力した後1秒後に値が更新される [00:01:09.680 --> 00:01:15.400] ってやつですね 連続で入力してる 間はデバウンスバリューは変わん [00:01:15.400 --> 00:01:20.840] ないけれど 止めてから1秒すると デバウンスバリューは変わる これ [00:01:20.840 --> 00:01:27.120] 何使いたいかっていうと インクリメンタル サーチとか オリジンのところを [00:01:27.120 --> 00:01:31.600] 見てもらうと 一文字変わるごとに サーチ検索API叩きまくってると [00:01:31.600 --> 00:01:38.320] 重すぎるし 重すぎるので デバウンス みたいにユーザーの操作が終わった [00:01:38.320 --> 00:01:44.560] 後にAPI一回叩くみたいな感じで やってあげるっていう スロットル [00:01:44.560 --> 00:01:50.280] の場合は1秒ごとに発火される っていうイメージなので 例えば [00:01:50.280 --> 00:01:55.240] デバウンスバリューはこれ 最後 操作終わるまではデバウンスバリュー [00:01:55.240 --> 00:02:00.040] 更新されないですけど スロットル だった場合は1秒ごとに発火されて
最後に会社の勉強会の宣伝
ドクターズプライムでは、DP Engineering Mondayという名前で毎週勉強会をやってます。月に1回、社外向けに開催したものをYouTubeで配信しているので、よかったらチャンネル登録してください。技術スタックはReact, TypeScript, ChakraUI, Go, GCP, Hasura, PostgreSQLなので、その周辺の話が多いです。