SpeechBrain の pretrained モデルを利用して音声感情認識(SER)を試す

音声感情認識(Speech Emotion Recognition, SER)を試した時のメモです。長めの音声をバッチ処理したかったので、API を使わずに試す方法を探しました。

[音声認識/音声合成フレームワーク動向](https://qiita.com/tset-tset-tset/items/6d2399c6cbe96303de38)などから探しています。

# やらなかった案

## 1. PwC のライブラリのとこにあるやつ

[Papers with Code](https://paperswithcode.com/task/speech-emotion-recognition) には Speech Emotion Recognition のタスクページがあり、ライブラリ部分に実装が並んでいます。ただ、最近動いてないリポジトリが多く、今でも簡単に動くものかどうかが怪しく、やめました。

## 2. [espnet/espnet](https://github.com/espnet/espnet) の [IEMOCAP](https://sail.usc.edu/iemocap/) モデル

2023 年 5 月現在、[espnet/espnet](https://github.com/espnet/espnet) の SLU (Spoken Language Understanding) results のコーナーに「Emotion Recognition」があるので、実装があるように見えます。(SLU results のコーナーにある理由はわかりません。)

実際、[IEMOCAP レシピのページ](https://github.com/espnet/espnet/blob/master/egs2/iemocap/asr1/README.md) を見ると「Emotional Labels: anger, happiness, sadness and neutral」での分類評価も記載があるのですが、その下の ASR 評価には pretrained モデルのリンクがあるのに対してそちらにはリンクがありません。pretrained モデルの公開はせずにスコアだけ載せたパターンのようなので、やめました。

## 3. [Hugging Face](https://huggingface.co/) で人気あるやつ

2023 年 5 月現在、[Hugging Face](https://huggingface.co/) の [Audio Classification カテゴリ](https://huggingface.co/models?pipeline_tag=audio-classification)で 2 位の倍以上のダウンロード数なのが、現在 1 位の [ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition](https://huggingface.co/ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition) です。

ただ、[ローカルで動かすにはどうすればいいのかわからないという話題で](https://huggingface.co/ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition/discussions/2)スレッドが盛り上がっており、その割に解決されていなそうだったので、やめました。

[組み込みアプリの利用が多いことが原因なのかどうなのか](https://github.com/ehcalabres/EMOVoice)、ダウンロード数が多い理由はわかりません。

## 4. [NVIDIA/NeMo](https://github.com/NVIDIA/NeMo) の ASR

[NVIDIA/NeMo](https://github.com/NVIDIA/NeMo) 内の [asr_evaluator](https://github.com/NVIDIA/NeMo/tree/main/tools/asr_evaluator) ツールには emotion メタデータを取得する IF があるように見えます。が、実際に [emotion を返す pretrained モデルを見つけることができず、](https://catalog.ngc.nvidia.com/orgs/nvidia/collections/nemo_asr)将来的な機能追加だとみて、やめました。

## 5. [PaddlePaddle/PaddleSpeech](https://github.com/PaddlePaddle/PaddleSpeech) 

[学習方法勉強ノートブック](https://github.com/PaddlePaddle/PaddleSpeech/blob/develop/docs/tutorial/cls/cls_tutorial.ipynb)みたいなのしか見つからなかったので、やめました。

## 6. [coqui-ai/STT](https://github.com/coqui-ai/STT)

なんもなさそうだったのでやめました。

# やった案: [speechbrain/speechbrain](speechbrain/speechbrain)

[Web で試せるアプリ](https://huggingface.co/spaces/harish3110/emotion_detection)が動いていたので、実現可能性が高いと思い、やりました。[アプリのソース](https://huggingface.co/spaces/harish3110/emotion_detection/blob/main/app.py)を見ても、実行部分はほとんど [speechbrain/speechbrain](speechbrain/speechbrain) 側で吸収してくれていそうでした。

[speechbrain/emotion-recognition-wav2vec2-IEMOCAP](https://huggingface.co/speechbrain/emotion-recognition-wav2vec2-IEMOCAP) の説明にある以下のサンプルコード

```python
from speechbrain.pretrained.interfaces import foreign_class
classifier = foreign_class(source="speechbrain/emotion-recognition-wav2vec2-IEMOCAP", pymodule_file="custom_interface.py", classname="CustomEncoderWav2vec2Classifier")
out_prob, score, index, text_lab = classifier.classify_file("speechbrain/emotion-recognition-wav2vec2-IEMOCAP/anger.wav")
print(text_lab)
```

を動かすだけで認識部分は動いたので、あとは長めの音声を渡す部分を作り、無事に試すことができました。

[最終的なノートブックはこちら](https://github.com/tset-tset-tset/hoge/blob/master/SpeechBrain_emotion_recognition_wav2vec2_IEMOCAP.ipynb)です。

感想としては、ラジオ番組のようなテンション高めの会話だとずっとハッピーになってしまったりして、用途を選びそうでした。そもそも [IEMOCAP](https://sail.usc.edu/iemocap/) のデータは英語しかないので、言語の違いも要因かもしれません。