この回答に基づいて、 numpy.fromstringまたはnumpy.fromfileを使用することで、パフォーマンスを大幅に向上させることができます。この回答も参照してください。
これが私がしたことです:
def interpret_wav(raw_bytes, n_frames, n_channels, sample_width, interleaved = True):
if sample_width == 1:
dtype = np.uint8 # unsigned char
elif sample_width == 2:
dtype = np.int16 # signed 2-byte short
else:
raise ValueError("Only supports 8 and 16 bit audio formats.")
channels = np.fromstring(raw_bytes, dtype=dtype)
if interleaved:
# channels are interleaved, i.e. sample N of channel M follows sample N of channel M-1 in raw data
channels.shape = (n_frames, n_channels)
channels = channels.T
else:
# channels are not interleaved. All samples from channel M occur before all samples from channel M-1
channels.shape = (n_channels, n_frames)
return channels
データをメモリにコピーする必要がある場合、形状に新しい値を割り当てるとエラーがスローされます。これは、データをその場で使用したい (全体的に少ない時間とメモリを使用する) ため、良いことです。ndarray.T 関数も可能であればコピーしません (つまり、ビューを返します) が、コピーしないことを保証する方法がわかりません。
np.fromfile を使用してファイルから直接読み取るとさらに効果的ですが、カスタム dtype を使用してヘッダーをスキップする必要があります。私はまだこれを試していません。