演習課題「教師データとテストデータの変更」
右側のJupyter Notebookのコードエリアでは、動画で説明した方法で話者認識を行なっています。
train_test_splitでの教師データとテストデータの分割時のrandom_stateの値を813813に変更して、分類の予測結果を確認してください。
コードを実行した後、結果を保存して、採点ボタンをクリックして、正解と表示されれば演習課題クリアです!
※ ノートの保存は、Jupyter Notebook画面の上側にある「File」をクリックし、「Save and Checkpoint」をクリックします。
演習課題「長い音声データを教師データに利用」
右側のJupyter Notebookのコードエリアでは、教師データを読み込むコードが完成していません。
教師データとしてvoicelongフォルダの音声ファイルを利用し、テストデータにvoicesetの音声ファイルを利用するように修正してください。
コードを実行した後、結果を保存して、採点ボタンをクリックして、正解と表示されれば演習課題クリアです!
※ ノートの保存は、Jupyter Notebook画面の上側にある「File」をクリックし、「Save and Checkpoint」をクリックします。
#05:フーリエ変換を利用して予測の精度を改善しよう
ここでは、音声データをフーリエ変換して求められる特徴量を使って話者認識することで予測精度の向上を目指します。さらに、この手法の問題点を考察します。
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# 音声データを読み込む
dir_name = 'voiceset'
for file_name in 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)
fft_wave = fftpack.rfft(a, n=sr)
fft_freq = fftpack.rfftfreq(n=sr, d=1/sr)
y = librosa.amplitude_to_db(fft_wave, ref=np.max)
# plt.plot(fft_freq, y)
# plt.show()
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 (np.array(data_X), np.array(data_y))
data_X, data_y = get_data('voiceset')
# get_feat('sample/hi.wav')
# get_feat('sample/lo.wav')
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 = svm.SVC(gamma=0.0000001, C=10)
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/