openSMILE3.0がリリースされた

# はじめに
この前の記事でSurfboardについて取り上げたが，その時にopenSMILEは少々扱いにくいと説明した．~~あれは嘘だ．~~（当時は嘘ではなかった）
ところが，最近openSMILEがバージョンアップされ，環境に変化があったので，そのことについて整理したいと思う．

# openSMILE (open-source Speech and Music Interpretation by Large-space Extraction)とは？
音声，音楽信号から特徴量抽出できるオープンソースツールキット．
主に感情認識の分野で広く用いられている．
以下，[公式サイト](https://www.audeering.com/opensmile/)から引用．

>openSMILE (open-source Speech and Music Interpretation by Large-space Extraction) is an open-source toolkit for audio feature extraction and classification of speech and music signals. openSMILE is widely applied in automatic emotion recognition for affective computing. openSMILE is completely free to use for research purposes. For commercial use, check out our devAIce™ Technology.

# openSMILE3.0
2020/10/26にversion 2.3から3.0にメジャーアップデートしたと公式ブログから発表があった．
[Introducing openSMILE 3.0](https://www.audeering.com/2020/10/26/introducing-opensmile-3-0/)

主なアップデート内容を[公式サイト](https://www.audeering.com/opensmile/)から引用．

>- **Standalone opensmile-python library**
- New C API with wrappers for Python and .NET
- Modern, revised build process using CMake
- Support for the iOS platform
- Updated Android integration
- FFmpeg audio source component

注目すべき場所は太字で示したPython libraryが導入されたことである．
元々C++で設計されていたが，近年の機械学習分野で広く使用されているPythonの波もあり，今回対応した感じだと思う．
なので，本記事ではこのPython libraryについて簡単に紹介していく．

# 動作手順
基本的に公式GitHub通りなので，そちらで確認できる人はそれで良い．
GitHub: https://github.com/audeering/opensmile-python

## 実行環境
OS: Ubuntu 18.04 LTS
CPU: i7-8700K CPU @ 3.70GHz
メモリ: 32GB
Python version: 3.6.9
opensmile version: 1.0.1

## 1. 必要なライブラリをインストール

```
pip3 install opensmile
```

## 2. 特徴量セット
2020/12/01現在では3つの特徴量セット（表を参照）が用意されている．
表中では5つの名前が存在しているが，version関係もあるので，実質3つである．
また，特徴量は以下の3つの段階から抽出でき，それぞれの数は#featuresで確認できる．

- Low-level descriptors (LDD)
- LLDs with deltas
- Functionals

|  Name  |  #features  |
| ---- | ---- |
|  ComParE_2016  |  65 / 65 / 6373  |
|  GeMAPSv01a  |  5 / 13 / 62  |
|  GeMAPSv01b  |  62 / 13 / 62  |
|  eGeMAPSv01a  |  10 / 13 / 88  |
|  eGeMAPSv01b  |  10 / 13 / 88  |

本記事ではeGeMAPSv01bの特徴量セットで動作確認を行う．

## 3. 実行
早速以下のプログラムを実行すると，データフレーム形式で特徴量が出力されていることがわかる．

```Python
import opensmile

smile = opensmile.Smile(
    feature_set=opensmile.FeatureSet.eGeMAPSv01b,
    feature_level=opensmile.FeatureLevel.Functionals,
)
output_features = smile.process_file('audio.wav')
print(output_features)
```

```:実行結果
                                                                           F0semitoneFrom27.5Hz_sma3nz_amean  ...  equivalentSoundLevel_dBp
file                                               start  end                                                 ...            
audio.wav                                          0 days 00:00:10.240000                          38.952873  ...                 -29.14987

[1 rows x 88 columns]
```
もし，csv形式で保存したいなら


```Python
output_features.to_csv("audio.csv")
```
で保存できる．


また，特徴量名を確認したい場合は

```Python
print(smile.feature_names)
```
をすると，以下のように88種類の特徴量名が表示される．

```:実行結果
['F0semitoneFrom27.5Hz_sma3nz_amean',
 'F0semitoneFrom27.5Hz_sma3nz_stddevNorm',
 'F0semitoneFrom27.5Hz_sma3nz_percentile20.0',
 'F0semitoneFrom27.5Hz_sma3nz_percentile50.0',
 'F0semitoneFrom27.5Hz_sma3nz_percentile80.0',
 'F0semitoneFrom27.5Hz_sma3nz_pctlrange0-2',
 'F0semitoneFrom27.5Hz_sma3nz_meanRisingSlope',
 'F0semitoneFrom27.5Hz_sma3nz_stddevRisingSlope',
 'F0semitoneFrom27.5Hz_sma3nz_meanFallingSlope',
 'F0semitoneFrom27.5Hz_sma3nz_stddevFallingSlope',
 'loudness_sma3_amean',
 'loudness_sma3_stddevNorm',
 'loudness_sma3_percentile20.0',
 'loudness_sma3_percentile50.0',
 'loudness_sma3_percentile80.0',
 'loudness_sma3_pctlrange0-2',
 'loudness_sma3_meanRisingSlope',
 'loudness_sma3_stddevRisingSlope',
 'loudness_sma3_meanFallingSlope',
 'loudness_sma3_stddevFallingSlope',
 'spectralFlux_sma3_amean',
 'spectralFlux_sma3_stddevNorm',
 'mfcc1_sma3_amean',
 'mfcc1_sma3_stddevNorm',
 'mfcc2_sma3_amean',
 'mfcc2_sma3_stddevNorm',
 'mfcc3_sma3_amean',
 'mfcc3_sma3_stddevNorm',
 'mfcc4_sma3_amean',
 'mfcc4_sma3_stddevNorm',
 'jitterLocal_sma3nz_amean',
 'jitterLocal_sma3nz_stddevNorm',
 'shimmerLocaldB_sma3nz_amean',
 'shimmerLocaldB_sma3nz_stddevNorm',
 'HNRdBACF_sma3nz_amean',
 'HNRdBACF_sma3nz_stddevNorm',
 'logRelF0-H1-H2_sma3nz_amean',
 'logRelF0-H1-H2_sma3nz_stddevNorm',
 'logRelF0-H1-A3_sma3nz_amean',
 'logRelF0-H1-A3_sma3nz_stddevNorm',
 'F1frequency_sma3nz_amean',
 'F1frequency_sma3nz_stddevNorm',
 'F1bandwidth_sma3nz_amean',
 'F1bandwidth_sma3nz_stddevNorm',
 'F1amplitudeLogRelF0_sma3nz_amean',
 'F1amplitudeLogRelF0_sma3nz_stddevNorm',
 'F2frequency_sma3nz_amean',
 'F2frequency_sma3nz_stddevNorm',
 'F2bandwidth_sma3nz_amean',
 'F2bandwidth_sma3nz_stddevNorm',
 'F2amplitudeLogRelF0_sma3nz_amean',
 'F2amplitudeLogRelF0_sma3nz_stddevNorm',
 'F3frequency_sma3nz_amean',
 'F3frequency_sma3nz_stddevNorm',
 'F3bandwidth_sma3nz_amean',
 'F3bandwidth_sma3nz_stddevNorm',
 'F3amplitudeLogRelF0_sma3nz_amean',
 'F3amplitudeLogRelF0_sma3nz_stddevNorm',
 'alphaRatioV_sma3nz_amean',
 'alphaRatioV_sma3nz_stddevNorm',
 'hammarbergIndexV_sma3nz_amean',
 'hammarbergIndexV_sma3nz_stddevNorm',
 'slopeV0-500_sma3nz_amean',
 'slopeV0-500_sma3nz_stddevNorm',
 'slopeV500-1500_sma3nz_amean',
 'slopeV500-1500_sma3nz_stddevNorm',
 'spectralFluxV_sma3nz_amean',
 'spectralFluxV_sma3nz_stddevNorm',
 'mfcc1V_sma3nz_amean',
 'mfcc1V_sma3nz_stddevNorm',
 'mfcc2V_sma3nz_amean',
 'mfcc2V_sma3nz_stddevNorm',
 'mfcc3V_sma3nz_amean',
 'mfcc3V_sma3nz_stddevNorm',
 'mfcc4V_sma3nz_amean',
 'mfcc4V_sma3nz_stddevNorm',
 'alphaRatioUV_sma3nz_amean',
 'hammarbergIndexUV_sma3nz_amean',
 'slopeUV0-500_sma3nz_amean',
 'slopeUV500-1500_sma3nz_amean',
 'spectralFluxUV_sma3nz_amean',
 'loudnessPeaksPerSec',
 'VoicedSegmentsPerSec',
 'MeanVoicedSegmentLengthSec',
 'StddevVoicedSegmentLengthSec',
 'MeanUnvoicedSegmentLength',
 'StddevUnvoicedSegmentLength',
 'equivalentSoundLevel_dBp']
```
本来であれば，ここでそれぞれの特徴量についての説明があれば良いが，数が多すぎるので論文を参照してほしい．
[The Geneva Minimalistic Acoustic ParameterSet (GeMAPS) for Voice Research andAffective Computing](https://sail.usc.edu/publications/files/eyben-preprinttaffc-2015.pdf)

また，用語の使い方は従来のopenSMILEと恐らく同様であるので，こちらの論文も参考になると思う．
[音声に含まれる感情を考慮した自然言語対話システム](http://hai-conference.net/proceedings/HAI2014/pdf/P-11.pdf)

smaについてはこちらを参照（リンク先で「sma」と検索）
https://audeering.github.io/opensmile/get-started.html#extracting-your-first-features


# まとめ

- 音声特徴量抽出ツールキットopenSMILE3.0について紹介した．
- Python libraryが用意されているので，以前に比べて使いやすくなった．
- しかし，まだアップデートしたばかりなので機能は少なめ．
- より知りたい人は[DocumentのUsage](https://audeering.github.io/opensmile-python/usage.html)を進めると良いと思う．


# 参考サイト
[The Munich Open-Source Large-Scale Multimedia Feature Extractor](https://github.com/audeering/opensmile)
Appendix openSMILE Standardised Feature Sets
[Desktopアプリケーション開発の技術情報 IS09_emotion](https://so-zou.jp/software/tech/library/opensmile/is09.htm)