Tech Blog
  • HOME
  • Blog
  • jiwerを使った音声認識精度(音声認識率)の計測方法

jiwerを使った音声認識精度(音声認識率)の計測方法

公開日:2024.01.24 最終更新日:2024.04.01
f:id:amivoice_techblog:20210115094116p:plain 安藤章悟

みなさま、こんにちは。

Pythonで動作するjiwerというライブラリを使って音声認識精度を計測する方法について説明します。

jiwerの公式ページはこちらです。https://jitsi.github.io/jiwer/

前提条件

  • Pythonの知識・実行環境が必要です。
  • 今回の説明・動作確認に使用した jiwer のバージョンは3.03です。
  • 音声認識精度には「文字単位で計測する場合」と「単語単位で計測する場合」がありますが、今回の説明ではすべて文字単位で計測しています。
  • 今回の内容について動作保証やサポートは出来かねますのでご了承ください。

音声認識精度(音声認識率)について

音声認識エンジンの性能を表す主要な定量指標の1つで、音声認識結果の「正確さ」を示します。

正解文と音声認識結果文が完全に一致したら音声認識精度は100%となります。正解文と音声認識結果文に差異がある場合、その文字数に応じて音声認識精度は低下していきます。

詳しくはこちらの記事で解説しています。


jiwerを使った音声認識精度の計測

jiwerのインストール

まずはjiwerをインストールします。
公式ページの説明( https://jitsi.github.io/jiwer/ )ではpoetryとpipの両方のインストール方法が記載されていますので、お好きな方でインストールするといいでしょう。

$ poetry add jiwer
$ pip install jiwer

pipを使う場合はPython 3.7以上と記載されているのでご注意ください。

音声認識精度を計測するサンプルコード

今回準備したサンプルコードはこちらです。

import jiwer

reference = "お世話になっております"
hypothesis = "お世話んなっとりますー"

output = jiwer.process_characters(reference, hypothesis)
print(f"正解文の文字数: {output.hits + output.substitutions + output.deletions}")
print(f"正解した文字数: {output.hits}")
print(f"置換誤り文字数: {output.substitutions}")
print(f"挿入誤り文字数: {output.insertions}")
print(f"削除誤り文字数: {output.deletions}")
print(f"エラー率: {output.cer*100}")
print(f"音声認識精度: {(1-output.cer)*100}")

referenceが正解文、hypothesisが音声認識結果です。この2つをjiwer.process_characters()に入力し、結果をprintで表示しています。

実行すると次のような結果が出力されました。

正解文の文字数: 11
正解した文字数: 8
置換誤り文字数: 2
挿入誤り文字数: 1
削除誤り文字数: 1
エラー率: 36.36363636363637
音声認識精度: 63.63636363636363

結果を簡単に説明したものが以下です。

  • 正解文の文字数:「お世話になっております」の文字数で、11文字
  • 正解した文字数:「お世話んなっとりますー」のうち正解文と一致した文字数で、8文字
  • 置換誤り文字数:正解文と違う文字が音声認識結果に出現した数で、2文字
  • 挿入誤り文字数:正解文に無いのに音声認識結果に出現した数で、1文字
  • 削除誤り文字数:正解文にあるのに音声認識結果に出現しなかった数で、1文字
  • エラー率:誤り文字数の合計を正解文の文字数で割ったもの (1+1+2)÷11 ≒ 36.36%
  • 音声認識精度: 100%から文字エラー率を引いたもの。100%-36.36%=63.64%

音声認識精度の視覚化

jiwerの visualize_alignment() を使うことで音声認識精度の視覚化をすることができます。
サンプルコードはこちらです。1~6行目までは上述のサンプルと同じで、7行目を visualize_alignment() を使うように置き換えています。

import jiwer

reference = "お世話になっております"
hypothesis = "お世話んなっとりますー"

output = jiwer.process_characters(reference, hypothesis)
print(jiwer.visualize_alignment(output))

実行すると次の結果が出力されました。

sentence 1
REF: お世話になっております*
HYP: お世話んなっと*りますー
        S  SD   I

number of sentences: 1
substitutions=2 deletions=1 insertions=1 hits=8

cer=36.36%

上記は2~4行目で視覚化がされているのですが、どうやらjiwerは日本語の全角文字を想定していないようで表示が崩れてしまっています。
一応、半角文字を全て全角文字に置換すると綺麗に表示されるのでやってみました。

REF: お世話になっております*
HYP: お世話んなっと*りますー
        S  SD   I

見方は下記になります

  • 「S」(substitution:置換誤り)が2箇所で、「に」→「ん」、「て」→「と」に置き換わっています。
  • 「D」(deletion:削除誤り)が1箇所で、「お」が削除されています。
  • 「I」(insertion:挿入誤り)が1箇所で、「ー」が挿入されています。

複数行の視覚化

長い音声などでは音声認識結果が複数行になることもあると思います。その場合、jiwer.visualize_alignment() は配列を入力することもできます。例えばこのようにします。

import jiwer

reference = ["こんにちは","いい天気ですね"]
hypothesis = ["こんばんは","良い元気でしたね"]

print(jiwer.visualize_alignment(output))

結果は下記になりました。
※視覚化部分は見やすくなるように半角文字を全角文字に手作業で置換しています。

sentence 1
REF: こんにちは
HYP: こんばんは
       SS

sentence 2
REF: いい天気で*すね
HYP: 良い元気でしたね
     S S  IS

number of sentences: 2
substitutions=5 deletions=0 insertions=1 hits=7

cer=50.00%

視覚化は行ごとに出力されますが、音声認識精度関連の数値はトータルの値しか取得できないようです。もしも行ごとに音声認識精度や誤り文字数を調べたい時は行ごとに jiwer.process_characters() を実行する必要がありそうです。

jiwerで音声認識精度を計測する時の注意点

jiwerで音声認識精度を計測する際は下記に注意が必要です。

注意点①:発音しない記号も1文字としてカウントされる

句読点や改行や「!」「?」などの発音しない記号も1文字としてカウントされます。

例)
正解:いつもお世話になります。
認識:いつも、お世話になります。

