サウンド分類は、オーディオのディープラーニングで最も広く使用されている方法の 1 つです。音を分類し、音のカテゴリーを予測することを学ぶことが含まれます。この種の問題は、音楽クリップを分類して音楽のジャンルを識別したり、話者のグループからの短い発話を分類して声に基づいて話者を識別するなど、多くの現実世界のシナリオに適用できます。
この記事では、このようなオーディオ分類の問題を解決するために使用されるアプローチを理解するために、簡単なデモ アプリケーションを紹介します。私の目標は、何かがどのように機能するかだけでなく、なぜそのように機能するかを理解することです。 オーディオ分類MNIST データセットを使用して手書きの数字を分類することがコンピューター ビジョンの「Hello World」型の問題であると考えられるのと同様に、このアプリケーションはオーディオにおけるディープラーニングの入門レベルの問題と考えることができます。 まずサウンド ファイルから始めて、それをスペクトログラムに変換し、CNN と線形分類モデルに入力して、サウンドが属するクラスに関する予測を生成します。 さまざまな種類のサウンドに適したデータセットが多数あります。これらのデータセットには、解決しようとしている問題に応じてサウンドの種類を識別する、各サンプルのクラス ラベルとともに、多数のオーディオ サンプルが含まれています。 これらのクラス ラベルは通常、オーディオ サンプル ファイル名の一部またはファイルが配置されているサブフォルダー名から取得できます。さらに、クラス ラベルは、通常は TXT、JSON、または CSV 形式の別のメタデータ ファイルで指定されます。 デモ - 一般的な都市の音の分類デモンストレーションでは、都市の日常生活から録音された一般的な音のコーパスを含む Urban Sound 8K データセットを使用します。音は、工事騒音、犬の鳴き声、笛の音など 10 のカテゴリに分類されます。各サウンド サンプルには、それが属するクラスがラベル付けされます。 データセットをダウンロードすると、次の 2 つの部分で構成されていることがわかります。 「Audio」フォルダ内のオーディオ ファイル: 「fold1」から「fold10」までの名前が付いた 10 個のサブフォルダがあります。各サブフォルダーには多数のものが含まれます。 wav オーディオ サンプル。たとえば、「fold1/103074 - 7 - 1 - 0. - wav」 「Metadata」フォルダ内のメタデータ: 「UrbanSound8K」というファイルがあります。ファイル名、クラス ラベル、「fold」サブフォルダーの場所など、データセット内の各オーディオ サンプルに関する情報が含まれています。クラス ラベルは、10 個のクラスそれぞれに対する 0 から 9 までの数値クラス ID です。のように。数字の 0 はエアコンを表し、1 は車のクラクションを表します。 一般的なオーディオの長さは約 4 秒です。以下に一例を挙げます。 データセット作成者は、メトリックを計算し、モデルのパフォーマンスを評価するために、10 倍のクロス検証を使用することを推奨しています。 ただし、この記事の目的は最先端の指標を達成することではなく、主にオーディオにおけるディープラーニングの威力を実証することであるため、分析は無視し、すべてのサンプルを 1 つの大きなデータセットとして扱います。 トレーニングデータの準備ほとんどのディープラーニングの問題では、次の手順に従います。 このデータセットのデータ構成はシンプルです。 プロパティ (X) はオーディオ ファイルへのパスです。 ターゲットラベル(y)はクラス名です データセットにはすでにこの情報を含むメタデータ ファイルがあるため、それを直接使用できます。メタデータには各オーディオ ファイルに関する情報が含まれています。 CSV ファイルなので、Pandas を使用して読み取ることができます。メタデータから特徴とラベルのデータを準備できます。
トレーニングに必要な情報は次のとおりです。 メタデータが利用できない場合にディレクトリをスキャンしてオーディオファイルを探す メタデータ ファイルを使用すると、物事ははるかに簡単になります。メタデータ ファイルが含まれていないデータセットのデータはどのように準備すればよいですか? 多くのデータセットは、フォルダー構造に配置されたオーディオ ファイルのみで構成されており、クラス ラベルはディレクトリから取得できます。この形式でトレーニング データを準備するには、次の操作を行います。 ディレクトリをスキャンし、すべてのオーディオ ファイル パスのリストを生成します。 各ファイル名または親子フォルダ名からクラスラベルを抽出します 各クラス名をテキストから数値クラスIDにマッピングする メタデータの有無にかかわらず、結果は同じです。つまり、オーディオ ファイル名のリストで構成される機能と、クラス ID で構成されるターゲット ラベルになります。 オーディオの前処理: 変換の定義オーディオ ファイル パスを含むこの種のトレーニング データは、モデルに直接取り込むことはできません。ファイルからオーディオ データを読み込み、モデルが想定する形式に適合するように処理する必要があります。 すべてのオーディオ前処理は、オーディオ ファイルを読み込んでロードするときに実行時に動的に実行されます。このアプローチは、画像ファイルで行う方法と似ています。オーディオ データ (または画像データ) は非常に大きく、メモリを大量に消費する可能性があるため、データセット全体を事前に一度にメモリに読み込むことは望ましくありません。したがって、トレーニング データにはオーディオ ファイル名 (または画像ファイル名) のみを保持します。 。 次に、実行時に、一度に 1 つのデータ バッチをトレーニングするときに、そのオーディオ データのバッチを読み込み、一連の変換をオーディオに適用して処理します。この方法では、一度に 1 つのオーディオ データ バッチのみがメモリに保持されます。 画像データの場合、最初に画像ファイルをピクセルとして読み取ってロードする変換パイプラインが必要になる場合があります。次に、いくつかの画像処理手順を適用して、データの形状を変更し、サイズを変更し、固定サイズにトリミングし、必要に応じて RGB からグレースケールに変換します。回転、反転などの画像拡張手順を適用する場合もあります。 オーディオデータの処理も非常に似ています。ここで、トレーニング中にモデルにデータを供給するときに後で実行される関数を定義します。 ファイルから音声を読み込む最初に行う必要があるのは、「.wav」形式のオーディオ ファイルを読み込んでロードすることです。 この例では Pytorch を使用しているため、以下の実装ではオーディオ処理に torchaudio を使用していますが、librosa でも同様に動作します。
ステレオに変換一部のサウンド ファイルはモノラル (つまり、1 つのオーディオ チャネル) ですが、ほとんどのサウンド ファイルはステレオ (つまり、2 つのオーディオ チャネル) です。 私たちのモデルではすべてのアイテムが同じ寸法を持つことが想定されているため、最初のチャネルを 2 番目のチャネルに複製してモノラル ファイルをステレオに変換します。
正規化されたサンプリングレート一部のサウンド ファイルは 48000Hz でサンプリングされますが、ほとんどのサウンド ファイルは 44100Hz でサンプリングされます。 つまり、一部のサウンド ファイルでは 1 秒のオーディオの配列サイズが 48000 であり、他のサウンド ファイルでは 44100 であるということです。すべての配列が同じ次元を持つように、すべてのオーディオを正規化し、同じサンプリング レートに変換する必要があります。
同じ長さに調整する次に、無音部分を埋め込むか、長さを切り捨てて継続時間を延長するかのいずれかの方法で、すべてのオーディオ サンプルのサイズを同じ長さに変更します。 このメソッドを AudioUtil クラスに追加します。
データ拡張: タイムシフト次に、タイムシフトを適用してオーディオをランダムな量だけ左または右にシフトすることにより、元のオーディオ信号にデータ拡張を実行できます。 この記事では、このデータ拡張手法とその他のデータ拡張手法について詳しく説明します。
メルスペクトログラム拡張オーディオをメルスペクトログラムに変換します。 これらはオーディオの本質的な特性を捉えており、多くの場合、オーディオ データをディープラーニング モデルに入力する最も適切な方法です。
データ拡張: 時間と周波数のマスキングここで、元のオーディオではなくメル スペクトログラムに対して、もう一度拡張を実行できます。 ここでは、次の 2 つの方法を使用する SpecAugment という手法を使用します。 周波数マスキング - スペクトログラムに水平バーを追加して、連続する周波数の範囲をランダムにマスクします。 時間マスク - 周波数マスクに似ていますが、垂直線を使用してスペクトログラムから時間範囲をランダムにマスクする点が異なります。
カスタムデータローダー前処理変換関数をすべて定義したので、カスタム Pytorch Dataset オブジェクトを定義します。 Pytorch を使用してモデルにデータを供給するには、次の 2 つのオブジェクトが必要です。 すべてのオーディオ変換を使用してオーディオ ファイルを前処理し、一度に 1 つのデータ項目を準備するカスタム Dataset オブジェクト。 Dataset オブジェクトを使用して個々のデータ項目を取得し、それらをデータのバッチにパッケージ化する組み込みの DataLoader オブジェクト。
データローダーを使用してデータのバッチを準備するこれで、モデルにデータを入力するために必要なすべての関数が定義されました。 カスタム データセットを使用して Pandas から機能とラベルを読み込み、データを 80:20 の比率でトレーニング セットと検証セットにランダムに分割します。 次に、これらを使用してトレーニングおよび検証データ ローダーを作成します。
トレーニングを開始すると、オーディオ ファイル名のリストを含む入力のランダム バッチを取得し、各オーディオ ファイルに対して前処理オーディオ変換を実行します。 また、クラス ID を含む対応するターゲット ラベルのバッチも取得します。 したがって、一度にトレーニング データのバッチが出力され、それをディープラーニング モデルへの入力として直接渡すことができます。 まずオーディオ ファイルから始めて、データ変換の手順を実行してみましょう。 ファイルからのオーディオは Numpy 配列 (numchannels、numsamples) に読み込まれます。オーディオのほとんどは 44.1kHz でサンプリングされ、約 4 秒間続くため、サンプル数は 44,100 * 4 = 176,400 になります。オーディオに 1 つのチャンネルがある場合、配列の形状は (1, 176, 400) になります。同様に、2 チャンネルで 4 秒間持続し、48kHz でサンプリングされたオーディオには、(2, 192,000) の形状を持つ 192,000 個のサンプルが含まれます。 各オーディオのチャンネルとサンプリング レートは異なるため、次の 2 つの変換では、オーディオが標準の 44.1kHz と標準の 2 チャンネルに再サンプリングされます。 一部のオーディオ クリップは 4 秒より長いか短い場合があるため、オーディオの長さも 4 秒の固定長さに正規化します。これで、すべてのアイテムの配列は同じ形状になります (2, 176, 400) タイムシフト データ拡張は、各オーディオ サンプルをランダムに前方または後方にシフトします。形状は変わりません。 拡張オーディオは、(numchannels, Mel freqbands, time_steps) = (2, 64, 344) の形状を持つメルスペクトログラムに変換されます。 SpecAugment データ拡張関数は、時間と周波数のマスクをメルスペクトログラムにランダムに適用します。形状は変わりません。 最終的にはバッチごとに 2 つのテンソルが作成されます。1 つはメル スペクトログラムを含む X 特徴データ用で、もう 1 つは数値クラス ID を含む y ターゲット ラベル用です。 バッチは、各トレーニング エポックのトレーニング データからランダムに選択されます。 各バッチの形状は (batchsz、numchannels、Mel freqbands、timesteps) です。 バッチ内の 1 つの項目を視覚化できます。 垂直方向と水平方向の縞模様のメル スペクトログラムには、周波数と時間マスクされたデータの拡張が表示されていることがわかります。 モデルの構築今実行したデータ処理手順は、オーディオ分類の問題の最もユニークな側面です。 ここからのモデルとトレーニング プロセスは、標準的な画像分類問題で一般的に使用されるものと非常に似ており、オーディオ ディープラーニングに固有のものではありません。 データはスペクトログラム画像で構成されているため、それを処理するために CNN 分類アーキテクチャを構築します。 特徴マップを生成する 4 つの畳み込みブロックがあります。 次に、データは必要な形式に再構成され、線形分類レイヤーに入力され、最終的に 10 個のクラスごとに予測が出力されます。 モデル情報: カラー画像は、(バッチ数、チャネル数、メル周波数バンド、タイムステップ) の形でモデルに入力されます。 (16、2、64、344)。 各 CNN レイヤーはフィルターを適用して、画像の深度、つまりチャネルの数を増やします。 (16、64、4、22)。 これらは結合され、(16, 64) の形状に平坦化されてから、線形レイヤーに送られます。 線形層は各カテゴリの予測スコアを出力する。すなわち、(16, 10)
電車これで、モデルをトレーニングするためのトレーニング ループを作成する準備が整いました。 トレーニングの進行に合わせて学習率を動的に変更するオプティマイザー、損失関数、学習率スケジュール関数を定義し、モデルの収束を早めます。 各トレーニングラウンドが完了した後。 私たちは、正しい予測の割合を測定する単純な精度メトリックを追跡します。 # ---------------------------- # トレーニングループ # ---------------------------- def トレーニング(モデル、train_dl、num_epochs): # 損失関数、オプティマイザー、スケジューラー 基準 = nn.CrossEntropyLoss() オプティマイザー = torch.optim.Adam(model.parameters(),lr=0.001) スケジューラ = torch.optim.lr_scheduler.OneCycleLR(オプティマイザ、max_lr=0.001、 ステップ数/エポック = int(len(train_dl))、 エポック=num_epochs、 anneal_strategy = '線形') # 各エポックごとに繰り返します 範囲(num_epochs)内のエポックの場合: ランニングロス = 0.0 正しい予測 = 0 合計予測 = 0 # トレーニングセット内の各バッチについて繰り返します iの場合、enumerate(train_dl)内のデータ: # 入力特徴とターゲットラベルを取得し、GPUに配置する 入力、ラベル = data[0].to(デバイス)、data[1].to(デバイス) # 入力を正規化する inputs_m、inputs_s = inputs.mean()、inputs.std() 入力 = (入力 - inputs_m) / inputs_s # パラメータの勾配をゼロにする オプティマイザ.zero_grad() # 前進 + 後退 + 最適化 出力 = モデル(入力) 損失 = 基準(出力、ラベル) 損失.後方() オプティマイザ.ステップ() スケジューラ.ステップ() # 損失と精度の統計を保存する 実行中の損失 += 損失.item() # 最高スコアの予測クラスを取得する _, 予測 = torch.max(出力,1) # ターゲットラベルに一致した予測の数 正しい予測 += (予測 == ラベル).sum().item() 合計予測 += 予測形状[0] #if i % 10 == 0: # 10 個のミニバッチごとに印刷 # print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 10)) # エポック終了時に統計情報を出力します バッチ数 = len(train_dl) 平均損失 = 実行損失 / バッチ数 acc = 正しい予測/合計予測 print(f'エポック: {epoch}, 損失: {avg_loss:.2f}, 精度: {acc:.2f}') print('トレーニング終了') num_epochs=2 # デモ用なので、これを高く調整します。 トレーニング(myModel、train_dl、num_epochs) 推論 通常、トレーニング ループの一部として、検証データのメトリックも評価します。 そこで、元のデータから保持されたテスト データセット (トレーニング中に未知のデータとして扱われる) に対して推論を実行します。 このデモでは、検証データを使用します。 勾配更新を無効にして推論ループを実行します。 予測を得るためにモデルでフォワードパスを実行しますが、バックプロパゲーションと最適化は必要ありません。
結論はここまで、オーディオのディープラーニングにおける最も基本的な問題の 1 つであるサウンド分類のエンドツーエンドの例を見てきました。 これは幅広いアプリケーションで使用できるだけでなく、ここで紹介する概念やテクニックの多くは、人間の音声から始めて、人が言っていることを理解し、それをテキストに変換する自動音声認識などの、より複雑なオーディオの問題にも関連します。 |
<<: 人間は機械化され、機械は人間化されるのです!起こっていることはさらに恐ろしいことだ。
>>: ペイ・ジアンのチームの44ページの新作:ディープラーニングモデルの複雑さを理解するには、これを読んでください
[[386332]] 1950 年代に、SF 作家のフレドリック・ブラウンは超知能機械についての物...
言語は思考と知識を伝達し、人類の文明を推進します。そして会話によって機械はより賢くなり、人間にとって...
この記事では、AI によって生成された画像を検出するためのディープラーニング モデルを開発する方法に...
AIの分野では、オープンソースとクローズドソースの選択については、常に意見が分かれてきました。しかし...
[[404075]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...
この記事では、Keras Tensorflow 抽象ライブラリに基づく転移学習アルゴリズム モデルを...
かつて、農業と言えば、人々はいつも「真昼に畑を耕し、汗を地面に垂らす」という苦労を思い浮かべていまし...
人工知能 (AI) と機械学習 (ML) は、スタートアップを含む複数の業界に革命をもたらしました。...
7月3日、キングソフトは北京オリンピックタワーで「シンプル・クリエイティブ・シンプルではない」をテー...