ニューラルネットワークを使った音声解析

音声の符号化
Audioオブジェクト(あるいはファイル)をニューラルネットに適した形式に変換するための基本的ツールはNetEncoderである.Wolfram言語は,さまざまな種類の特徴計算に基づいた音声エンコーダをいくつかネイティブで提供している.これらのエンコーダはすべて低レベルの並列実装を使っているため,高速の計算が可能である.

エンコーダのタイプ

エンコーダにはすべて同じ前処理のステップがある.最初に信号の適切な部分を抽出し,次に単独のチャンネルにダウンミックスして一様の周波数に再抽出する.
利用可能な音声エンコーダは以下のようなものである:
"Audio"
信号の波形
"AudioMelSpectrogram"
信号の短時間フーリエ変換
"AudioMFCC"
信号のスペクトログラム
"AudioSpectrogram"
メル尺度上で等間隔の周波数を持つスペクトログラム
"AudioSTFT"
メルスペクトログラムの対数のFourierDCT
音声エンコーダ
"Audio"エンコーダは単純に信号の波形を抽出する.これはすべての情報を保存するが,結果の次元はニューラルネットに適したものではない.
"AudioSTFT"エンコーダは信号を分割し,それぞれの分割に対してFourier変換を計算する(この操作全体は短時間フーリエ変換,またはSTFTと呼ばれる).これは時間と周波数両方の情報を提供する.フーリエ変換は可逆なので,もとの信号の情報はすべて保存される.
"AudioSpectrogram"エンコーダはSTFTの大きさの平方を計算し,不要な部分を捨てる.これは特徴の次元を削減するすが,位相の情報は失われる.もとの信号のおおよその再構築を計算することはまだ可能である(InverseSpectrogramを参照のこと).
"AudioMelSpectrogram"エンコーダはスペクトログラムにフィルタバンクを適用する.フィルタバンクの中心の周波数は,音高に対する人間の感覚を模倣した非線形周波数尺度であるメル尺度上で線型に間隔が開く.これはさらに次元を削減する.
"AudioMFCC"エンコーダはメルスペクトログラムの対数のFourierDCTを計算し,高次の係数のいくつかを捨てる.これは非常に高度な次元削減を達成する一方,特に音声信号にとって重要な情報を多く保存する.
"AudioMelSpectrogram"エンコーダの結果をプロットする:

データ拡張

