演習課題「教師データとテストデータの変更」
右側のJupyter Notebookのコードエリアでは、動画で説明した方法で話者認識を行なっています。
train_test_splitでの教師データとテストデータの分割時のrandom_stateの値を813813に変更して、分類の予測結果を確認してください。
コードを実行した後、結果を保存して、採点ボタンをクリックして、正解と表示されれば演習課題クリアです!
※ ノートの保存は、Jupyter Notebook画面の上側にある「File」をクリックし、「Save and Checkpoint」をクリックします。
演習課題「長い音声データでの学習のパラメータ調整」
右側のJupyter Notebookのコードエリアでは、教師データとしてvoicelongフォルダの音声ファイルを利用し、テストデータにvoicesetの音声ファイルを利用しています。
画面では19のテストに正解していますが、SVMのgammaパラメータを変更して、44以上のテストで正解できるようにしてください。
コードを実行した後、結果を保存して、採点ボタンをクリックして、正解と表示されれば演習課題クリアです!
※ ノートの保存は、Jupyter Notebook画面の上側にある「File」をクリックし、「Save and Checkpoint」をクリックします。
#06:音声の時間別の特徴量を利用して予測の精度を改善しよう
ここでは、1つの音声データから時間ごとに複数の特徴量を取り出して利用することで、予測の精度の向上を目指します。フーリエ変換によるパワースペクトルだけでなく、音声の特徴量として知られているMFCCも利用します。
import numpy as np
import librosa
import librosa.display
import os
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import svm
from scipy import fftpack# 音声データを読み込む
speakers = {'kirishima' : 0, 'suzutsuki' : 1, 'belevskaya' : 2}
# 特徴量を返す
def get_feat(file_name):
a, sr = librosa.load(file_name)
# y = np.abs(librosa.stft(a))
y = librosa.feature.mfcc(y=a, sr=sr)
# plt.figure(figsize=(10,4))
# librosa.display.specshow(librosa.amplitude_to_db(y, ref=np.max), y_axis='log', x_axis='time', sr=sr)
# plt.colorbar(format='%+2.0f dB')
# plt.tight_layout()
return y
# 特徴量と分類のラベル済みのラベルの組を返す
def get_data(dir_name):
data_X = []
data_y = []
for file_name in sorted(os.listdir(path=dir_name)):
print("read: {}".format(file_name))
speaker = file_name[0:file_name.index('_')]
data_X.append(get_feat(os.path.join(dir_name, file_name)))
data_y.append((speakers[speaker], file_name))
return (data_X, data_y)
data_X, data_y = get_data('voiceset')
# get_feat('sample/hi.wav')
# get_feat('sample/lo.wav')# 教師データとテストデータに分ける
train_X, test_X, train_y, test_y = train_test_split(data_X, data_y, random_state=11813)
print("{} -> {}, {}".format(len(data_X), len(train_X), len(test_X)))# 各時間に対応する成分をそれぞれ1つの特徴量として分割する
def split_feat(data_X, data_y):
data_X2 = []
data_y2 = []
for X, y in zip(data_X, data_y):
X2 = X.T
y2 = np.array([y[0]] * X.shape[1])
data_X2.append(X2)
data_y2.append(y2)
data_X2 = np.concatenate(data_X2)
data_y2 = np.concatenate(data_y2)
return (data_X2, data_y2)
train_X2, train_y2 = split_feat(train_X, train_y)
clf = svm.SVC(gamma=0.0001, C=1)
# clf = svm.SVC(gamma=0.0000001, C=10)
clf.fit(train_X2, train_y2)def predict(X):
result = clf.predict(X.T)
return np.argmax(np.bincount(result))
ok_count = 0
for X, y in zip(test_X, test_y):
actual = predict(X)
expected = y[0]
file_name = y[1]
ok_count += 1 if actual == expected else 0
result = 'o' if actual == expected else 'x'
print("{} file: {}, actual: {}, expected: {}".format(result, file_name, actual, expected))
print("{}/{}".format(ok_count, len(test_X)))# mfccのを描画する
def mean_plot(mfccs, name):
print(name)
mean = np.mean(mfccs.T, axis=0)
plt.plot(range(0,len(mean)), mean)
plt.show()
mean_plot(get_feat("voiceset/kirishima_b01.wav"), "uema")
mean_plot(get_feat("voiceset/suzutsuki_b01.wav"), "uchida")
mean_plot(get_feat("voiceset/belevskaya_b01.wav"), "uesaka")
mean_plot(get_feat("sample/hi.wav"), "hi")
mean_plot(get_feat("sample/lo.wav"), "lo")
- Matplotlib(マトプロットリブ) ... グラフ描画のライブラリ
https://matplotlib.org/
- scikit-learn(サイキットラーン)... 機械学習ライブラリ
https://scikit-learn.org/stable/
- サポートベクターマシン、通称SVM(エスブイエム)
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
- sklearn.model_selection.train_test_split
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html
- LibROSA(リブロサ)... 音声データを扱うライブラリ
https://librosa.org/librosa/
- librosa.display
https://librosa.org/doc/latest/generated/librosa.display.specshow.html
- numpy ... 数値計算ライブラリ
https://numpy.org/ja/