オフラインでストリーミング音声認識できるVoskを使ってみた

スポンサーリンク

Whisperを除けば、無料でここまでできる音声認識は他に無いのでは、と思えるほど素晴らしい特長を備えた音声認識Vosk。日本語ビッグモデルでサクッと試せる記事が見当たらなかったので、まとめてみました。


Voskの特長

  • オフライン対応
  • 日本語を含む20以上の言語を認識
  • ストリーミング認識対応
  • CPUでも比較的早く認識できる
  • Pythonを中心にいろんな言語をサポート
  • 無料
  • オープンソース

日本語モデルの種類

こちらに対応モデル一覧があり、日本語だと48MByteの軽量モデル、1GByteのビッグモデルの2種類が提供されています。


動作確認環境

ミニPC: TRIGKEY Green G5
OS: Ubuntu 22.04.3
Dockerがインストール済み


全体の流れ

日本語ビッグモデルをなるべく手軽に動かしたかったので、次の方法で試しました。
音声認識サーバーを立ち上げる。
②クライアントアプリでマイクからの音声を取得し、①で起動したサーバーで音声認識する。


音声認識サーバーの起動

Dockerが使える環境であれば、下記コマンドだけで日本語ビッグモデルを使った音声認識サーバーが起動できます。

$ docker run -p 2700:2700 alphacep/kaldi-ja:latest



クライアントアプリの起動

必要なパッケージのインストール
$ pip install vosk websocket-client


適当なフォルダでソースコードを取得

サーバーのソースコードに「マイクを使ったクライアントサンプルアプリ」が含まれている。なので、サーバーのソースコードを取得。

$ git clone https://github.com/alphacep/vosk-server.git


マイクを使ったクライアントアプリの起動、動作確認

まずはマイクデバイスが認識できているか確認。
このサンプルアプリは「-l」オプションを付けて起動するとデバイス一覧を表示してくれる。

$ cd ./vosk-server/websocket
$ python test_microphone.py -l
   0 HDA Intel PCH: ALC897 Analog (hw:0,0), ALSA (2 in, 2 out)
   1 HDA Intel PCH: ALC897 Alt Analog (hw:0,2), ALSA (2 in, 0 out)
   2 USB Microphone: Audio (hw:1,0), ALSA (1 in, 0 out)
省略
* 18 default, ALSA (32 in, 32 out)

先頭に「*」が付いているのがデフォルトデバイス。なんだけど、ALSAとなっており具体的にどのマイクが使われているのかわからない。

No.2のUSB Microphoneをマイクデバイスとして使いたいので、「-d」オプションでデバイスを指定してクライアントを起動。

$ python test_microphone.py -d 2


あとはマイクに向かって話せば、音声認識結果が表示される。
"partial"はリアルタイムで表示される音声認識の途中結果。
"text"は確定した音声認識結果。

{
  "partial" : "ハロー ワールド"
}
{
  "partial" : "ハロー ワールド と"
}
省略
{
  "partial" : "ハロー ワールド と 言っ て み"
}
省略
{
  "partial" : "ハロー ワールド と 言っ て み た"
}
{
  "result" : [{
      "conf" : 0.888021,
      "end" : 7.860000,
      "start" : 7.500000,
      "word" : "ハロー"
    }, {
省略
    }, {
      "conf" : 0.994479,
      "end" : 9.150000,
      "start" : 9.060000,
      "word" : "た"
    }],
  "text" : "ハロー ワールド と 言っ て み た"
}



リンク