音声エンコーダはすべて"Augmentation"パラメータを持つ.これにより,特徴(スペクトログラムやMFCC)が計算される前にデータ拡張を実行することができる.
データ拡張は,制限されたデータや削減されたデータを扱うとき,および訓練データの人工的あるいは無関係なトレンドに対してネットをより強力にするために非常に便利である.たとえば,猫や犬の鳴き声の録音を分類するとする.訓練データで犬の鳴き声がすべて雑音の多いマイクで録音されていたら,ネットワークは犬ではなく雑音を認識してしまう可能性がある.
音声でデータ拡張を使うと便利な他の場合として,訓練データの録音からセグメントを抽出するというものがある.
利用できる拡張は以下のようなものである:
"TimeShift"
ランダム化することのできる量で入力をシフトする
"Noise"
Audioの特定のものかファイルのどちらからか,あるいはホワイトノイズとして入力に雑音を加える
"Volume"
入力に,ランダム化することのできる定数を掛ける
"Convolution"
Audioの特定のものかファイルのどちらからか,インパルス応答を入力にたたみ込む
"VTLP"
入力に声道長摂動を適用する
すべての拡張はランダム化することができる.
2つの拡張を同時に適用する:
音声の分類
「Spoken Digit Commands」データセット上で分類ネットワークを訓練する.
このデータセットは異なる話者による0から9までの数字の音読1万の録音からなる.データセットの訓練部分と検証部分の話者は重複しない.
データを集める:
"AudioMFCC"は格段の次元削減を提供しながら音声信号に存在する情報を多量に保存するため,このエンコーダを使う.
エンコーダとデコーダを作成する:
ConvolutionLayerは可変長の入力をサポートする.これは"Interleaving"オプションをTrueに設定することで達成できる. 次に,画像処理で広く使われている"LeNet"アーキテクチャに基づいて,非常に簡単なたたみ込みネットを構築することができる.音声データの可変長の特徴を利用できるようにするために,最終層に少し調整が必要である.
たたみ込みネットを作成し,データセットで訓練してその性能を測定する:
別のアプローチとして完全に再帰型のネットワークを作成するというものがある.このネットはGatedRecurrentLayerのスタックに基づいており,簡単な分類セクションが後続する.規則化を加えるために,再帰層の入力におけるドロップアウトが使われる.
再帰型ネットを作成し,それをデータベースで訓練してその性能を測定する:
最後の分類層を削除することによって,音声信号の特徴抽出器を得ることが可能である.この特徴抽出器は数字の分類タスクにとって重要であった特徴に関連のあるものとなり得る.つまり,学習された埋込みはどの数字が話されたかについての情報を含むが,話者の特定に関する情報は無視する.
ネットワークによって学習された埋込みを使って検証データセットをプロットする:
音声イベント検出
場合によっては,録音の音声イベントを見付けるネットワークを訓練したくても,「弱ラベル」データであることがある.弱ラベルデータでは,ラベルは録音の中にあるイベントが存在したかどうかは分かるが,どこかはわからない.データの制約にかかわらず,弱ラベルデータでの訓練を介して,音声イベントの局所化においてよい結果を得ることが可能である.
Wolfram Data Repositoryから,猫と犬の鳴き声の録音である「Audio Cats and Dogs」データセットを使う.
データセットを取り出す:
信号の長さは1秒から18秒までの間である.
データを訓練集合と検証集合に分け,信号の長さのヒストグラムをプロットする:
"AudioMelSpectrogram"エンコーダを使って,音声信号をネットワークにフィードする.データの量は比較的少ないので,訓練をより効率的にするためにデータ拡張を行うことができる.
エンコーダとデコーダを作成する:
ネットは再帰層(GatedRecurrentLayer)のスタック,および時間次元に結果を貯めるためのAggregationLayerに基づいている.これにより,ネットは列ではなく単独の分類結果を出力することができる.
ネットを作成し,それをデータセットで訓練する:
再生可能な方法でネットを使うために,拡張を伴うエンコーダは拡張のないものに置換する必要がある.
ネットの性能を測定する:
AggregationLayerを削除して,改造したネットにSoftmaxLayerを再び接合することによって,単独お分類結果ではなく暮らすの確率の列を返すネットワークが得られる.
時間分解されたネットを作成し,その結果を簡単に得る関数を定義する:
この時間分解されたネットを,猫と犬両方の雑音を含む信号で検証する.
訓練集合にはなかった信号でネットを検証する:
音声の埋込み
埋込みは,分類タスクの訓練の副作用として学習することができる.意味のある埋込みの学習を訓練の目的とする,異なる訓練タスクを使うことができる.

対比損失のあるシャム(Siamese)ネットワーク

埋込みを学ぶ最初の方法として,対比損失のあるシャムネットワークを訓練することがある.これには全く同じネットワークに2つの入力をフィードして,2つの出力の間の距離を計算し,それを対比損失にフィードするというものである.2つの入力が同じクラスに属す場合,距離は最小化される.そうでない場合は,最大化される.
これにも「Spoken Digit Commands」データセットを使う.今回はどの数字が話されたかは無視し,話者にだけ注目する.
話者のIDによってデータを集めそれをグループ化する:
話者のペアの集合を作成する.理想的には不例(異なる話者の録音)と同じ数の正例(同じ話者の録音)があるのがよい.
訓練ペアを作成する:
この例は非常に簡単な再帰型ネットワークを使って埋込みを生成する.これは埋込みを訓練するネットも定義する.これは同じネットワークに2つの入力をフィードし,結果の埋込みの距離を計算する必要がある.NetInsertSharedArraysを使うと,2つの入力が厳密に同じネットワークで処理されることを確実にすることができる.
埋込みを作成するネットと対比損失を計算するネットを作成する:
一旦ネットワークが訓練されると,埋込みを計算する等価のサブネットの一つを抽出する.
ペアの埋込みネットを訓練して,訓練された結果から埋込みネットを抽出する:
信号の集合を可視化するために埋込みを使う.
計算された埋込み空間内の検証データセットを可視化する:
あるいは,埋込み間の距離を測定することで異なる録音を比較する.
検証データセット内の異なる例の間の距離行列をプロットする:
学習された埋込みを使ってNearestFunctionを定義し,例から最も近い信号と最も遠い信号を求める:

