タイムスタンプを求める
このサウンドウェーブのサンプリング周波数が 48 kHz であることはすでにわかっていますが、もしわかっていなかったらどうすればよいでしょうか。サウンドウェーブ配列の長さをサウンドウェーブの長さ(秒)で割ることで求めることもできますが、Python の wave モジュールにはもっと良い方法があります。wave オブジェクトに対して getframerate() を呼び出すと、そのオブジェクトのフレームレートを取得できます。
次に、NumPy の linspace() メソッドを使うことで、サウンドウェーブ配列内の各整数のタイムスタンプを求められます。これは、今後サウンドウェーブを可視化する際に役立ちます。
linspace() メソッドは start、stop、num というパラメータを受け取り、start から stop までの間で均等に分布した num 個の値を返します。
今回の場合、start は 0、stop はサウンドウェーブ配列の長さをフレームレートで割った値(つまり音声ファイルの長さ)、num はサウンドウェーブ配列の長さになります。
この演習はコースの一部です
Pythonで学ぶ音声言語処理
演習の手順
- サウンドウェーブのバイトデータを整数に変換します。
getframerate()を使って、good morning 音声ファイルのフレームレートを取得します。stopにsoundwave_gmの長さをフレームレートで割った値を設定します。numにsoundwave_gmの長さを設定します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Read in sound wave and convert from bytes to integers
good_morning = wave.open('good_morning.wav', 'r')
signal_gm = good_morning.readframes(-1)
soundwave_gm = np.frombuffer(____, dtype='int16')
# Get the sound wave frame rate
framerate_gm = good_morning.____
# Find the sound wave timestamps
time_gm = np.linspace(start=0,
stop=____/____,
num=____)
# Print the first 10 timestamps
print(time_gm[:10])