Path: blob/master/site/ja/tutorials/audio/simple_audio.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
簡単な音声認識: キーワードの認識
このチュートリアルでは、WAV 形式の音声ファイルを前処理し、基本的な自動音声認識 (ASR) モデルを構築およびトレーニングして 10 の異なる単語を認識させる方法を示します。Speech Commands データセット (Warden, 2018) の一部を使用します。これには、「down」、「go」、「left」、「no」、「right」、「stop」、「up」、「yes」などのコマンドの短い (1 秒以下) 音声クリップが含まれています。
現実世界の音声認識システムは複雑ですが、MNIST データセットを使用した画像分類と同様に、このチュートリアルでは、関連する基本的な手法について説明します。
セットアップ
必要なモジュールと依存関係をインポートします。ここでは、.wav
ファイルから音声分類データセットを生成する際に役立つ tf.keras.utils.audio_dataset_from_directory
(TensorFlow 2.10 で導入)を使用します。このチュートリアルでは、可視化を行うための seaborn も必要です。
Mini Speech Commands データセットをインポートする
データの読み込みにかかる時間を短縮するために、Speech Commands データセットの小さいバージョンを使用します。元のデータセットには、105,000 を超える WAV (波形) ファイル形式の音声ファイルが含まれており、様々な人が 35 個の英単語を発音しています。このデータは Google によって収集され、CC BY ライセンスの下で公開されました。
tf.keras.utils.get_file
を使用して、小さな音声コマンドデータセットを含む mini_speech_commands.zip
ファイルをダウンロードして解凍します。
データセットの音声クリップは、各音声コマンド (no
、yes
、down
、go
、left
、up
、right
、stop
) に対応する 8 つのフォルダに保存されています。
このようにディレクトリに分割すると、keras.utils.audio_dataset_from_directory
を使用してデータを簡単に読み込めます。
音声クリップは 16kHz で 1 秒以下です。 output_sequence_length=16000
は、簡単にバッチ処理できるように、短いものを正確に 1 秒にパディングします (長いものはトリミングします)。
データセットには、音声クリップと整数ラベルのバッチが含まれるようになりました。音声クリップの形状は (batch, samples, channels)
です。
このデータセットには単一チャンネルの音声しか含まれていないため、tf.squeeze
関数を使用して余分な軸を削除します。
utils.audio_dataset_from_directory
関数は、最大 2 つの分割のみを返します。テストセットを検証セットとは別にしておくことをお勧めします。別のディレクトリに保存するのが理想的ですが、この場合は Dataset.shard
を使用して検証セットを 2 つに分割できます。任意のシャードを反復処理すると、すべてのデータが読み込まれ、その一部のみが保持されることに注意してください。
いくつかの音声波形をプロットします。
波形をスペクトログラムに変換
データセットの波形は時間ドメインで表されます。次に、短時間フーリエ変換 (STFT) を計算して波形をスペクトログラムに変換することにより、波形を時間ドメイン信号から時間周波数ドメイン信号に変換します。時間の経過に伴う周波の変化を示し、2D 画像として表すことができます。スペクトログラム画像をニューラル ネットワークにフィードして、モデルをトレーニングします。
フーリエ変換 (tf.signal.fft
) は、信号をその成分の周波数に変換しますが、すべての時間情報は失われます。対照的に、STFT (tf.signal.stft
) は信号を時間のウィンドウに分割し、時間情報を保持して各ウィンドウでフーリエ変換を実行し、2D テンソルを返すので標準の畳み込みを実行できます。
波形をスペクトログラムに変換するユーティリティ関数を作成します。
波形をスペクトログラムに変換する場合、結果が同様の次元になるように、波形は同じ長さである必要があります。そのために、1 秒未満の音声クリップはゼロパディングします (
tf.zeros
を使用)。tf.signal.stft
を呼び出すときは、生成されたスペクトログラム「画像」がほぼ正方形になるようにframe_length
およびframe_step
パラメータを選択します。STFT パラメータの選択の詳細については、音声信号処理と STFT に関するこの Coursera 動画を参照してください。STFT は、大きさと位相を表す複素数の配列を生成します。ただし、このチュートリアルでは、
tf.signal.stft
の出力にtf.abs
を適用することで導出できる大きさのみを使用します。
次に、データを探索します。1 つの例のテンソル化された波形と対応するスペクトログラムの形状を出力し、元の音声を再生します。
次に、スペクトログラムを表示する関数を定義します。
時間の経過に伴う例の波形と、対応するスペクトログラム (時間の経過に伴う周波数) をプロットします。
音声データセットからスペクトログラムデータセットを作成します。
データセットのさまざまな例のスペクトログラムを調べます。
モデルを構築してトレーニングする
Dataset.cache
と Dataset.prefetch
演算を追加して、モデルのトレーニング時の読み取りレイテンシを短縮します。
音声ファイルをスペクトログラム画像に変換したので、モデルで単純な畳み込みニューラル ネットワーク (CNN) を使用します。
tf.keras.Sequential
モデルは、次の Keras 前処理レイヤーを使用します。
tf.keras.layers.Resizing
は入力をダウンサンプリングし、モデルをより迅速にトレーニングできるようにします。tf.keras.layers.Normalization
は平均値と標準偏差に基づいて画像内の各ピクセルを正規化します。
Normalization
レイヤーの場合、まずトレーニングデータに対して adapt
メソッドを呼び出して、集計統計 (平均と標準偏差) を計算する必要があります。
Adam オプティマイザとクロスエントロピー損失を使用して Keras モデルを構成します。
デモするために、モデルを 10 エポックにわたってトレーニングします。
トレーニングと検証の損失曲線をプロットして、トレーニング中にモデルがどのように改善されたかを確認します。
モデルのパフォーマンスを評価する
テストセットでモデルを実行し、モデルのパフォーマンスを確認します。
混同行列を表示する
混同行列を使用して、モデルがテストセット内の各コマンドをどの程度うまく分類したかを確認します。
音声ファイルで推論を実行する
最後に、誰かが「no」と言っている入力音声ファイルを使用して、モデルの予測出力を検証します。モデルのパフォーマンスはどうですか?
出力が示すように、モデルは音声コマンドを「no」として認識しているはずです。
モデルを前処理してエクスポートする
推論のためにデータをモデルに渡す前に、これらの前処理手順を適用する必要がある場合、このモデルはあまり簡単に使用できません。そのため、エンドツーエンドのバージョンをビルドします。
「エクスポート」モデルをテスト実行します。
モデルを保存して再読み込みすると、再読み込みされたモデルから同じ出力が得られます。
次のステップ
このチュートリアルでは、TensorFlow と Python を使用した畳み込みニューラル ネットワークを使用して、簡単な音声分類/自動音声認識を実行する方法を実演しました。詳細については、次のリソースを参照してください。
YAMNet による音声分類のチュートリアルでは、音声分類に転移学習を使用する方法を実演します。
Kaggle の TensorFlow 音声認識チャレンジのノートブック。
TensorFlow.js - 転移学習コードラボを使用した音声認識では、音声分類用の独自のインタラクティブな Web アプリを構築する方法について説明します。
音楽情報検索のためのディープラーニングに関するチュートリアル (Choi et al., 2017)、arXiv。
また、TensorFlow には、独自の音声ベースのプロジェクトに役立つ音声データの準備と拡張のための追加サポートがあります。
音楽および音声分析用の librosa ライブラリの使用を検討してください。