事前に訓練された音声特徴抽出器

埋込みを最初から学習する代りに,事前に訓練された音声解析ネットワークを使うことができる.Wolfram Neural Net Repositoryはこれに適したソースである.
AudioIdentifyはバックエンドとして深層ニューラルネットを利用し,音声分類を実行する.このネットワークはAudioSetデータセットで訓練され,それぞれの音声信号は,録音に存在する音声クラスや音源で注釈が付けられる.このラベルは約600のクラスのオントロジーで体系化される.この600のクラスは楽器や音楽のタイプから動物,機械,人間の音声に渡る,広範な音のタイプやソースに及んでいる.
AudioIdentifyネットをインポートして,それをAudioオブジェクトに適用する:
AudioIdentifyネットでは,固定された大きさの塊に分割され,メインのネットがそれぞれの塊のメルスペクトログラムに適用される.それを得るためにはNetExtractを使う."CNN Architectures for Large-Scale Audio Classification"で紹介されているアーキテクチャと同様に,メインのネットにはCNNアーキテクチャ(MobileNet v2に基づく)がある.
NetMapOperatorのコアでネットを抽出する:
AudioIdentifyで使われるネットワークは,音声を認識するためだけではなく,録音から特徴を抽出するためにも使うことができる.これにより,類似性や距離を計算することができる意味的に重要な空間に,任意の信号を埋め込むことが可能にある.
分類タスクを担当する最後の数個の層は削除でき,結果のネットワークは再びもとのNetChainに挿入することができる.このネットは各音声入力に対して,固定サイズの意味的に重要なベクトルを生成する.これはシステム内の高レベル機械学習関数すべてについての特徴検出器として,あるいは新しいニューラルネットを訓練するための出発点として使うことができる.
特徴検出ネットを作成し,FeatureSpacePlotで使う:
別の方法として"VGGish Feature Extractor Trained on YouTube Data"モデルがある.これは特に音声の特徴抽出のためにYouTubeのデータについてGoogleが訓練した構造的に同様なネットである.
FeatureSpacePlotの特徴検出器としてVGGishネットワークを使う:
音声の転移学習
ネットワークを訓練するために利用できるデータの量が,そのタスクにとって不十分であることがある.この問題には転移学習が有効なことがある.ネットワークを最初から訓練する代りに,異なるが関連したタスクですでに訓練されたネットを出発点として使うことができる.
まずESC-50データセットをダウンロードする.
ESC-50データセットをダウンロードして解析する:
出発点としてAudioIdentifyのネットワークを使う.
特徴検出ネットワークを構築する:
完全なネットを再訓練して,NetTrainLearningRateMultipliersオプションを指定して分類層だけを訓練する代りに,特徴検出ネットの結果を前もって計算し分類器を訓練する.これにより訓練中に完全なネットを無駄に評価しなくて済む.
データセットを,その作成者によって定義されたfoldに分割することもできる.
特徴を事前に計算し,もとのfoldに従ってデータセットを分割する:
特徴検出器に取り付けられた単純な再帰型分類ネットワークを構築し,foldのそれぞれについて訓練する.
単純な再帰型分類器を定義し,それを各foldで訓練する:
訓練の後,それぞれのfoldでの分類器の正解率を測定し,それを平均して交差検証の結果を得ることが簡単にできる.
それぞれのfoldでの性能を測定し,その平均を計算する:
最後の検証として,もとの特徴抽出器と訓練された分類器のアンサンブル平均を加えるネットを構築し,もとのデータセットにはない信号でそれを実行する.
関係のない例で最終的なネットを検証する: