見出し画像

音声認識のアノテーションを効率的に行うための取り組み

あけましておめでとうございます。メディア研究開発センターの山野です。そういえばイブラヒモビッチに憧れてジャンピングボレーシュートを真似した結果、着地に失敗し靭帯を損傷したこともありました。


動機

さて、メディア研究開発センターでは音声認識[1]や音声認識結果の可読性を向上[2]させるための研究を行なっています。そのような研究をするためには多くの高品質なデータが必要であることが一般的には知られています。そこで我々は、独自で構築したデータ収集・アノテーション基盤を活用し、アノテーターの方々と共にデータを作るサイクルを日々回しています。
このデータ収集・アノテーション基盤を通じて得られた人手による音声ラベルは高品質なデータが期待できる一方で、人手によるアノテーションはコストがかかる作業になります。
今回はそのサイクルを効率的に、具体的には教師データを効率的に作るために、大量の未ラベルデータの中からより効果的なデータのサンプルができないか、簡易な実験をしたのでその取り組みを紹介させていただきます。

手法

人手による正解ラベルがついていない音声ファイル(=未ラベルデータ)からCER[3]を直接予測するようなモデルを作り、それをもとにデータ選択をしている先行研究は調査した限りありませんでした。また、現状のアノテーション基盤はランダムサンプルによるデータ選択手法を採用しておりますが、未ラベルデータのCERを直接予測することで、音声認識モデルが苦手とする(≒CERが高い)音声を効率的に抽出することが期待できます。
そのため、今回の取り組みでは、先行研究[4, 5, 6]に倣い音声に関する特徴量をうまく活用しつつ、人手による正解ラベルがついていない音声データに対してCERを直接予測する回帰モデルの構築を目指します。

実験

データセット

音声ファイルに対して以下の特徴量を作成しました。各特徴量の詳細はAppendixに記載したのでもしよければご覧ください。

  • 音声ファイルを入力とした時の、OpenAI/Whisper[7]の出力に対するGPT2[8]によるPPL[9]

  • 音声ファイルを入力とした時の、whisper-timestamped[10]によるConfidence Score

  • 音声ファイルを入力とした時の、OpenAI/Whisperの出力時のloss

  • 再生時間

  • 再生時間に対する出力文字数の比

  • 話者人数

  • 主話者の割合

  • 発話時間

  • 発話時間/再生時間

  • 抑揚の平均

  • F0の平均

  • MFCCの平均

  • SpeechMOS[10]

  • NISQA[11]

    • noi_pred

    • dis_pred

    • col_pred

    • loud_pred

上記の特徴量を付与した14万件のデータを、訓練データ: 検証データ: 評価データ= 7:2:1に分割しました。
なお、人手による正解ラベルとOpenAI/WhisperのMediumモデルの出力からCERを算出しています。また、OpenAI/Whisperの出力はGreedy Searchで出力しており、多くのRepetitionが発生していることが事前の実験により判明しました。そのため、Repetitionが発生している可能性の高い、CERが高い音声は(本実験ではCER > 3.0としました。約97.5%タイル)データセットから除外しています。

モデル構築と実験結果

上記の特徴量を使って、CERを回帰的に予測することを目指していきます。
今回は数行のコードでモデル構築ができるPyCaret[12]を使いました。

実験結果です。

PyCaretによるCER予測モデルの実験結果

Random Forest Regressorが最も性能が良く、平均絶対値誤差は0.1397、決定係数は0.6552という結果になりました。

Feature Importanceは以下の通りです。

Random Forest RegressorモデルのFeature Importance
  • sentence_ratio(再生時間に対する出力文字数の比)

  • ppl_openai_medium(OpenAI/Whisperの出力に対するGPT2によるPPL)

  • confidence_score_openai_medium(whisper-timestampedによるConfidence Score)

などがCER予測の際に重要であることがわかりました。
個人的にはMOSやNISQA、MFCCなどの音響的な特徴量がCER予測においてはあまり寄与しないのは興味深かったです。

まとめ

今回はアノテーションを効率的に行うために、正解ラベルなしでCERを直接予測できるかという問いを立て、ある一定程度の性能を持つモデルを構築することができました。
今後は、CER直接予測モデルとランダムサンプル、どちらの手法がより良いデータ選択手法なのかを実験していきたいと思います。

Appendix

再生時間に対する出力文字数の比

再生時間に対する出力文字数の比 = 文字数/再生時間

分布は以下の通りです。0.0を除き、正規分布の形状と似ていることがわかります。再生時間をもとに大体の文字数を予測できそうです。

話者人数/主話者の割合/発話時間

一つの音声ファイル内で何人が話しているのか、メインで喋っている人はどれぐらい喋っているのか、全員の発話時間を加算した値を算出しました。
pyannote-audioを使って各値を以下のスクリプトで算出しました。

def get_diarize_metadata(pyannote_result):
    speakers = list(set([i["label"] for i in pyannote_result]))
    num_speakers = len(speakers)

    total_speaking_duration = sum([i["segment"]["end"] - i["segment"]["start"] for i in pyannote_result])
    each_duration = {}
    for r in pyannote_result:
        speaker = r["label"]
        if not speaker in each_duration:
            each_duration[speaker] = 0
        each_duration[speaker] += (r["segment"]["end"] - r["segment"]["start"])

    main_speaker = max(each_duration, key=each_duration.get)
    main_speaker_duration = each_duration[main_speaker]

    main_speaker_ratio = main_speaker_duration/total_speaking_duration
    return num_speakers, main_speaker_ratio, total_speaking_duration

なお、デフォルトで提供されているモデルによる算出ですので誤りが含まれています。朝日新聞独自の評価データセットではDERで約30%でした。
分布は以下の通りです。

話者人数
主話者の割合
発話時間

話者数は一人が支配的で、それに伴い主話者の割合も平均が0.9となりました。

SpeechMOS・NISQA


音声合成の評価指標などで使われるSpeech Quality Assesment(音声品質評価)の手法を使って特徴量を作ってみました。

SpeechMOS、NISQAはそれぞれ以下のような分布となりました。

SpeechMOSの分布
NISQAの分布

参考文献

[1]記者に特化した音声認識モデル(Whisper)を作った話, https://note.com/asahi_ictrad/n/nf3ca329f17df

[2]漢数字を洋数字に変換したいだけなのに, https://note.com/asahi_ictrad/n/nac8874059c23

[3]WER & CER for Measuring Performance of Automatic Speech Recognition, https://callzen.ai/blog/resources/technical/wer-cer-for-measuring-performance-of-automatic-speech-recognition/

[4]Unsupervised Active Learning: Optimizing Labeling Cost Effectiveness for Automatic Speech Recognition, https://arxiv.org/abs/2308.14814

[5]Active and Semi-Supervised Learning in ASR: Benefits on the Acoustic and Language Models, https://arxiv.org/abs/1903.02852

[6]Loss Prediction: End-to-End Active Learning Approach For Speech Recognition, https://arxiv.org/abs/2107.04289

[7]Whisperhttps://huggingface.co/openai/whisper-medium

[8]japanese-gpt2-medium, https://huggingface.co/rinna/japanese-gpt2-medium

[8]Perplexity of fixed-length models, https://huggingface.co/docs/transformers/perplexity

[9]whisper-timestamped, https://github.com/linto-ai/whisper-timestamped

[10]SpeechMOS, https://github.com/tarepan/SpeechMOS

[11]NISQA, https://github.com/gabrielmittag/NISQA

[12]PyCaret, https://pycaret.org/