オフラインで音声認識できるVoskを用いたWindows用アプリを作成してGoogleの音声認識と比較

 僕はSokki VoiceというGoogleの音声認識でWindowsの任意のアプリケーションに音声入力できる音声入力ソフトを公開しています。
そんな僕には以前から気になっていた音声認識APIがありますそれはローカルで動作するVoskという音声認識のAPIです。最近の音声認識はインターネット上で音声認識をするものが多いのですが、その際に気になるのが音声認識させた情報に関するプライバシーの問題です。ブログで公開するような情報であれば特に気にする必要はないかもしれませんが、守秘義務があるような機密情報をオンラインで音声認識する際には十分に注意が必要です。セキュリティについてしっかり対策しているとしても情報が絶対に漏洩しないとは言えません。そういった意味でローカルで音声認識できるというのはとても大きなメリットかと思います

そこで今回僕はオフラインで音声認識できるVoskを利用したWindows用のデスクトップアプリケーションを作っていろいろテストしてみました。ちなみにこの記事もVoskで音声認識して直接WordPressに音声入力しています(90パーセント程度は音声入力で書いています)。

Voskとはどんな音声認識のAPI?

まずはVoskがどんな音声認識APIかその特徴を挙げると

  1. ローカルで音声認識ができる(音声データをインターネットに送信しない)
    Voskのメリットは何といってもここが一番大きいと思いますオンラインの音声認識ではセキュリティー面で心配なので音声入力が使えなかったという方にはここが決定的なメリットになると思います。
  2. 音声認識のモデルは日本語の場合50MBの小さいモデルと1GBのモデルを選択することができる
    • 50MBの軽量なモデルは音声アシスタントといった使い方ができそう。
    • 1GBのモデルを使用すればブログなどの記事を書くことにも十分使える。
      ※僕の感想としてはMicrosoft EdgeのWeb Speech APIよりも使いやすいです。
      ※1GBのモデルを使用する場合はアプリの消費メモリが多くなる(~1.6GB程度)
  3. クロスプラットフォームで使える音声認識APIなのでWindowsだけではなくMacやアンドロイドなどでも使用できる。
  4. 対応している言語も多い。20以上の言語と方言をサポート
  5. 開発に用いることができる言語も多い(Python、JavaScript/Nodejs、C♯など)
  6. 話者を識別することもできる
    話者の声の特徴を表わす数値データ(配列)を音声認識結果とともに出力してくれる。声の特徴を表すデータを解析して話者を特定する処理はアプリケーション開発者の側で実装する必要がある。
  7. ハードルは高いが音声認識モデルを再構築したり単語を登録することができる
    アプリケーションのエンドユーザーが音声認識アプリ上で単語を追加登録するというようなことではなく、アプリケーション開発者が単語を追加するなどして音声認識モデルをコンパイルしなおすというような形のようです。

Voskはこのように非常に魅力的な音声認識のAPIになります。
そこで今回はC#でVoskを利用したWindows用のデスクトップアプリを作って色々試してみました。

今回テストした内容は以下の内容です

  1. 音声からテキストへの変換精度
  2. リアルタイムで音声認識をする際のレスポンス
  3. 音声入力をするWindows用のデスクトップアプリとして使えるか
  4. この記事を実際にVoskの音声認識をブログを書くことができるか(この記事をVoskへの音声認識を使って実際に書いてみてテストする)

試した結果は
 上記の1、2、3に対しては良好な結果で十分に使えるというのが僕の結論です。
3番に関してはWindows用のデスクトップアプリとして作成できますが、そのアプリの導入がSokki Voiceに比べると少し面倒かなという感じです。

上記4に関しては、実際にこのブログはVosk(1GBのモデル)の音声認識を利用して、その認識結果をワードプレスに送る形で入力して作成しました。全てキーボードで入力するのに比べればはるかにスムーズにブログが書くことができると思います。

今回Voskを試した僕のPC環境

今回試したPC環境は、OSはWindows 11のHome Editionで搭載しているメモリーは8GBになります。詳細は下記の通りです。今回試したPC環境ではストレスなく音声入力することができました。

