チーム20D2

課題名

DFTによる音声の特徴抽出および認識

研究者名

Z.Q. WANG (Wang Zhaoqing)
Z.M. WANG (Wang Ziming)

概要

発想:
フーリエ変換の本質の部分として、時間空間にあるデータをそれと直交している周波数空間に写像することである。ここで、普段我々が耳にしている人の声を一種の信号波とみなせば、時系列である音声信号を、離散フーリエ変換を利用して、見方を時間の方向から周波数の方向に変えることができる。また、各々の音声には、それなりの特徴、例えば音色、高さ、速さなどが含まれ、その本質は、音声に含まれている周波数であるので、周波数空間でそういった特徴を直に解析することが期待できる。

流れ:
まず、データの準備が必要である。ここで、知り合いの人に頼んで録音されてもらった。次の処理はDFTを利用し、音声サンプルの特徴を抽出する。最後にDeep Neural Networkを構築し、抽出された特徴をニューラルネットワークに学習させる。検証段階では、実際に音声からその持ち主を特定する実験を行う。

予め説明しておくこと:
1.被験者のプライバシーにかかわるので、本実験で使ったデータは公開しかねる。
2.ソースコードの形式はipynbノードであるため、個人のGitHubのリンクを提供するが、長いメンテナンスが保証できない。
3.本実験には、いくつかの問題点が残っているはずである。現時点で考えられた問題を考察で纏めておくので、本実験を改善したい方のご参考になれると幸いである。

実験で使ったプログラミング言語、データセットおよび実験環境

本実験で使った言語はPythonである。また、必要なライブラリとパッケージは下のリストに参照
pydub 音声ファイルの処理 pydub
Numpy 数値計算 Numpy
Pandas データ処理(使う予定であったが、実際に使っていなかった)
matplotlib.pyplot 描画 Matplotlib
Pytorch ニューラルネットワークフレームワーク Pytorch

本実験で使ったデータセットは実験者が独自に知人に頼んで録音したもので、具体的な情報は以下に参照
被験者人数:3
データの数:51*3
データの構成:訓練用データ150(50*3)、デモ用データ3(1*3)
データファイルの形式:m4a
録音設備:PC

実験環境:Google Colaboratory

ソースコード:実験用コード

実験の流れ

Step1:データの準備とDFT関数の作成
まず、データを全部読み込む。この段階ではライブラリが音声データを自動的にサンプリングするので、後の処理はかなり楽になる。
デジタル化されたデータがnumpyの配列に変換すると、そのデータの可視化ができる。
csex_hw_187076_1.PNG
次は、DFT関数を作成する。ここで用いた基底関数(Kernel)は講義資料の式である。つまり、
csex_hw_187076_2.PNG
ただし、音声の特徴を十分に抽出するため、M=10にしたので、フーリエ行列は以下のようになる。
csex_hw_187076_3.PNG
この行列を用いて、音声データにDFTを施すと、音声に含まれている各周波数の成分の係数を求めることができる。畳み込みされたこの係数は後で特徴としてDNNモデルに食わせる。ここで一度抽出された特徴の可視化を行う。
csex_hw_187076_4.PNG
最後は各データにラベルをつけて、Tensorに変換したら、データの準備が全部終わる。

Step2:DNNの構築と学習
まず、DNNモデルを構築する。具体的な情報は以下に参照
入力:9
ニューロン:10
深度:9
出力:3
活性化関数:Sigmoid
損失関数:二乗平均
出力層関数:SoftMax
最適化アルゴリズム:ADAM
学習率:0.015
このモデルについて説明すると、データの特徴として、定数項のスケールが極端に大きいので、環境やノイズの影響が入っていると想定し、人力でドロップすることにした。そして、出力層でSoftMaxを実装したため、確率でどの人物の音声かを表し、ラベルのOne-hot形式に対応する。活性化関数として、SigmoidとReluを両方試みたが、Reluは一部の情報を整流したため、精度がよくないので、ここでSigmoidを実装した。最適化アルゴリズムはADAMにするメリットとして、最初の学習率を設定した後、自動的に調整できることで、人力でハイパーパラメータを調整することを省くことができる。
本実験ではデータの数が非常に少ないため、同じをデータを使って1500回学習させることにした。

Step3:検証
同じ理由で検証段階では、再代入誤り率を採用し、その精度は95%-98%に至ることができた。
最後は、少し長い音声データを使って、モデルが実際に認識できるかどうかをテストしよう。結果は以下のようになる。
csex_hw_187076_5.PNG
この結果から、異なる人の声が正しく認識されたことが分かる。

考察

本実験の結果として、フーリエ変換は音声の時系列を周波数空間に転換することができ、周波数空間での各成分が音声の特徴として考えることができることが分かる。この点において、本実験がある程度成功したが、また沢山の問題点と改善点が残っていると考えられる。これから、現時点での問題点を羅列して述べていく。
1.設定されたDFTの成分が疎らであるため、音声を周波数に変換する時、沢山の情報を捨ててしまうことが予想され、精密に分類することが難しい。提案としてDFTの代わりにFFTを使った方がよいかもしれない。
2.データの数が少ないため、結果的に訓練データとテストデータを分けて使うことができない。検証段階では交差確認法と一つ抜き法を勧める。
3.ニューラルネットワークの学習は最適化問題として初期値に依存する問題があるため、一回の訓練で良い結果を得ることが難しい。
4.本実験で構築したDNNモデルには正規化関数が含まれていない。実際に大量のデータを使う時、正規化なしで学習させると、Overfittingになる恐れがあるので、あまり良い実装とはいえない。
5.データのサンプリングはライブラリに任せたため、実際どのようにサンプリングされたか分からない状態であるので、エイリアシングを避けることができない。
6.本実験で使ったデータには前処理を施さなかった。グラフからみると、波形がジクザクになっていることが分かる。ここで、フィルタを作って、音声データの形を整え、ノイズ消去などを行うと、より良い結果が得られる可能性が秘められている。

  • 最終更新:2020-10-16 22:32:46

このWIKIを編集するにはパスワード入力が必要です

認証パスワード