Toshusai blog

知識の保管庫

Python3でwavファイルから24fpsの波形データをとる

Python3でwavファイルから24fpsの波形データをとる

音の波形データを動画(24fps)に合わせて取りたかったのでやってみる。

wavファイルの読み込み

Pythonには標準ライブラリでwavファイルを扱うwavというものが用意されている。

wave.open(file, mode=None) file が文字列ならその名前のファイルを開き、そうでないなら file like オブジェクトとして扱います。 mode は以下のうちのいずれかです:
'rb'
読み出しのみのモード。
'wb'
書き込みのみのモード。
Wave_read.getnframes()
オーディオフレーム数を返します。
Wave_read.readframes(n)
最大 n 個のオーディオフレームを読み込んで、 bytes オブジェクトとして返します。

bytes(バイナリデータ)でしか取れないのでnumpy等で変換する。

import wave
import numpy

wf = wave.open([filename], "r")
buf = wf.readframes(wf.getnframes())
data = np.frombuffer(buf, dtype = "int16")

24fpsでデータを取る

大体の音声は44100Hzで動画に使うには使いづらいので24fpsにしたい。

Wave_read.getframerate()
サンプリングレートを返します。

サンプリングレートを24で割った値ごとにデータを取っていけば24fpsにできる。 しかし、バイナリから変換した配列の長さは総オーディオフレームの2倍ある(右と左の分)ので、その2倍ごとに値を取る必要がある。

import wave
import numpy

wf = wave.open([filename], "r")
buf = wf.readframes(wf.getnframes())
data = np.frombuffer(buf, dtype = "int16")
frame = wf.getnframe()#総フレーム
rate = wf.getframerate()#サンプリングレート
vframe = int(rate / 24)#1837.5
vdata = []
for i in range(int(frame / vframe)):
    vdata.append(data[i * vframe * 2])
print(vdata)
"""
[289, 6628, 3149, -3613, 4529, -932, -2145, ...省略...
"""

参考