業界・業務から探す
導入目的・課題から探す
データ・AIについて学ぶ
News
Hakkyについて
ウェビナーコラム
◆トップ【AI・機械学習】
プロセスの全体像前処理・特徴量生成Fine Tuning手法まとめ機械学習モデルの選び方モデル評価手法プロトタイピング探索的分析(EDA)
AI

執筆者:Handbook編集部

Whisperを用いた音声認識の文字起こし精度

概要

whisperは2022/09/22にOpenAIが公開した高精度音声認識モデルです。教師付き音声68万時間という膨大なデータ量で訓練しており、英語では商用の音声認識システムや人間の書き起こしに匹敵する性能とのことです。

本記事では、日本語の対話音声データをWhisperを用いて文字起こしした精度をGoogle Cloud の Speech-to-Text APIを用いた場合と比較した結果についてサンプルコードを用いて紹介します。なお、本記事は動作環境としてGoogle Colabを想定しています。

Speech-to-Textについては、Speech-to-Text APIを使った音声認識のチュートリアルを参照してください。

音声ファイルの準備

音声データセットの取得

はじめに音声ファイルと正解の文字起こしテキストを準備する必要があります。今回は精度評価のためのテスト用データとして、料理インタビュー対話コーパスを利用しました。

「料理インタビュー対話コーパス」は、オンラインビデオ通話を用いて、料理ドメインにおける技能者からインタビュアーが料理のコツを積極的に引き出そうとしているインタビュー対話の動画・音声・書き起こしテキストのコーパスです。コーパスの規模は10~15分のインタビュー308対話ありますが、このうち、約9分間の1対話について分析を行いました。

Google Driveのマウント

Google Driveに保存した音声ファイルをGoogle Colaboratryで使用するため、Google Driveのマウントを行います。

from google.colab import drive
drive.mount('/content/drive')

Whisperの音声認識

まずは、whisperをインストールします。

!pip install git+https://github.com/openai/whisper.git

whisperをコマンドラインから実行

whisperを実行する方法は、pythonとコマンドラインの両方ありますが、今回はより手軽に実行できるコマンドラインを用いた方法で行います。

whisperのモデルは、tiny, base, small, medium, largeの順番で性能が高くなり、速度が遅くなります。

実行スクリプト(largeモデルのとき)

!whisper "{音声ファイルへのpath}" --model large --language Japanese -o result

音声認識の精度

whisperのモデルサイズと実行速度

whisperの速度比較のため、Google Colaboratory(以下、Colab)のGPU・CPUとUbuntu 18.04の3つの実行環境を用いました。
各実行環境のマシン性能は以下になります。

実行環境CPU・GPU名 初期メモリ使用量
Colab GPUTesla T40MiB / 15109MiB
Colab CPUIntel(R) Xeon(R) CPU @ 2.20GHzFree:9090MB, inactive:4003Mb, active:313MB
UbuntuQuadro P50005924MiB / 16270MiB

whisperの5つのモデル(tiny, base, small, medium, large)のモデルサイズと約9分間の音声ファイル(.wav)に対する実行時間は以下になりました。

モデル名whisperモデルサイズ実行時間(Colab GPU)実行時間(Colab CPU)実行時間(Ubuntu)
large2.87GB7min 10s未測定7min 58s
medium1.42GB3min 16s168min3min 27s
small461MB1min 28s48min2min 30s
base139MB1min 6s32min57.6s
tiny72.1MB50s26min51.3s

GPUとCPUでは実行速度にかなりの差がでました。
また、音声ファイル(.wav)と動画ファイル(.mp4)では実行速度に差はありませんでした。

文字起こしの評価指標

音声認識の精度測定方法として、単語誤り率(WER)と文字誤り率(CER)が知られています。
これらは、形態素解析を行ったのち、文字と単語の誤り率を計算する方法です。
しかし、今回精度比較のテストに用いた音声データ(9分間で約3400文字)は対話形式のためフィラー表現が多く含まれていることなどが原因で、形態素解析をしたときの音声認識による文字起こしと正解の文字起こしの単語数が合わず、正確に比較ができません。

そこで、2つの文章間の類似度を定量的に評価する手法として、BLUE, ROUGE, BERTScoreの3つを用いて評価を行いました。各評価手法の概要は以下になります。

指標観点
BLEU生成した要約のN-gram中のどれだけが正解とする要約に登場するか(一致率の評価)
ROUGE-N生成した要約と正解とする要約がN-gram単位でどれだけ一致しているか示す(カバー率の評価)
ROUGE-S/ROUGE-SUROUGE-Nで出来なかった、単語の組み合わせ(順番は問わない)で評価
ROUGE-L/ROUGE-W一致する最大のシーケンスで評価
ROUGE-BE文法的な要素間の関係(係り受け)を考慮し評価
BERTScore事前学習されたBERTから得られるベクトル表現を利用して,テキスト間の類似度を計算する評価

whisperとsppech to textの文字起こし精度比較

評価用ライブラリのインストール

