我这里有一个代码,可以在PyQT图形中显示音频文件的波形,不幸的是,图形看起来很大。
我还不能附加图像,因此我将提供所制作图形的屏幕快照的链接。
这是我的代码:
self.waveFile = wave.open(audio,'rb')
self.format = pyaudio.paInt16
channel = self.waveFile.getnchannels()
self.rate = self.waveFile.getframerate()
self.frame = self.waveFile.getnframes()
self.stream = p.open(format=self.format,
channels=channel,
rate=self.rate,
output=True)
durationF = self.frame / float(self.rate)
self.data_int = self.waveFile.readframes(self.frame)
self.data_plot = np.fromstring(self.data_int, 'Int16')
self.data_plot.shape = -1, 2
self.data_plot = self.data_plot.T
self.time = np.arange(0, self.frame) * (1.0 / self.rate)
w = pg.plot()
w.plot(self.time, self.data_plot[0])
我是否需要调整X和Y范围限制?我应该调整Y峰吗?如您所见,我使用的音频文件中的X(time)匹配持续了8秒。但是Y不是(?)。我不确定如何调整波形数据以使其适合窗口内部。任何回应和建议都会有很大帮助!
答案 0 :(得分:0)
我认为根据您要显示的内容有几种选择。
最简单的解决方案是缩放Y轴。
# See docs for function setYrange
# setYRange(min, max, padding=None, update=True)
w.setRange(YRange=[min,max])
您可以检查文档here。
即使您确实需要这些值的音频数据,也要保持所有音频值与当前相同。通常,至少出于科学目的,音频数据显示为-1和+1之间的浮点数。
否则,您可以使用以下类似方法将从wave模块接收的数据转换为浮点数据(代码为yeeking的道具):
import wave
import struct
import sys
def wav_to_floats(wave_file):
w = wave.open(wave_file)
astr = w.readframes(w.getnframes())
# convert binary chunks to short
a = struct.unpack("%ih" % (w.getnframes()* w.getnchannels()), astr)
a = [float(val) / pow(2, 15) for val in a]
return a
# read the wav file specified as first command line arg
signal = wav_to_floats(sys.argv[1])
print "read "+str(len(signal))+" frames"
print "in the range "+str(min(signal))+" to "+str(min(signal))
在这种情况下,如果可能的话,使用库总是更好的选择,因为目前的wave module不支持许多音频用例(据我所知,仅单声道16位音频)。
注意:如果确实将其转换为-1到+1数据,可能仍然值得像第1部分中所述调整Y限制。只是为了避免在加载不同的.wav文件时出现奇怪的缩放比例。