2016-11-26 4 views
2

を書き込むことはできませんscipy.io:私は、waveファイル(オーディオ)として、2D numpyの配列を書いて問題を持っているwavfile

私は2D INT16 numpyの配列

https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.io.wavfile.write.html

を書くべきドキュメントによると、私は最初の16ビットに変換するのfloat32形式の範囲内の私のnumpyのアレイ(-1,1)として
16-bit PCM -32768 +32767 int16 

stereoAudio = ((stereoAudio * bits16max)).astype('int16') 

print "argmax : " + str(np.amax(stereoAudio)) 
print "argmin : " + str(np.amin(stereoAudio)) 

outWaveFileName = "out/file.wav" 
print "writing " + outWaveFileName 
wavfile.write(outWaveFileName,44100,stereoAudio) 
int型

は、私は次のような出力が得られます。

argmax : 4389 
argmin : -4381 
writing out/file.wav 
Traceback (most recent call last): 
    File "/Users/me/file.py", line 132, in <module> 
wavfile.write(outWaveFileName,44100,stereoAudio) 
    File "//anaconda/lib/python2.7/site-packages/scipy/io/wavfile.py", line 353, in write 
    bytes_per_second, block_align, bit_depth) 
error: ushort format requires 0 <= number <= USHRT_MAX 

私の値は、16ビット形式で-4391と4389の間にあるとして、それはOKである必要があります。私のデータはushortとして解釈されているようです

+0

ご質問のリンクは死んでいます... –

答えて

3

scipy.io.wavfilewriteの関数は、入力配列の形状が(num_samples, num_channels)であると想定しています。あなたのアレイは形が(num_channels, num_samples)であると思われます。次にwriteは、WAVファイルに書き込まれる構造体の16ビットフィールドにnum_samplesを入れようとしますが、num_samplesの値は16ビット値には大きすぎます。 (num_samplesが十分に小さかったならば、あなたがエラーを取得しないことに注意してください、しかし、ファイルが正しい形式になっていません。)

クイックフィックスは、あなたの配列の転置を書くことである:

wavfile.write(outWaveFileName, 44100, stereoAudio.T) 

たとえば、エラーを示すコードを次に示します。

In [12]: x = (2*np.random.rand(2, 40000) - 1).astype(np.float32) 

In [13]: y = (x*32767).astype('int16') 

In [14]: from scipy.io import wavfile 

In [15]: wavfile.write('foo.wav', 44100, y) 
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 
<ipython-input-15-36b8cd0e729c> in <module>() 
----> 1 wavfile.write('foo.wav', 44100, y) 

/Users/warren/anaconda/lib/python2.7/site-packages/scipy/io/wavfile.pyc in write(filename, rate, data) 
    351 
    352   fmt_chunk_data = struct.pack('<HHIIHH', format_tag, channels, fs, 
--> 353          bytes_per_second, block_align, bit_depth) 
    354   if not (dkind == 'i' or dkind == 'u'): 
    355    # add cbSize field for non-PCM files 

error: ushort format requires 0 <= number <= USHRT_MAX 

wavfile.writeへの入力が期待される形状を有するように配列をトランスポーズ:

In [16]: wavfile.write('foo.wav', 44100, y.T) 

は、予想通り、それが働いたことを確認するためにデータをリードバックxy形状(2、40000)を有します。

In [22]: fs, z = wavfile.read('foo.wav') 

In [23]: np.allclose(z, y.T) 
Out[23]: True 
+0

ありがとうございます、私の配列は(num_channels、num_samples) –

関連する問題