! pip install -U ginza ja-ginza
! pip install spacy
! pip install sacrebleu=="1.4.5"
! pip install Pillow==8.0
! pip install mecab-python3==0.996.5
! pip install unidic-lite
! pip install bert_score
! pip install sumeval

評価用スクリプト

import pandas as pd
from bert_score import score
from sumeval.metrics.bleu import BLEUCalculator
from sumeval.metrics.rouge import RougeCalculator

def calc_bert_score(cands, refs):
    """ BERTスコアの算出

    Args:
        cands ([List[str]]): Pillow[比較元の文]
        refs ([List[str]]): [比較対象の文]

    Returns:
        [(List[float], List[float], List[float])]: [(Precision, Recall, F1スコア)]
    """
    Precision, Recall, F1 = score(cands, refs, lang="ja", verbose=True)
    return Precision.numpy().tolist(), Recall.numpy().tolist(), F1.numpy().tolist()

def evaluate_all(predict_file, correct_file, model_name):
    bert_score_p = []
    bert_score_r = []
    bert_score_f = []
    rouge_1_score = []
    rouge_2_score = []
    rouge_L_score = []
    rouge_BE_score = []
    blue_scores = []

    with open(predict_file,encoding="utf-8") as f:
        predicts = f.readlines()
    with open(correct_file,encoding="utf-8") as f:
        corrects = f.readlines()

    P, R, F1 = calc_bert_score(predicts, corrects)
    for p,r, f1 in zip(P, R, F1):
        bert_score_p.append(p)
        bert_score_r.append(r)
        bert_score_f.append(f1)

    for i in range(len(predicts)):
        rouge = RougeCalculator(lang="ja")

        rouge_1 = rouge.rouge_n(
                    summary=predicts[i],
                    references=corrects[i],
                    n=1)

        rouge_2 = rouge.rouge_n(
                    summary=predicts[i],
                    references=corrects[i],
                    n=2)

        rouge_l = rouge.rouge_l(
                    summary=predicts[i],
                    references=corrects[i])

        rouge_be = rouge.rouge_be(
                    summary=predicts[i],
                    references=corrects[i])

        rouge_1_score.append(rouge_1)
        rouge_2_score.append(rouge_2)
        rouge_L_score.append(rouge_l)
        rouge_BE_score.append(rouge_be)


    for i in range(len(predicts)):
        bleu_ja = BLEUCalculator(lang="ja")
        blue_score = bleu_ja.bleu(predicts[i], corrects[i])
        blue_scores.append(blue_score)

    # 出力用のDataFrameを作成
    df = pd.DataFrame(
      list(zip(bert_score_p, bert_score_r, bert_score_f, rouge_1_score, rouge_2_score, rouge_L_score, rouge_BE_score, blue_scores)),
      columns = ["bert_score_p", "bert_score_r","bert_score_f","rouge_1_score","rouge_2_score","rouge_L_score","rouge_BE_score","blue_scores"]
    )

    # 出力
    df.to_csv(f"score/{model_name}_score.csv", mode="w", encoding="utf-8")

評価用スクリプトの実行

# モデル名
model_name = "whisper_large_Interview_1.mp4"

# 正解の文字起こしテキスト
correct_file = "correct.txt"

# 音声認識による文字起こしテキスト
predict_file = f"{model_name}.txt"

evaluate_all(predict_file, correct_file, model_name)

各モデルの精度比較結果

各モデルの精度比較結果は以下の通りです。
評価指標によって若干結果は異なるが、おおむねwhisperのsmallモデル以上はspeech2textよりよいスコアが出ました。

  | モデル名 | bert_score_p | bert_score_r | bert_score_f | rouge_1_score | rouge_2_score | rouge_L_score | rouge_BE_score | blue_scores -- | -- | -- | -- | -- | -- | -- | -- | -- | -- 1 | sppech-to-text | 0.819 | 0.832 | 0.826 | 0.688 | 0.501| 0.623 | 0.324 | 30.37 2 | whisper_tiny | 0.750 | 0.749 | 0.750 | 0.668 | 0.374 | 0.533 | 0.125 | 28.85 3 | whisper_base | 0.779 | 0.770 | 0.775 | 0.723 | 0.481 | 0.629 | 0.164| 37.644 4 | whisper_small | 0.899 | 0.894 | 0.897 | 0.831 | 0.659| 0.781 | 0.467 | 55.29 5 | whisper_medium | 0.876 | 0.869 | 0.873 | 0.819 | 0.643 | 0.777| 0.514 | 50.92 6 | whisper_large | 0.891 | 0.884 | 0.887 | 0.879 | 0.724 | 0.832 | 0.639 | 60.99

まとめ

本記事では、日本語の対話音声データの音声認識による文字起こしについて、「Whisper」を用いた場合と「Speech-to-Text」を用いた場合とで精度比較を行う方法について紹介しました。 結果として、whisperの文字起こし精度はsmallモデル以上ではSpeech-to-Textを上回っていることが分かりました。 今後は、対話以外の音声データによる精度検証や短い音声データを用いて単語誤り率(WER)と文字誤り率(CER)による評価などを行いたいです。

参考

2025年06月13日に最終更新
読み込み中...