首页 > 解决方案 > 在 Python 中创建 aiff 文件并使用 soundfile 和 sounddevice 播放它

问题描述

我在 aiff 文件中成功使用了 soundfile,但我想生成具有明确傅立叶分量的声音。

我在网上收集了几个代码并将它们放在一起创建一个 aiff 文件并尝试将其读回。我来的代码如下所示。我知道我非常接近,但我似乎迷失在 aiff 文件的二进制编码中。我尝试了很多方法,使用 h(具有 32767 变化幅度的短整数到正弦函数并采用 int())和 f(float),它给出了我正在寻找的声音,但有很多失真。任何帮助表示赞赏!(我在macosx catalina和python 3.8上工作,编码是little-endian,所以我在struct语句中使用了<)。

import aifc,struct
import numpy as np
import soundfile as sf
import sounddevice as sd

sampleRate = 44100 # hertz
seconds = 3 # seconds
frequency = 440.0 # hertz

obj = aifc.open('sound.aif','w')
obj.setnchannels(1) # mono
obj.setsampwidth(2)
obj.setframerate(sampleRate)

t = np.linspace(0, seconds, seconds * sampleRate, False)
value=[]
for i in t:
    value.append(np.sin(i*frequency*2*np.pi))

# This is the line that troubles me...
data = struct.pack('<'+'f'*len(value), *value)

plt.figure()
plt.plot(t[0:100],value[0:100])
plt.show()

obj.writeframes( data )
obj.close()

obj = aifc.open('sound.aif','r')
print( "Number of channels",obj.getnchannels())
print ( "Sample width",obj.getsampwidth())
print ( "Frame rate.",obj.getframerate())
print ("Number of frames",obj.getnframes())
print ( "parameters:",obj.getparams())
obj.close()

data, fs = sf.read('sound.aif')
sd.play(data, fs, blocking=True)

标签: pythonaudioaiff

解决方案


推荐阅读