我正在尝试用python的wave
和numpy
写一个音频文件,目前为止我有以下代码,运行良好:
import wave
import numpy as np
# set up WAV file parameters
num_channels = 1 # mono audio
sample_width = 1 # 8 bits(1 byte)/sample
sample_rate = 44.1e3 # 44.1k samples/second
frequency = 440 # 440 Hz
duration = 20 # play for this many seconds
num_samples = int(sample_rate * duration) # samples/seconds * seconds
# open WAV file and write data
with wave.open('sine8bit_2.wav', 'w') as wavfile:
wavfile.setnchannels(num_channels)
wavfile.setsampwidth(sample_width)
wavfile.setframerate(sample_rate)
t = np.linspace(0, duration, num_samples)
data = (127*np.sin(2*np.pi*frequency*t)).astype(np.int8)
wavfile.writeframes(data) # or data.tobytes() ??
我的问题是,由于我使用的是高采样率,变量num_samples
可能很快变得太大(比如说3分30秒的音轨有9261000个样本)。使用这么大的numpy数组是否可取?有没有更好的方法来实现这一点?在这种情况下还需要使用writeframes(.tobytes())
,因为没有它我的代码也能正常运行,而且这似乎是额外的开销(特别是当数组变得太大时)。
1条答案
按热度按时间jhkqcmku1#
假设您只打算写入正弦波,则可以只创建一个周期作为
data
数组,并将其多次写入.wav
文件。使用你提供的参数,你的
data
数组在这种方法下小了8800倍,它的大小也不再取决于你的文件的持续时间!