Python scipy.io.wavfile.write无声音
我想在.wav文件中写入信号,但当我使用 scipy.io.wavfile.编写它,只需为我创建一个没有声音的.wav文件。 .wav具有良好的长度,但没有声音。 我想找到解决这个问题的办法,但找不到帮助。 我的代码如下:Python scipy.io.wavfile.write无声音,python,scipy,Python,Scipy,我想在.wav文件中写入信号,但当我使用 scipy.io.wavfile.编写它,只需为我创建一个没有声音的.wav文件。 .wav具有良好的长度,但没有声音。 我想找到解决这个问题的办法,但找不到帮助。 我的代码如下: 将scipy作为sp导入 将numpy作为np导入 dt=np.dtype(np.int32) sig=np.fromfile(文件名,dtype=dt,count=-1,sep='') sp.io.wavfile.write('sound.wav',int(fS),sig
将scipy作为sp导入
将numpy作为np导入
dt=np.dtype(np.int32)
sig=np.fromfile(文件名,dtype=dt,count=-1,sep='')
sp.io.wavfile.write('sound.wav',int(fS),sig)
作为测试,我还做了一个小功能:
def write_wav_sin(name,fs,f):
x = np.linspace(0,10,10*fs)
dt = np.dtype(np.float32)
sig = np.sin(2*math.pi*f*x, dtype=dt)
print(type(sig[0]))
sp.io.wavfile.write(name, fs, sig)
plt.plot(x,sig)
对于这个测试,它可以工作,但是对于我的其他代码,它不工作
有人知道我为什么会遇到这个问题吗?下面是一个有评论的示例,介绍了如何生成一个具有设置的持续时间、频率、体积和样本数的基本wave文件。利用和Python的库
import numpy as ny
import struct
import wave
class SoundFile:
def __init__(self, signal):
# https://docs.python.org/3.6/library/wave.html#wave.open
self.file = wave.open('test.wav', 'wb')
self.signal = signal
self.sr = 44100
def write(self):
# https://docs.python.org/3.6/library/wave.html#wave.Wave_write.setparams
self.file.setparams( ( 1, 2, self.sr, 44100 * 4, 'NONE', 'noncompressed' ) )
# https://docs.python.org/3.6/library/wave.html#wave.Wave_write.writeframes
self.file.writeframes( self.signal )
self.file.close()
# signal settings
duration = 4 # duration in Seconds
samplerate = 44100 # Hz (frequency)
samples = duration * samplerate # aka samples per second
frequency = 440 # Hz
period = samplerate / float( frequency ) # of samples
omega = ny.pi * 2 / period # calculate omega (angular frequency)
volume = 16384 # 16384 is the volume measure (max is 32768)
# create sin wave
xaxis = ny.arange( samples, dtype = ny.float )
ydata = volume * ny.sin( xaxis * omega )
# fill blanks
signal = ny.resize( ydata, ( samples, ) )
#create sound file
f = SoundFile( signal )
f.write()
print( 'sound file created' )
我尽我所能评论、更新和修改随机博主的源代码。下面是一个评论示例,介绍如何生成一个具有设置的持续时间、频率、体积和样本数的基本wave文件。利用和Python的库
import numpy as ny
import struct
import wave
class SoundFile:
def __init__(self, signal):
# https://docs.python.org/3.6/library/wave.html#wave.open
self.file = wave.open('test.wav', 'wb')
self.signal = signal
self.sr = 44100
def write(self):
# https://docs.python.org/3.6/library/wave.html#wave.Wave_write.setparams
self.file.setparams( ( 1, 2, self.sr, 44100 * 4, 'NONE', 'noncompressed' ) )
# https://docs.python.org/3.6/library/wave.html#wave.Wave_write.writeframes
self.file.writeframes( self.signal )
self.file.close()
# signal settings
duration = 4 # duration in Seconds
samplerate = 44100 # Hz (frequency)
samples = duration * samplerate # aka samples per second
frequency = 440 # Hz
period = samplerate / float( frequency ) # of samples
omega = ny.pi * 2 / period # calculate omega (angular frequency)
volume = 16384 # 16384 is the volume measure (max is 32768)
# create sin wave
xaxis = ny.arange( samples, dtype = ny.float )
ydata = volume * ny.sin( xaxis * omega )
# fill blanks
signal = ny.resize( ydata, ( samples, ) )
#create sound file
f = SoundFile( signal )
f.write()
print( 'sound file created' )
我尽了最大努力通过随机博客评论、更新和修改源代码。通过打印
sig.min()
和sig.max()
检查sig
中的值范围。这些值不是通过wavfile.write来缩放的,因此可能是您的文件的值太低,以至于您听不到它们
尝试放大32位整数值,或将数据写入规范化的32位浮点。例如,这会在保存前将sig
转换为[-1,1]范围内的32位浮点值:
m = np.max(np.abs(sig))
sigf32 = (sig/m).astype(np.float32)
sp.io.wavfile.write('sound.wav', int(fS), sigf32)
通过打印sig.min()
和sig.max()
检查sig
中的值范围。这些值不是通过wavfile.write来缩放的,因此可能是您的文件的值太低,以至于您听不到它们
尝试放大32位整数值,或将数据写入规范化的32位浮点。例如,这会在保存前将sig
转换为[-1,1]范围内的32位浮点值:
m = np.max(np.abs(sig))
sigf32 = (sig/m).astype(np.float32)
sp.io.wavfile.write('sound.wav', int(fS), sigf32)
最后,我将所有信号的最大振幅除以更小的值(有时我的信号的振幅为500000,将其写入一个波形,我将其除以250000)
使用这个技巧,我可以听到声音,但有一些奇怪的东西,比如附加的伪影/噪声(我将其与使用matlab获得的.wav进行比较,使用相同的文件)
我使用的代码是:
import scipy as sp
import numpy as np
dt = np.dtype(np.int32)
sig = np.fromfile(filename, dtype=dt, count=-1, sep='')
sp.io.wavfile.write('sound.wav', int(fS), sig/250000)
最后,我将所有信号的最大振幅除以更小的值(有时我的信号的振幅为500000,将其写入一个波形,我将其除以250000)
使用这个技巧,我可以听到声音,但有一些奇怪的东西,比如附加的伪影/噪声(我将其与使用matlab获得的.wav进行比较,使用相同的文件)
我使用的代码是:
import scipy as sp
import numpy as np
dt = np.dtype(np.int32)
sig = np.fromfile(filename, dtype=dt, count=-1, sep='')
sp.io.wavfile.write('sound.wav', int(fS), sig/250000)
嗨,诺亚,谢谢你的回答。这个代码适合你吗?我尝试了这段代码,但由于行:ssignal=''.join((信号中项的wave.struct.pack('h',item))struct.error:必需的参数不是整数,所以它不起作用。@AntoineV对此我很抱歉。我使用较旧版本的Python进行了测试。我已经用工作代码更新了原来的帖子<在更高版本的NumPy/Python中不再需要代码>结构包
;调整阵列的大小,然后创建一个新的声音文件实例(不打包),这将提供我们想要的输出。享受任何问题,请随时提问。嗨@Noah,谢谢你的回答。这个代码适合你吗?我尝试了这段代码,但由于行:ssignal=''.join((信号中项的wave.struct.pack('h',item))struct.error:必需的参数不是整数,所以它不起作用。@AntoineV对此我很抱歉。我使用较旧版本的Python进行了测试。我已经用工作代码更新了原来的帖子<在更高版本的NumPy/Python中不再需要代码>结构包
;调整阵列的大小,然后创建一个新的声音文件实例(不打包),这将提供我们想要的输出。享受任何问题,请随时提问。请看我的答案。请看我的答案。您好@warren,通过您的缩放,它工作得更好,不再有任何瑕疵/噪音,谢谢!您好@warren,通过您的缩放,它工作得更好,不再有瑕疵/噪音,谢谢!