ここ生32ビット浮動小数点オーディオサンプルを含むファイルを読み取り、それらのサンプルを含むWAVファイルを作成し、サンプルのPython 2.7プログラムは、16ビット符号付き整数サンプルを変換しています:
import sys
import array
import struct
import wave
def convert(fin, fout, chunk_size = 1024 * 1024):
chunk_size *= 4 # convert from samples to bytes
waveout = wave.open(fout, "wb")
waveout.setparams((1, 2, 44100, 0, "NONE", ""))
while True:
raw_floats = fin.read(chunk_size)
if raw_floats == "":
return
floats = array.array('f', raw_floats)
samples = [sample * 32767
for sample in floats]
raw_ints = struct.pack("<%dh" % len(samples), *samples)
waveout.writeframes(raw_ints)
convert(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))
コードはarray.array
を使用しますstruct.unpack
よりも少し速くなければならないため、32ビット浮動小数点サンプルをPython浮動小数点数に変換する必要があります。 Float32Array
のように、ネイティブマシンのバイトオーダーも使用します。ネイティブマシンのオーダーに関係なくリトルエンディアンのバイトオーダーを使用する必要があるため、array.array
を使用して16ビット整数サンプルを作成することはできません。範囲の変換は単純なPythonコードで処理されます。
'struct'モジュールは、これらの型を直接変換することはできません。 32ビット浮動小数点値をPython floatにアンパックするだけで、Python intを16ビット整数にパックすることができます。また、必要な範囲変換も行いません。 –