音声認識で出力したテキストの正確性を判定する方法には、いくつかのアプローチがあります。
最も正確にできるのは、手動による確認です。
音声データを聞き、音声認識によって生成されたテキストと比較します。
この方法は時間がかかりますが、テキストの正確性を評価するのに最も確実です。
ただ、それほど正確性が必要とされない場合もあります。
そのような場合は、プログラムでサクッとやってしまいましょう。
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」となります。