【初心者向け】Pythonで簡単に音声認識精度をチェック!

【初心者向け】Pythonで簡単に音声認識精度をチェック! プログラミング

音声認識で出力したテキストの正確性を判定する方法には、いくつかのアプローチがあります。

最も正確にできるのは、手動による確認です。
音声データを聞き、音声認識によって生成されたテキストと比較します。
この方法は時間がかかりますが、テキストの正確性を評価するのに最も確実です。

ただ、それほど正確性が必要とされない場合もあります。
そのような場合は、プログラムでサクッとやってしまいましょう。

Pythonには、便利なライブラリが用意されています。
Word Error Rate (WER)を自動的に計算してくれるのです。

WERについては、次の記事で説明しています。

この記事では、WERを以下のライブラリを用いて算出する方法を解説します。

  • python-Levenshtein
  • Janome

python-Levenshteinは、WERを算出するためのライブラリになります。
そして、WERを算出するには文章が単語に分かれている必要があります。

つまり、分かち書きを行うためにJanomeが必要となるのです。
Janomeは、Mecabよりも簡単に導入できる点が特徴になります。

それぞれのライブラリは、次のコマンドでインストールできます。

pip install python-Levenshtein
pip install janome

これらがインストールできたら、次のコードが動くはずです。

from janome.tokenizer import Tokenizer
import Levenshtein as lev

def wakati(text):
    """
    日本語テキストを分かち書きする。
    """
    tokenizer = Tokenizer()
    return ' '.join(tokenizer.tokenize(text, wakati=True))

def calculate_wer(reference, hypothesis):
    """
    Calculate the Word Error Rate (WER) between a reference text and a hypothesis text.
    """
    distance = lev.distance(reference, hypothesis)
    wer = distance / max(len(reference.split()), len(hypothesis.split()))
    return wer

def read_file(filepath):
    """
    ファイルからテキストを読み込む。
    """
    with open(filepath, 'r', encoding='utf-8') as file:
        return file.read()

# ファイルパスを指定
reference_filepath = 'reference.txt' # 参照テキストのファイルパス
hypothesis_filepath = 'hypothesis.txt' # 仮説テキストのファイルパス

# ファイルからテキストを読み込む
reference_text = read_file(reference_filepath)
hypothesis_text = read_file(hypothesis_filepath)

# 分かち書きを行う
wakati_reference = wakati(reference_text)
wakati_hypothesis = wakati(hypothesis_text)

# WERを計算する
wer = calculate_wer(wakati_reference, wakati_hypothesis)
print(f"WER: {wer:.2%}")

以下のファイルを用いてWERを計算してみましょう。

reference.txt

私は日本人です。 
そして日本語を話します。

hypothesis.txt

私は日本です。 
そして英語を話します。

とりあえず、結果は以下となります。

WER: 27.27%

計算式は、以下です。

wer = distance / len(reference.split())  # 参照テキストの単語数で割る

それぞれの値は、以下。

  • distance:「3」
  • len(reference.split()):「11」

そして、分かち書きの結果は以下。

分かち書き処理済reference.txt

私 は 日本人 です 。  
 そして 日本語 を 話し ます 。

分かち書き処理済hypothesis.txt

私 は 日本 です 。  
 そして 英語 を 話し ます 。

distance:「3」は、次のような解釈だと思われます。

「日本人」から「日本」への変更(削除または置換)→ 1操作
「日本語」から「英語」への変更(置換)→ 2操作

この辺りの解釈は、ライブラリによって異なっています。
JiWER(冒頭で紹介した記事内で利用)では、distanceが「2」となります。

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