首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.io :不能写波文件

scipy.io :不能写波文件
EN

Stack Overflow用户
提问于 2016-11-26 20:35:24
回答 1查看 8.3K关注 0票数 8

我有一个问题,把一个2d的numpy数组写成一个波文件(音频)

根据文档,我应该编写一个2d int16 numpy数组。

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

代码语言:javascript
复制
16-bit PCM  -32768  +32767  int16

作为float32格式的numpy数组(-1,1),我首先将其转换为16位int。

代码语言:javascript
复制
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)

我得到以下输出:

代码语言:javascript
复制
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之间,所以应该可以。但我的数据似乎被解读为

EN

Stack Overflow用户

回答已采纳

发布于 2016-11-27 03:36:57

write函数在scipy.io.wavfile中期望输入数组具有形状(num_samples, num_channels)。我怀疑您的数组具有形状(num_channels, num_samples)。然后,write试图将num_samples放在一个结构中的16位字段中,该结构被写入WAV文件,但是num_samples的值对于16位值来说太大了。(请注意,如果num_samples足够小,您将不会得到错误,但是文件将没有正确的格式。)

一个快速的解决方法是编写数组的转置:

代码语言:javascript
复制
wavfile.write(outWaveFileName, 44100, stereoAudio.T)

例如,下面是一些演示错误的代码;xy具有形状(2,40000):

代码语言:javascript
复制
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的输入具有预期的形状:

代码语言:javascript
复制
In [16]: wavfile.write('foo.wav', 44100, y.T)

读取数据以验证它是否如预期的那样工作:

代码语言:javascript
复制
In [22]: fs, z = wavfile.read('foo.wav')

In [23]: np.allclose(z, y.T)
Out[23]: True
票数 18
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40822877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档