オーディオ データについて
- 10 分
オーディオ分類モデルを構築する前に、TensorFlow で処理できるオーディオがデータになる方法を理解する必要があります。
音は連続アナログ信号として始まります。 マイクはその信号をキャプチャし、一定の時間間隔で信号をサンプリングして一連の数値に変換します。 1 秒あたりにキャプチャされたサンプルの数は サンプル レートです。 たとえば、16 kHz のオーディオ ファイルには、1 秒あたり 16,000 サンプルが含まれています。
各サンプルは、ある時点の信号の 振幅 を格納します。 サンプル全体の振幅をプロットすると、波形が表示 されます。 オーディオには、1 つ以上の チャネルを含めることもできます。 mono ファイルには 1 つのチャネルがあります。ステレオ ファイルには、通常は左右の 2 つのチャネルがあります。
長いオーディオでは、信号をより小さな フレーム に分割し、各フレームを個別に分類することがよくあります。 このモジュールで使用される音声コマンドの例は既に 1 秒以下であるため、モデルは各ファイル全体を 1 つのコマンドとして分類できます。
Note
このモジュールのコードでは、TensorFlow 2.10 以降を使用します。 次のユニットで使用 tf.keras.utils.audio_dataset_from_directory オーディオ データ ローダーは、TensorFlow 2.10 で導入されました。 インストールする TensorFlow リリースでサポートされているPythonバージョンを使用し、import tensorflow as tfが動作することを確認し、視覚化の例として Matplotlib をインストールします。 セットアップのガイダンスについては、「 pip を使用した TensorFlow のインストール」 と 「Matplotlib のインストール」を参照してください。
パッケージをインポートする
次のコードは、オーディオ データの検査に使用されるパッケージをインポートします。
import pathlib
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
予想される出力: インポートが成功した場合、出力は表示されません。
Speech Commands データを取得する
Speech Commands データセットには、音声コマンドの短い WAV ファイルが含まれています。 この例を小さくするには、TensorFlow がチュートリアル用に提供する ミニ Speech Commands データセット を使用します。 これには、 down、 go、 left、 no、 right、 stop、 up、 yesの 8 つのコマンド フォルダーが含まれています。
次のコードは、最初の実行時にデータセットをダウンロードし、 tf.keras.utils.get_fileを使用して SHA-256 ハッシュを使用してアーカイブを検証し、抽出されたフォルダーを見つけます。 TensorFlow 2.16 以降では Keras 3 を使用します。Keras 3 は、アーカイブを <archive>_extracted サブディレクトリに抽出します。 以前のバージョンでは、キャッシュ ディレクトリに直接抽出されます。 ヘルパーは両方のレイアウトをチェックするため、ユニットの残りの部分はサポートされている TensorFlow バージョンで動作します。
DATASET_PATH = pathlib.Path("data/mini_speech_commands")
ALT_DATASET_PATH = pathlib.Path("data/mini_speech_commands_extracted/mini_speech_commands")
MINI_SPEECH_COMMANDS_SHA256 = "49650f2341b26d886b46b3f4fb8fed59e30300b17550f1ee4a768b3106cf93a0"
if not DATASET_PATH.exists() and not ALT_DATASET_PATH.exists():
tf.keras.utils.get_file(
"mini_speech_commands.zip",
origin="https://storage.googleapis.com/download.tensorflow.org/data/mini_speech_commands.zip",
file_hash=MINI_SPEECH_COMMANDS_SHA256,
hash_algorithm="sha256",
extract=True,
cache_dir=".",
cache_subdir="data",
)
if ALT_DATASET_PATH.exists():
DATASET_PATH = ALT_DATASET_PATH
commands = sorted(item.name for item in DATASET_PATH.iterdir() if item.is_dir())
print("Commands:", commands)
予想される出力: TensorFlow は、コードの初回実行時にデータセットをダウンロードして抽出します。 抽出後、コマンド リストには、次の出力のような 8 つのラベルが含まれている必要があります。
Commands: ['down', 'go', 'left', 'no', 'right', 'stop', 'up', 'yes']
このモジュールでは、 yes クラスと no クラスのみを使用します。
yes_files = sorted((DATASET_PATH / "yes").glob("*.wav"))
no_files = sorted((DATASET_PATH / "no").glob("*.wav"))
print(f"Yes examples: {len(yes_files)}")
print(f"No examples: {len(no_files)}")
予想される出力: ミニ データセットには、8 つのコマンドごとに 1,000 個の WAV ファイルが含まれているため、 yes 数と no 数は通常 1,000 個です。
WAV ファイルをテンソルに変換する
Speech Commands ファイルは、16 ビット PCM WAV ファイルです。 TensorFlow は、 tf.io.read_file を使用してファイル バイトを読み取り、 tf.audio.decode_wavを使用して 16 ビット PCM WAV データをデコードできます。 その他の WAV エンコードはデコードに失敗する可能性があるため、同じローダーを使用する前にカスタム オーディオを 16 ビット PCM WAV に変換します。
Speech Commands ファイルはモノラルで、16 kHz でサンプリングされます。
desired_channels=1引数は、1 つの出力チャネルを要求します。 マルチチャネル WAV ファイルの場合、 tf.audio.decode_wav は最初のチャネルを保持し、残りのチャネルを混在させる代わりに無視します。要求された数より少ないチャネルのファイルの場合は、最後のチャネルが複製されて要求された数に達します。
desired_samples=16000引数は、短いクリップにゼロを埋め込むか、長いクリップをトリミングします。
これらのファイルは 16 kHz でサンプリングされるため、16,000 サンプルは正確に 1 秒です。 異なるサンプル レートのオーディオの場合、16,000 サンプルは異なる期間を表します。
desired_samples は、別のサンプル レートで録音されたオーディオを再サンプリングしません。 再サンプリングするには、ファイルをデコードしてから、 tensorflow_io.audio.resampleなどのツールを使用するか、このワークフローを使用する前に別のオーディオ ツールチェーンでファイルを再サンプリングします。
def load_waveform(file_path):
audio_binary = tf.io.read_file(str(file_path))
waveform, sample_rate = tf.audio.decode_wav(
audio_binary,
desired_channels=1,
desired_samples=16000,
)
waveform = tf.squeeze(waveform, axis=-1)
return waveform, sample_rate
example_file = yes_files[0]
waveform, sample_rate = load_waveform(example_file)
print("Waveform shape:", waveform.shape)
print("Sample rate:", sample_rate.numpy())
print("Value range:", float(tf.reduce_min(waveform)), "to", float(tf.reduce_max(waveform)))
予想される出力: 波形は16,000サンプルの1次元テンソルです。
tf.audio.decode_wavは、理論上の範囲float32に正規化された[-1.0, 1.0]値を返します。 1 つのクリップの実際の最小値と最大値は、通常、その範囲内にあります。 出力は次のようになります。ファイル固有の最小値と最大値を使用します。
Waveform shape: (16000,)
Sample rate: 16000
Value range: -0.42306518 to 0.5128479
波形をプロットする
波形をプロットすると、時間の経過に伴うオーディオ信号の振幅が示されます。
timescale = np.arange(waveform.shape[0])
plt.figure(figsize=(12, 4))
plt.plot(timescale, waveform.numpy())
plt.title("Waveform for a 'yes' example")
plt.xlabel("Sample")
plt.ylabel("Amplitude")
plt.xlim([0, 16000])
plt.show()
予想される出力: このプロットには、スピーカーが "はい" と言うように、0 の上と下に移動する線が表示されます。オーディオ プレーヤーで選択した WAV ファイルを開くと、"はい" と言う人の短いクリップが読み上げられます。