演習課題「教師データとテストデータの変更」
右側のJupyter Notebookのコードエリアでは、動画で説明した方法で話者認識を行なっています。
SVMのgamma値を0.01に修正してからコードを実行し、分類結果が変化することを確認してください。
コードを実行した後、結果を保存して、採点ボタンをクリックして、正解と表示されれば演習課題クリアです!
※ ノートの保存は、Jupyter Notebook画面の上側にある「File」をクリックし、「Save and Checkpoint」をクリックします。
演習課題「教師データの変更」
右側のJupyter Notebookのコードエリアでは、教師データを読み込むコードが完成していません。
教師データとしてvoicelongフォルダの音声ファイルを利用するように修正してください。
コードを実行した後、結果を保存して、採点ボタンをクリックして、正解と表示されれば演習課題クリアです!
※ ノートの保存は、Jupyter Notebook画面の上側にある「File」をクリックし、「Save and Checkpoint」をクリックします。
#04:そのままの音声データで学習と予測してみよう
ここでは、音声データをそのままSVMに与えて、話者認識をしていきます。さらに、この手法の問題点を考察します。
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# 音声データを読み込む
dir_name = 'voiceset'
for file_name in sorted(os.listdir(path=dir_name)):
print("read: {}".format(file_name))
a, sr = librosa.load(os.path.join(dir_name, file_name))
print(a.shape)
librosa.display.waveplot(a, sr)
plt.show()# 音声データを読み込む
speakers = {'kirishima' : 0, 'suzutsuki' : 1, 'belevskaya' : 2}
# 特徴量を返す
def get_feat(file_name):
a, sr = librosa.load(file_name)
return a[0:5000]
# 特徴量と分類のラベル済みのラベルの組を返す
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 (np.array(data_X), np.array(data_y))
data_X, data_y = get_data('voiceset')
print("===== data_X =====")
print(data_X.shape)
print(data_X)
print("===== data_y =====")
print(data_y.shape)
print(data_y)# 教師データとテストデータに分ける
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)))clf = svm.SVC(gamma =0.0001, C=1)
clf.fit(train_X, train_y.T[0])clf.predict(np.array([test_X[0]]))
ok_count = 0
for X, y in zip(test_X, test_y):
actual = clf.predict(np.array([X]))[0]
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)))
- 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/