この例の場合「、」が誤挿入となるため音声認識精度は100%にはなりません。また「。」も1文字としてカウントされます。正解文字数が12文字、挿入誤りが1文字になるので音声認識率は (12-1)÷12 ≒ 91.67% となります。
音声認識精度の計測の観点次第ですが、カウントする必要の無い文字はあらかじめ正解文と音声認識結果文の両方から除去しておくといいでしょう。

注意点②:表記の揺れは別の文字としてカウントされる

半角・全角や、大文字・小文字、送り仮名の違い、アルファベットとカタカナの違いなどの表記ゆれは別の文字としてみなされます。

例)
正解:10km
認識:10km ※すべて全角。正解4文字に対して誤置換4文字となり、音声認識精度=(4-4)÷4=0%
認識:10KM ※KMが大文字。正解4文字に対して誤置換2文字となり、音声認識精度=(4-2)÷2≒50%
認識:十km ※漢数字。正解4文字に対して誤置換1文字 誤削除1文字となり、音声認識精度=(4-2)÷2≒50%
認識:10キロメートル ※カタカナ表記。正解4文字に対して誤置換2文字 誤挿入4文字となり、音声認識精度=(4-2-4)÷4=-50%

特に最後の「1キロメートル」は正解文字数よりも多くの誤りが発生してしまい音声認識精度が-50%とマイナスになってしまいます。このような表記の揺れに気づかないと音声認識精度を低く計測してしまうことになるのでご注意ください。

この記事を書いた人


  • 安藤章悟

    音声認識の研究をしていたら、近所に音声認識屋を見つけてしまい入社。今に至る。

    趣味は海外旅行と美味しいものを食べることとサウナ。

    : @anpyan

APIを無料で利用開始