0.忙しい人向けまとめ
- TORGOでは、同じ単語や文章が学習データとテストデータに含まれやすい
- この問題をプロンプト重複という
- プロンプト重複があると、未知の発話を認識したのか、学習時に見た発話内容を利用しただけなのか判断しにくい
- NP-TORGOは、学習・検証データとテストデータのプロンプトが重複しないようにTORGOを分割したものである
- 同じテスト音声を使用しても、重複を除いたNP-TORGOではWERが大幅に悪化した
- 構音障害音声認識の新たなベンチマークに!
NP-TORGOは、既存のTORGOに対して、プロンプトが重複しない学習・検証・テスト分割を定義したものです。
1.はじめに
音声認識モデルを評価するときは、通常、学習時に使用していない音声をテストデータとして使用します。
しかし、音声ファイルそのものが異なっていても、読み上げている単語や文章が同じ場合があります。
例えば、次のようなデータ分割を考えます。
学習データ
F03: "GOOD MORNING"
M03: "THANK YOU"
テストデータ
F01: "GOOD MORNING"
学習データとテストデータでは話者が異なります。そのため、音声ファイルも同一ではありません。
一方で、GOOD MORNINGという発話内容は重複しています。
この条件で高い認識精度が得られたとしても、
モデルは未知の発話内容を認識できたのか?
それとも、学習時に見た文章を利用しただけなのか?
という疑問が残ります。
この問題に着目した研究が、今回紹介する次の論文です。
Macarious Hui, Jinda Zhang, Aanchan Mohan
“Enhancing AAC Software for Dysarthric Speakers in e-Health Settings: An Evaluation Using TORGO”
本論文では、TORGOのプロンプト重複を取り除いた評価用分割であるNP-TORGOが提案されています。さらに、プロンプト重複の有無によって構音障害音声認識の性能がどの程度変化するかが検証されています。
- 論文:Enhancing AAC Software for Dysarthric Speakers in e-Health Settings: An Evaluation Using TORGO
- 公式GitHubリポジトリ:SlangLab-NU/np-torgo
2.TORGOとは
TORGOは、構音障害者と健常者の英語音声を収録した音声コーパスです。
構音障害話者には、筋萎縮性側索硬化症(ALS)または脳性麻痺(CP)のある話者が含まれています。
論文で使用されている構音障害話者は8名です。
| 重症度 | 話者 |
|---|---|
| Severe | F01、M01、M02、M04 |
| Moderate/Severe | M05 |
| Moderate | F03 |
| Mild | F04、M03 |
このほかに、7名の健常話者の音声が含まれています。収録内容には、孤立単語、文章、写真の説明などがあります。
TORGO全体には16,394件のテキストエントリがありますが、異なるテキストは957種類しかありません。また、発話の約75%は孤立単語です。
つまり、多くの話者が同じ単語や文章を読み上げています。
3.TORGOにおけるプロンプト重複
本記事におけるプロンプトとは、話者が読み上げる単語や文章などの発話内容を指します。
論文では、各構音障害話者の発話内容が、他話者のデータとどの程度重複しているかを調査しています。
| 話者 | 重症度 | 発話数 | プロンプト重複率 |
|---|---|---|---|
| F01 | Severe | 228 | 100.0% |
| M01 | Severe | 739 | 99.1% |
| M02 | Severe | 772 | 98.2% |
| M04 | Severe | 659 | 98.2% |
| M05 | Moderate/Severe | 610 | 98.9% |
| F03 | Moderate | 1,097 | 95.7% |
| F04 | Mild | 675 | 98.6% |
| M03 | Mild | 806 | 99.7% |
すべての話者で、プロンプト重複率が95%を超えています。F01については100%であり、すべての発話内容が他話者のデータにも存在します。
プロンプト重複の何が問題なのか
TORGOでは、評価対象となる話者をテストデータにし、残りの話者を学習データとして使用するLeave-One-Speaker-Out評価がよく行われます。
この方法では、テスト話者の音声そのものは学習データに含まれません。
しかし、別の話者が同じ文章を発話している場合、その文章は学習データに含まれます。
通常の話者分割
学習側
├── F03: "GOOD MORNING"
├── F04: "GOOD MORNING"
└── M03: "THANK YOU"
テスト側
└── F01: "GOOD MORNING"
↑
発話内容が重複
音響モデルだけでなく、学習データの書き起こしから作成した言語モデルや誤り訂正モデルを使用すると、この影響はさらに大きくなる可能性があります。
論文では、ASRの誤り訂正モデルが認識結果を適切に修正するのではなく、学習済みの正解文を出力してしまう例が報告されています。
話者が異なるだけでは、必ずしも発話内容が未知であるとは限りません。
話者非依存の音声認識性能と、未知プロンプトに対する汎化性能は分けて考える必要があります。
4.NP-TORGOとは
NP-TORGOは、No-Prompt-Overlap TORGOの略です。
TORGOの音声から、学習・検証データとテストデータの間で同じプロンプトが重複しないようにサンプルを選択したものです。
NP-TORGO
学習側
├── F03: "GOOD MORNING"
└── M03: "THANK YOU"
テスト側
└── F01: "OPEN THE DOOR"
学習側とテスト側で発話内容が重複しない
4.1.話者の分割方法
NP-TORGOでは、Leave-One-Speaker-Out方式が採用されています。
基本的な分割は次のとおりです。
- 評価対象の話者をテスト話者にする
- テスト話者がF03以外の場合、F03を検証話者にする
- F03をテストする場合、F04を検証話者にする
- 残りの構音障害話者と健常話者を学習に使用する
例えば、F01を評価する場合は次のようになります。
Test : F01
Validation : F03
Train : F01とF03以外の話者
4.2.プロンプトを単純に削除すればよいのか
テストデータに含まれるプロンプトを、すべて学習データから削除すれば、重複をなくすことはできます。
しかし、TORGOでは同じプロンプトが多くの話者に使用されています。そのため、単純に削除すると学習データが大幅に減少します。
反対に、テストデータを削りすぎると、評価に使用できる発話数が少なくなります。
そこで本研究では、混合整数線形計画法を用いて、学習データとテストデータの両方をできるだけ多く残す組み合わせを探索しています。
5.混合整数線形計画法による分割
論文では、各プロンプトを、
- 学習側に残す
- テスト側に残す
- 使用しない
のいずれかに割り当てます。
主な条件は次のとおりです。
- 同じプロンプトを学習側とテスト側の両方に入れない
- テストデータを一定量以上残す
- 条件を満たしながら、残るデータ数を最大化する
テストデータについては、元のデータの少なくとも55%を残す制約が設定されています。
また、孤立単語と文章ではデータの分布が異なるため、それぞれを別々に最適化してから統合しています。
実装にはGoogle OR-ToolsのpywraplpとSCIPソルバが使用されています。
最適化後には、学習側のプロンプトが約63.3~64.3%、テスト側のプロンプトが約55.0~55.2%残りました。
NP-TORGOでは、すべてのTORGO音声を残しているわけではありません。
プロンプト重複を防ぐため、一部の学習音声とテスト音声が除外されます。
6.プロンプト重複を除くとWERはどうなるのか
論文では、wav2vec2-xlsr-53をTORGOでファインチューニングし、通常のTORGOとNP-TORGOの性能を比較しています。
ここで重要なのは、通常のTORGOについても、NP-TORGOと同じ約55%のテスト音声を使用した結果が示されている点です。
つまり、次の2条件を比較できます。
- TORGO 55% Test:テスト音声はNP-TORGOと同じだが、学習側には重複プロンプトが存在する
- NP-TORGO:テスト音声は同じで、学習側から重複プロンプトを除いている
結果は次のとおりです。
| 話者 | 重症度 | TORGO 55% Test | NP-TORGO |
|---|---|---|---|
| F01 | Severe | 47.27% | 80.00% |
| M01 | Severe | 43.28% | 85.07% |
| M02 | Severe | 55.21% | 90.43% |
| M04 | Severe | 65.81% | 93.75% |
| M05 | Moderate/Severe | 56.20% | 90.38% |
| F03 | Moderate | 25.43% | 65.14% |
| F04 | Mild | 4.46% | 45.06% |
| M03 | Mild | 3.76% | 45.21% |
すべての話者で、NP-TORGOのWERが大幅に悪化しています。
特に、軽度話者の結果が印象的です。
F04では、プロンプト重複がある条件でWERが4.46%だったのに対し、NP-TORGOでは45.06%まで悪化しています。M03でも、3.76%から45.21%へ悪化しています。
テスト音声は同じであるため、この差を「NP-TORGOのテスト音声が難しいから」と説明することはできません。
学習データから重複プロンプトを除いたことが、認識性能に大きく影響していると考えられます。
NP-TORGOのWERが高いことは、NP-TORGOの品質が低いことを意味しません。
従来の評価で利用できていた「発話内容の重複」という近道を使えなくなったため、未知プロンプトに対する本来の難しさが表れたと考えられます。
7.重症度・発話形式別の結果
論文では、孤立単語と文章を分けた評価も行われています。
NP-TORGOにおけるファインチューニング済みwav2vec2-xlsr-53の結果は次のとおりです。
| 重症度 | Isolated Word WER | Sentence WER |
|---|---|---|
| Severe | 93.9% | 83.8% |
| Moderate | 93.9% | 68.6% |
| Mild | 68.4% | 35.6% |
孤立単語では、すべての重症度で非常に高いWERとなっています。
文章では、前後の単語から内容を推測できますが、孤立単語には文脈がほとんどありません。そのため、未知プロンプトを認識する難しさがより強く表れたと考えられます。
論文では、LibriSpeechから構築した言語モデルや、Whispering-LLaMAによる誤り訂正も評価されています。これらは文章認識を改善する場合がある一方、孤立単語認識の改善は限定的でした。
8.公開されているデータとコード
公式GitHubリポジトリでは、次のものが公開されています。
np-torgo/
├── linear_programming_data_selection.ipynb
├── evaluation/
├── train/
│ ├── train.py
│ ├── predict_and_evaluate.py
│ ├── torgo.csv
│ ├── training_args.json
│ └── Dockerfile
└── README.md
主な役割は次のとおりです。
| ファイル | 内容 |
|---|---|
linear_programming_data_selection.ipynb |
プロンプト重複を除くデータ選択 |
train.py |
wav2vec 2.0のファインチューニング |
predict_and_evaluate.py |
推論とWERの計算 |
torgo.csv |
音声パス、書き起こし、分割情報 |
training_args.json |
Hugging Face Trainerの学習設定 |
学習
話者を指定して学習を行います。
python3 train.py F01
この場合、F01がテスト話者として扱われます。
プロンプト重複を除かない条件を実行する場合は、--keep_all_dataを指定します。
python3 train.py F01 \
--keep_all_data \
--repo_suffix _keep_all
評価
python3 predict_and_evaluate.py F01
評価スクリプトでは、学習・検証・テストデータのWERが計算され、予測文と正解文がCSVに保存されます。
10.CSVから分割を作成する
F01をテスト話者、F03を検証話者とする場合、pandasでは次のように分割できます。
import pandas as pd
df = pd.read_csv("torgo.csv")
test_speaker = "F01"
valid_speaker = "F03"
train_df = df[
(~df["speaker_id"].isin([test_speaker, valid_speaker]))
& (df["test_data"] == 0)
].copy()
valid_df = df[
(df["speaker_id"] == valid_speaker)
& (df["test_data"] == 0)
].copy()
test_df = df[
(df["speaker_id"] == test_speaker)
& (df["test_data"] == 1)
].copy()
print(f"Train : {len(train_df)}")
print(f"Validation : {len(valid_df)}")
print(f"Test : {len(test_df)}")
F03をテスト話者にする場合は、検証話者をF04へ変更します。
valid_speaker = "F04" if test_speaker == "F03" else "F03"
公式コードでも、同様の条件で話者を分割した後、test_data列を使ってプロンプト重複を除いています。
11.NP-TORGOから分かること
この研究は、構音障害音声認識において、
高い認識性能は、本当に未知の発話に対する性能なのか?
という評価の前提を問い直しています。
通常のTORGOでは、軽度話者に対して数%という非常に低いWERが得られていました。しかし、同じテスト音声を使用したまま学習側の重複プロンプトを除くと、WERは40%以上まで悪化しました。
このことから、構音障害音声認識を評価する際は、少なくとも次の点を区別する必要があります。
- 未知話者への汎化
- 未知音声への汎化
- 未知プロンプトへの汎化
話者が異なっているだけでは、発話内容まで未知であるとは限りません。
12.まとめ
本記事では、TORGOのプロンプト重複問題と、それを解決するために提案されたNP-TORGOについて解説しました。
NP-TORGOの特徴をまとめると、次のようになります。
- TORGOの学習・検証・テスト間からプロンプト重複を取り除く
- Leave-One-Speaker-Out方式を維持する
- 混合整数線形計画法によってデータ損失を抑える
- テストデータを元の55%以上残す
- 重複を除くと、すべての話者でWERが大幅に悪化する
- 分割情報と実験コードが公開されている
NP-TORGOは、従来のTORGO評価が未知発話への性能を過大評価していた可能性を示しています。
構音障害音声認識モデルを実環境で利用するには、学習時に見た発話内容だけでなく、未知の単語や文章も正しく認識できる必要があります。
その意味でNP-TORGOは、構音障害音声認識の汎化性能をより厳密に評価するための重要なベンチマークだと考えられます。
筆者も現在、NP-TORGOの分割を用いて構音障害音声認識の研究を行っています。今後は、関連した研究についてもまとめたいと思います。