我想使用Python 2.7从-1到1之间的浮点值数组生成一个24位WAV格式的音频文件。我无法使用 scipy.io.wavfile.write 因为它只支持16位或32位。 Python自己的文档 波 模块没有指定它采用的数据格式。
那么在Python中可以做到这一点吗?
我想使用Python 2.7从-1到1之间的浮点值数组生成一个24位WAV格式的音频文件。我无法使用 scipy.io.wavfile.write 因为它只支持16位或32位。 Python自己的文档 波 模块没有指定它采用的数据格式。
那么在Python中可以做到这一点吗?
另一种选择是 wavio
(也在PyPI上: https://pypi.python.org/pypi/wavio),我创建的一个小模块,解决了尚未支持24位WAV文件的scipy问题。文件 wavio.py
包含该功能 write
,将numpy数组写入WAV文件。要编写24位文件,请使用参数 sampwidth=3
。唯一的依赖 wavio
笨拙 wavio
使用标准库 wave
处理WAV文件格式。
例如,
In [21]: import numpy as np
In [22]: import wavio
In [23]: rate = 22050 # samples per second
In [24]: T = 3 # sample duration (seconds)
In [25]: f = 440.0 # sound frequency (Hz)
In [26]: t = np.linspace(0, T, T*rate, endpoint=False)
In [27]: sig = np.sin(2 * np.pi * f * t)
In [28]: wavio.write("sine24.wav", sig, rate, sampwidth=3)
我已经 提交了这个问题的答案 2年前,我推荐的地方 scikits.audiolab。
与此同时,情况发生了变化,现在有一个可用的库,更容易使用,也更容易安装,它甚至附带了自己的副本。 libsndfile 适用于Windows和OSX的库(在Linux上,无论如何都很容易安装): PySoundFile!
如果安装了CFFI和NumPy,只需运行即可安装PySoundFile
pip install soundfile --user
编写24位WAV文件很简单:
import soundfile as sf
sf.write('my_24bit_file.wav', my_audio_data, 44100, 'PCM_24')
在这个例子中, my_audio_data
必须是一个NumPy数组 dtype
'float64'
, 'float32'
, 'int32'
要么 'int16'
。
顺便说一下,我做了一个 概述页面 我试图比较许多可用的Python库来读/写声音文件。
试试吧 wave
模块:
In [1]: import wave
In [2]: w = wave.open('foo.wav', 'w') # open for writing
In [3]: w.setsampwidth(3) # 3 bytes/sample
Python只能打包2和4个大小的整数。所以你可以在int32上使用带有dtype的numpy数组,并使用列表推导来获得每个整数的3/4字节:
In [14]: d = np.array([1,2,3,4], dtype=np.int32)
In [15]: d
Out[15]: array([1, 2, 3, 4], dtype=int32)
In [16]: [d.data[i:i+3] for i in range(0,len(d)*d.dtype.itemsize, d.dtype.itemsize)]
Out[16]: ['\x01\x00\x00', '\x02\x00\x00', '\x03\x00\x00', '\x04\x00\x00']
另一种选择是 wavio
(也在PyPI上: https://pypi.python.org/pypi/wavio),我创建的一个小模块,解决了尚未支持24位WAV文件的scipy问题。文件 wavio.py
包含该功能 write
,将numpy数组写入WAV文件。要编写24位文件,请使用参数 sampwidth=3
。唯一的依赖 wavio
笨拙 wavio
使用标准库 wave
处理WAV文件格式。
例如,
In [21]: import numpy as np
In [22]: import wavio
In [23]: rate = 22050 # samples per second
In [24]: T = 3 # sample duration (seconds)
In [25]: f = 440.0 # sound frequency (Hz)
In [26]: t = np.linspace(0, T, T*rate, endpoint=False)
In [27]: sig = np.sin(2 * np.pi * f * t)
In [28]: wavio.write("sine24.wav", sig, rate, sampwidth=3)
我已经 提交了这个问题的答案 2年前,我推荐的地方 scikits.audiolab。
与此同时,情况发生了变化,现在有一个可用的库,更容易使用,也更容易安装,它甚至附带了自己的副本。 libsndfile 适用于Windows和OSX的库(在Linux上,无论如何都很容易安装): PySoundFile!
如果安装了CFFI和NumPy,只需运行即可安装PySoundFile
pip install soundfile --user
编写24位WAV文件很简单:
import soundfile as sf
sf.write('my_24bit_file.wav', my_audio_data, 44100, 'PCM_24')
在这个例子中, my_audio_data
必须是一个NumPy数组 dtype
'float64'
, 'float32'
, 'int32'
要么 'int16'
。
顺便说一下,我做了一个 概述页面 我试图比较许多可用的Python库来读/写声音文件。
试试吧 wave
模块:
In [1]: import wave
In [2]: w = wave.open('foo.wav', 'w') # open for writing
In [3]: w.setsampwidth(3) # 3 bytes/sample
Python只能打包2和4个大小的整数。所以你可以在int32上使用带有dtype的numpy数组,并使用列表推导来获得每个整数的3/4字节:
In [14]: d = np.array([1,2,3,4], dtype=np.int32)
In [15]: d
Out[15]: array([1, 2, 3, 4], dtype=int32)
In [16]: [d.data[i:i+3] for i in range(0,len(d)*d.dtype.itemsize, d.dtype.itemsize)]
Out[16]: ['\x01\x00\x00', '\x02\x00\x00', '\x03\x00\x00', '\x04\x00\x00']
使用 wave
模块, Wave_write.writeframes
函数期望WAV数据以小端格式打包成3字节字符串。以下代码可以解决问题:
import wave
from contextlib import closing
import struct
def wavwrite_24(fname, fs, data):
data_as_bytes = (struct.pack('<i', int(samp*(2**23-1))) for samp in data)
with closing(wave.open(fname, 'wb')) as wavwriter:
wavwriter.setnchannels(1)
wavwriter.setsampwidth(3)
wavwriter.setframerate(fs)
for data_bytes in data_as_bytes:
wavwriter.writeframes(data_bytes[0:3])
你应该试试 scikits.audiolab:
import numpy as np
from scikits.audiolab import Sndfile, Format
sig = np.array([0, 1, 0, -1, 0], dtype=np.float32)
f = Sndfile('test_pcm24.wav', 'w', Format('wav', 'pcm24'), 1, 44100)
f.write_frames(sig)
f.close() # use contextlib.closing in real code
并再次阅读:
f = Sndfile('test_pcm24.wav')
sig = f.read_frames(f.nframes, dtype=np.float32)
f.close() # use contextlib.closing in real code
scikits.audiolab
使用 libsndfile,因此除了WAV文件,您还可以使用FLAC,OGG和更多文件格式。