デバイス名 LAPTOP-3L4S4QJ4
プロセッサ Intel(R) Core(TM) i5-8265U CPU @ 1.60GHz 1.80 GHz
実装 RAM 8.00 GB (7.77 GB 使用可能)
システムの種類 64 ビット オペレーティング システム、x64 ベース プロセッサ

音声をテキストに変換する際の変換精度とレスポンス

Voskで日本語を音声認識する場合は50MBのモデルと1GBのモデルを選択することができます。
そこでまずはモデルのサイズによる違いを見ていきたいと思います。

1.1GBのモデル VS 50MBのモデル

テストは公平に行うために、モデルサイズ50MBで認識するアプリとモデルサイズ1GBで認識するアプリを同時に起動して同じタイミングで話して音声認識させてみました。

原文:
公平にテストするために同時にマイクに話して音声認識のテストをしています

上:1GBのモデル、下:50MBのモデル

1GBのモデルの方は正確に音声認識してくれました。一方で50MBの方は僕の発音が不明瞭な部分があるのかもしれませんが僕の意図した内容とは結構違って認識されています。Voskの音声認識を使って文章を書くことを考えた場合は1GBのモデルを選択した方がよさそうです。
50MBの方は音声アシスタントとかそういった使用方法であれば使えるのかもしれませんが、記事作成とかには向かないのではないかなと思います。

また上のテスト結果の左の時刻は最終的な音声認識の結果が返ってきた時刻になります。
音声認識の結果が返ってくるまでの時間は大体0.5秒ぐらい50MBの方が早いことが多いです。
ただ0.5秒でこの変換精度の差であれば基本的には1GBのモデルを使用する方がいいのかなと思います。

次はGoogleの音声認識とVosk(モデルサイズ1GB)の音声認識で比較していきたいと思います。

2.Voskの音声認識(1GB) vs Googleの音声認識(Web Speech API)

ここまでこの記事をVoskの音声認識を使って書いてきて、Voskの音声認識も一般的な言葉を使った文書であれば十分に正確に音声認識できることがわかったので、次は固有名詞などあまり一般的ではない単語も含めて音声認識のテストをしていきたいと思います。

原文
今日の給食の献立はしょうゆご飯、けんちん汁、タレカツ、春雨サラダになります。

Voskで音声認識:
今日の給食の献立は醤油ご飯けんちん汁タレカツ春雨サラダになります

Googleの音声認識(Web Speech API):
今日の給食の献立は醤油ご飯けんちん汁タレカツ春雨サラダになります

この程度であればどちらも正確に音声入力できます。
次は新潟にある公園の名前を使って音声認識のテストをしてみます

原文:
先週の日曜日は天気が良かったので、少し距離はありますが、上堰潟公園に行ってきました。

Voskで音声認識:
先週の日曜日は天気が良かったので少し距離はありますが噂キー型公園に行ってきました

Googleの音声認識(Web Speech API):
先週の日曜日は天気が良かったので少し距離はありますが上堰潟公園に行ってきました

テストで使用した公園の名前は全国的にはあまり有名ではないのですがGoogleの音声認識の方は正確に音声認識してくれました。一方でVoskの音声認識の方は公園の名前は正確に認識してくれませんでした(それ以外は正確に認識してくれました)。

次は適当にいくつかテーマパークや公園の名前を音声認識させてテストしてみたいと思います。

テーマパークや公園の名前でVosk(1GB)とGoogleの音声認識を比較

名称Voskの音声認識Googleの音声認識
東京ディズニーランド東京ディズニーランド東京ディズニーランド
ユニバーサルスタジオジャパンユニバーサルスタジオジャパンユニバーサルスタジオジャパン
妙高サンシャインランド妙高サンシャインランド妙高サンシャインランド
サントピアワールドサントピアワールドサントピアワールド
昭和記念公園昭和記念公園昭和記念公園
葛西臨海公園葛西臨海公園葛西臨海公園
上信越高原国立公園上信越高原国立公園上信越高原国立公園
県立紫雲寺記念公園県立紫雲寺記念公園県立紫雲寺記念公園
秋葉公園秋は公園秋葉公園
西川ふれあい公園西川ふれあい公園西川ふれあい公園
テーマパークや公園の名前で音声認識のテスト

