Python×医療事務(×トロント)

#医療 / #医療事務 / #IT / #トロント / #歯科助手 / #のんびり / #備忘録 / #趣味

Paiza で期間限定で Python×AI 機械学習入門が無料だったのでしてみた チャプター5

音声の波にフーリエ変換を適用すると 複数の簡単な波に変換される

簡単な波を周波数ごとに集計したものをパワースペクトルという 音声を構成する周波数の内訳になる

それぞれの音声の周波数をパワースペクトルで比べることで音声の特徴をよりよく比較できる

f:id:chocolate22554:20200920210356p:plain

前回のコード

f:id:chocolate22554:20200920210433p:plain

コードを修正し 音声の波にフーリエ変換で求めた特徴量を利用するようにしていく

フーリエ変換を利用するためにscipyのfftpackをimport していく

f:id:chocolate22554:20200920210727p:plain

特徴量を返すget featを修正しフーリエ変換から得られたパワースペクトルを返すように。フーリエ変換自体はライブラリが行ってくれるので簡単に変更できる

f:id:chocolate22554:20200920211317p:plain

変更した関数の確認動作をも兼ねてサンプル音声のパワースペクトルを描画

get feat関数内にパワースペクトルの描画処理を追加

f:id:chocolate22554:20200920211543p:plain

get featにhi.wav (高音音声)とlo.wav(低音音声)をサンプルデータとして与える

f:id:chocolate22554:20200920211813p:plain

 

f:id:chocolate22554:20200920212144p:plain

2つのパワースペクトルが表示された  縦軸=音量のデシベル、横軸=周波数

   ↓hi.wav

f:id:chocolate22554:20200920212347p:plain

                   ↓lo.wav

f:id:chocolate22554:20200920212412p:plain

 

どの周波数がどれくらい出ているか分かったので これを特徴量として学習させれば話者認識の精度が高められる

動作の確認ができたので描画の部分はコメントアウト

 

#plt.plot(fft_dreq,y)

#plt.show

  return y

 

どの周波数がどれほど出ているか解析結果を特徴量として使い音声データの学習と予測を行う

 

f:id:chocolate22554:20200921141404p:plain

f:id:chocolate22554:20200921141413p:plain

f:id:chocolate22554:20200921141421p:plain

 

#学習させて結果を取得させる

#教師データとテストデータに分ける

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),ken(test_X)))

f:id:chocolate22554:20200921141430p:plain

clf= svm.SVC(gamma=0.0001,C=1)

clf.fit(train_X,train_y.T[0])

f:id:chocolate22554:20200921142755p:plain

 

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)))

f:id:chocolate22554:20200921141631p:plain

正答率 が12個中5個 なのでSVMのパラメーターを調整してみる
 gamma=0.0000001  C=10に変更

Cを大きくすると5分類をより大きく許容できるようになる

f:id:chocolate22554:20200921143037p:plain

正答率が変わった

f:id:chocolate22554:20200921143134p:plain

しかしいきなり結果が良くなると作られた恣意的なデータに見えて胡散臭い。そこで、教師データとテストデータを変更して試してみる

train_test_splitのrandom_stateを11813から813に変更

f:id:chocolate22554:20200921143318p:plain

学習させ予測させる

f:id:chocolate22554:20200921143446p:plain

なかなか精度が良いのができた ちなみに、テストデータの分割方法を他に変えても10前後の正解数になる。実行結果の内訳を確認する

末尾にsu(su.wav)=授業以外の先生の声 他のデータより数が少ない 授業中の声の調子が違うため認識されていない可能性あり。

 

最後に問題点を考える  このチャプターのフーリエ変換で作ったスペクトラムは音声データに対し音声の長さに寄らず1つだけになっている 例として、非常に長い音声ファイルが1つしかなくても特徴量を1つしか取り出すことができない。

特徴量の数が多いほど機械学習精度は期待できるので1つの音声ファイルから複数の特徴量を取得できれば改善することができるかも。