見出し画像

Pythonでの音声データの特徴量抽出と可視化方法を解説

瀬戸 シオン Shion Seto
SCSK株式会社
R&Dセンター 技術開発部

本記事ではAmazon AlexaやGoogle アシスタントといった、音声認識技術の基本となる音声の特徴量抽出について解説します。


音声データの読み込み

はじめに音声データを読み込み可視化します。今回はCCOライセンスで誰もが自由に利用可能なデータ「Mozilla Common Voice」を活用しました。 音声データをダウンロードしてtest.wavという音声を用意し、Pythonを用いて以下のようにデータを読み込みます。読み込みにはSciPyというライブラリを利用します。

from scipy.io import wavfile
rate, data= wavfile.read('test.wav')

「rate」にはint型でサンプリング周波数が取得できます。 今回扱うデータの場合は48,000(48kHz) という値が得られ、1秒間につき48,000回サンプリングが行われることを示しています。

「data」にはnumpy.arrayで実際のデータが取得できます。 data.shape[0]は139,392という値で、これはサンプリングした回数を意味します。

139,392/48,000=2.904(秒)

この数値を先ほどのサンプリング周波数で割ると、この音声データが約2.9秒のデータであることがわかります。

音声データを可視化する

以下のコードを使用すると、先ほどの音声データをグラフとして可視化できます。

from matplotlib import pyplot as plt
plt.plot(data)

「data」のdtype(データ型)がint16のため、縦軸は-32768~+32767の幅を持つ値となります。このグラフ画像では実施していませんが、32768で割ると-1~+1に正規化されデータが扱いやすくなります。音声とは空気の振動のようなもので、縦軸がその振動の強さを示し、横軸は時間軸を示しています。このデータは実際の音声が入る前と後で無音区間が含まれているため、前後はほぼ値の変化がありません。

音声データの特徴量を抽出する

音声を数値化・可視化することで音声の強弱は把握できますが、その特徴はわかりません。先ほどのデータを直接AIで学習させる場合、何らかの特徴量を抽出してからAIに入力させると更に精度向上が見込めます。

特徴量には複数の種類があり、今回は「MFCC」という20次元の特徴量を抽出します。MFCCはMel-Frequency Cepstrum Coefficientsの略で、日本語ではメル周波数ケプストラム係数と呼ばれます。詳細な説明はここでは割愛しますが、音声に対し人間の音の高さの知覚特性から得られたメル尺度という尺度を用いて計算を行い数値化したものです。 MFCCはlibrosaというライブラリを使用すると簡単に求めることが出来ます。

import librosa
import soundfile as sf
x, fs = sf.read('test.wav')
mfccs = librosa.feature.mfcc(x, sr=fs)

実行すると、MFCCは以下のような値になりました。

array([[-554.59173994, -554.59173994, -531.09327718, …, -542.84458817,
-547.54939494, -554.59173994],
[ 0. , 0. , -19.79644073, …, 14.91504648,
9.34897748, 0. ],
[ 0. , 0. , -6.51348127, …, 10.75906436,
7.83811599, 0. ],
…,
[ 0. , 0. , -2.15509342, …, 4.57731319,
3.6946158 , 0. ],
[ 0. , 0. , 1.60289114, …, 2.85257103,
2.92412928, 0. ],
[ 0. , 0. , 1.11724 , …, 1.060343 ,
1.67854674, 0. ]])

人間には連続する数値の羅列は理解しづらいため、matplotlibで可視化すると以下のような結果となります。

import librosa.display
import matplotlib.pyplot as plt

librosa.display.specshow(mfccs, sr=fs, x_axis='time')
plt.colorbar()
matplotlibにて可視化された音声データ

おわりに

Pythonの様々なライブラリを駆使することで、わずか数行のコードにより音声データの読み込み、可視化、特徴量の抽出を行うことができました。
実際にはこの特徴量を用いてAIの学習等を実施することで、話された内容を識別する音声認識、音声の分類をする音声分類など、多岐にわたる応用が可能となります。