Googleの音声認識の方はすべて正確に音声認識してくれました。一方でVoskの音声認識の方は一つ間違えましたがそれ以外は問題なく音声認識できました。
次はアルファベットを含む言葉や数字を含む言葉で試してみたいと思います。

○アルファベットや数字でVosk (1GB)とGoogleの音声認識を比較

テストする内容VoskGoogleの音声認識
AmazonアマゾンAmazon
WindowsウインドウズWindows
GoogleGoogleGoogle
MicrosoftMicrosoftMicrosoft
ABCABCABC
XYZXYZXYZ
10円十円10円
20円二十円20円
100円百円100円
110円百十円110円
1010
20二十20
40四十40
100100
110百獣110
アルファベットを含む言葉や数字で音声認識のテスト

Googleの音声認識の方は僕の期待した通りにテキストへ変換してくれます。

一方でVoskの音声認識の方は、

  • アルファベットに変換してほしいところがカタカナに変換される
  • アルファベットは全角文字のアルファベットになる
  • 数字はアラビア数字じゃなく漢数字になることが多い
  • 数字の音声認識はちょっと苦手

アルファベットに変換してほしいところがカタカナに変換されたり、アルファベットはアルファベットでも全角文字になっていたりしていますが、この辺はアプリケーション側で「認識した文字」を「実際に変換したい文字」に置き換える補正処理や、全角文字を半角文字に置き換える処理を実装すれば問題ありません。
ただエクセルなどの一覧表にどんどん数値を音声で入力していくというような使い方には向いてなさそうです。

続いてGoogleの音声認識(Web Speech API)とVoskの音声認識のレスポンスの違いを比べてみたいと思います。こちらは同時にマイクに話して音声認識の最終結果が返ってくる時刻を比較しました。

○同時にマイクに話して音声認識結果が確定した時刻の比較

テストに利用した文書(言葉)Vosk (1GB)Google
今日は手作りのアイスクリームを子供と一緒に作って食べてみました15時21分30.183秒15時21分29.122秒
子供は手作りのレベルではないととても喜んでいました15時23分59.93秒15時23分58.79秒
りんご15時25分48.974秒15時25分48.397秒
みかん15時26分41.268秒15時26分40.274秒
※Google (Web Speech API)は音声認識のパラメーター「continuous」は「false」(Sokki Voiceでいうところの一言モード)でテスト

Googleの音声認識とVoskの音声認識を比較すると約1秒Googleの方が最終認識結果が返ってくるのが早いです。Voskの音声認識の方はGoogleのそれと比較するとちょっと遅いけど十分に実用的なレベルだと言えると思います。

ここまでの音声認識の精度の確認についてはヘッドセットのマイクを使って確認してきました。
続いてPCに初めから付いている内蔵マイクだとどうなるか確認してみました。

エレコムのマイク(千円程度で購入したもの、正確な値段は忘れました)

Voskの音声認識 (1GB) vs Googleの音声認識 (内蔵マイクを使った場合、静かな場所)

まずは静かな環境でPCに内蔵しているマイクを使って比較してみました。
結果はどちらも正確に音声認識をして差は出ませんでした。

原文:
公平にテストするために同時にマイクに話して音声認識のテストをしています

Vosk:
公平にテストするために同時にマイクに話して音声認識のテストをしています

Google:
公平にテストするために同時にマイクに話して 音声認識のテストをしています

次にノイズの多い環境でテストしてみました。

Voskの音声認識(1GB) vs Googleの音声認識 (内蔵マイクを使った場合、ノイズが多い環境)

次にVoskの音声認識とGoogleの音声認識で差を出す為にあえて意地悪な環境(リビングのガチャガチャしている環境)でPCの内蔵マイクを使用して音声認識を行ないました。

原文:
公平にテストするために同時にマイクに話して音声認識のテストをしています

Vosk(1回目):
ホームテストするために同時にマイクに話で音声認識のをしています

Vosk(2回目):
公平にテストするために童話風に舞いに話で音声認識のテストをしています

Google(1回目):
縫製にテストするために同時にマイクに話して音声認識のテストをしています

Google(2回目):
公平にテストするために同時にマイクに話して音声認識のテストをしています

静かな環境ではPCの内蔵マイクを使用した場合もVoskとGoogle共にどちらも正確に音声認識できたのですが、ノイズの多い環境で比較するとGoogleの音声認識の方が認識率が高かくなっていました。

Voskのテキストに変換する際の特徴

  • 音声認識の変換精度は高い(1GBを使用した場合)
  • 数字を漢数字で認識することが多い
    例えば「二千二十三年」という風に漢数字で認識されることが多いです
  • アルファベットは全角文字で認識される

数字を漢数字で認識したりアルファベットが全角文字で認識されるという点に関してはアプリケーションを開発する側の人でアラビア数字に変換したり全角文字を半角文字に変換することはそんなに難しくないのであまり大きな問題ではないとは思います。

次にVoskを使ったデスクトップアプリをC#で作ってみて僕が思ったメリットとデメリットについてまとめてみたいと思います。

今回試して感じたVoskのいいところ

  1. ローカルの環境で音声認識できるためセキュリティ面で安全、情報漏洩のリスクがない
    やっぱり何といってもVoskのいいところはここに尽きると思います
  2. 1GBのモデルを利用すれば十分な音声認識の精度で音声で文章の作成ができる
    今回のこの記事は約90%はVoskの音声入力を使って書きましたがストレスなく音声入力することができました。
  3. マイクで話した内容を音声認識する以外にも音声ファイルをステレオで再生せずともテキストに変換することができる
  4. 議事録を作成するような使い方をする場合は、話した人を識別するためのモデルも利用できる
    ※ここについては十分に試すことができていませんが、話した人の声の特徴が数値の配列として返ってきます。その配列を元に誰が話したかを特定する処理を自分で実装する必要があるようです。

僕の感じたVoskのあともう一つというところ

  1. VoskをWindowsのデスクトップアプリとして使う場合は、実行環境として.NET6もしくは.NET5の実行環境が必要
    .NET6や.NET5はMicrosoftが公式に公開しているのでダウンロードとインストールすること自体は簡単ですが、僕が知っているWindowsの大抵のデスクトップアプリは対象のアプリだけインストールすれば使えるものが多いのでちょっと面倒くさいなと感じてしまいます。

    .NET6は一度インストールすればいいので、今後.NET6が必要なアプリケーションが増えてくれば特に気にならなくなるかもしれませんが、僕としてはやっぱり初めからWindowsにインストールされている.NETFrameworkでもVoskが使用できるようになることを期待しています

    .NET6や.NET5は自分でMicrosoftのサポート期間を把握して必要に応じて更新する必要があります
  2. 十分な認識精度を獲得しようとするとアプリケーションのサイズが1GB以上になる
    十分な音声認識の精度を獲得しようとすると50MBのモデルではなく1GB(解凍すると1.5GB程度)のモデルが必要になるため、かなりサイズの大きいアプリになってしまいます。
    例えばベクターから公開しようとした場合、公開するファイルのサイズはCD-ROM1枚に収まる程度(~700MB)にしてほしいとあるのですが、これを大きく超えています。なのでこのアプリケーションを公開しようとする時は1GBのモデルはベクターからは公開できないと思います。

    ※先日僕のソフトの開発環境であるVisual StudioをVisual Studio 2019からVisual Studio 2022に変更しましたが、その際にVisual Studio 2019をアンインストールしたところ容量が21.3GB増えました。なのでそれに比べれば全然小さいサイズなのかなと思います。
  3. 1GBのモデルを使用した場合アプリの消費メモリが~1.6GB程度になる
    僕のPCの場合はアプリを起動した直後は使用するメモリーが1.6GB程度になることが多いです。しばらく使っていると500MB程度まで下がることもありますが、アプリの消費メモリはかなり多くなってしまいます。
    1GBのモデルを使う場合は最低でもPCに8GBのメモリが搭載されてる必要があると思います。
  4. ローカルで音声認識するため使用するPCによってパフォーマンスが違ってくる可能性がある
    今回テストで利用した僕のPCはWindows 11です。特別スペックが高いパソコンではありませんが、比較的スペックの高いパソコンと言えると思います。もっとスペックの低いPCでどのように動作するかについてはまだテストしていません。
  5. 音声認識の結果が返ってくるまでの間がちょっと気になる(レスポンスがちょっと遅い)
    音声認識をテキストの入力に利用するという使い方の場合は十分に実用的なレスポンスだとは思います。ただショートカットキーの操作を音声で行なうための音声コマンドとして利用するにはレスポンスが少し遅いと思います。
  6. エクセルなどの表に数値をどんどん入力していくというような使い方には向いていない
    数値の音声認識についてはちょっと苦手で、レスポンスもちょっと遅めなので表に数値をどんどん入力していくというような使い方にはあまり向いていないと思います。

まとめ

Voskは守秘義務の観点からオンラインの音声認識を使うことができない人にはとても魅力的なAPIです。
一方でオンラインで音声認識をすることが特に問題ない人にとっては、Googleの音声認識を利用したSokki Voiceの方が「音声認識の精度」、「レスポンス」、「導入の手軽さ」という点で優れているのでSokki Voiceの方がおすすめです。

Sokki Voiceは下のリンクからダウンロードできます。

話してパソコン入力 via the Webの詳細情報 : Vector ソフトを探す!
Googleの音声認識を利用して直接Windowsの任意のアプリに音声入力できる 操作も簡単

そうは言ってもオンラインの音声認識を使えないので、やっぱりどうしてもオフラインで音声入力をしたいという方はお問い合わせいただければ相談に乗りたいと思います。

お問い合わせはこちらから

今回作ったアプリケーションは自分で使えればいいというレベルでざっくり作っているので他の人に使ってもらうようにするためには、色々手を加える必要があるという状態です。

これからC#でVoskを利用したアプリを作成しようと思っている方へ

僕がC♯で今回のVoskを利用したアプリを作成する上でのポイントについて簡単に書いておきます。

Voskの利用方法については下記の公式のウェブサイトに説明してあります。C#での利用方法も記載してあります。

VOSK Offline Speech Recognition API
Accurate speech recognition for Android, iOS, Raspberry Pi and servers with Python, Java, C#, Swift and Node.

C#でVoskを利用する際のポイント

  1. Voskは.NETFrameworkでは利用できない為.NET5や.NET6を利用する必要がある(今のところ)。
  2. Visual Studioを使ってる場合はNuGetを使用してVoskを簡単にインストールすることができます。
  3. VoskのAPIの使用方法についてはデモ用のソースコードを参照しました。
  4. 音声認識モデルをダウンロードして、エグゼファイルと同じ場所に「model」フォルダを作成して
    ダウンロードしたZipファイルを解凍してその中身をコピーする(下図を参照)。
    ※モデルのインスタンスを作成する時にModel model = new Model(“model”);とした場合。
  5. Voskの音声認識に音声データを渡す際には16000hz、1チャンネル(モノラル)にする必要がある。
  6. 音声認識の精度を良くするためには話し終わったタイミングで最終結果を取得するように調整する必要があります。僕が今回ためした方法は、
    • マイクが音声を検出したを取得するために、PartialResult()を利用
      話し始めた直後に最終結果を取得しないようにするために、僕はPartialResult()を利用してマイクが音声した検出した時間を取得してそこから0.7秒間は FinalResult()は使用しないようにしました。
    • 音声認識が固まらないようにするために、Result()を利用
    • 確定した結果を入力する際には、FinalResult()を利用
    • ノイズは音声として検出することがあるので、ノイズと思われる変換結果に対しては前処理で削除しました
デモ用のソースコードを使う場合は、エグゼファイルと同じ場所に「model」フォルダを作成して、解凍した中身をmodelフォルダーに入れる

コメント

タイトルとURLをコピーしました