原本想用MATLAB实时录音与波形显示,结果不理想,改用python。matlab可以直接调用python,这里不再多说。对于读取音频文件并实时显示波形,原理很简单,就是不断显示一小段时间切片,人眼无法分辨,便达到了实时的目的。
音频波形动态显示,实时显示波形,实时进行离散傅里叶变换分析频域
static: 是否为静态模式
path: wav 文件路径
class SubplotAnimation(animation.TimedAnimation):
def __init__(self, static=True, path=None)
path=r'文件路径\music3.wav'
self.static = static
if static and os.path.isfile(path):
self.stream = wave.open(path)
self.rate = self.stream.getparams()[2]
self.chunk = self.rate/2
self.read = self.stream.readframes
else:
self.rate = 2 ** 16
self.chunk = 2 ** 12
p = pyaudio.PyAudio()
self.stream = p.open(format=pyaudio.paInt16, channels=1, rate=self.rate,
input=True, frames_per_buffer=self.chunk)
self.read = self.stream.read
开启动画刷新
# 更新间隔/ms
interval = int(1000*self.chunk/self.rate)
animation.TimedAnimation.__init__(self, fig, interval=interval, blit=True)
读取文件波形,引用原博主的代码运行时,发现读文件时不成功,后来发现是x和y个数不一致,于是用y的个数为x个数赋值解决问题。
def _draw_frame(self, framedata):
i = framedata
if self.static:
# 读取静态wav文件波形
y = np.fromstring(self.read(int(int(self.chunk)/2)+1), dtype=np.int16)[:-1]
else:
# 实时读取声频
y = np.fromstring(self.read(self.chunk), dtype=np.int16)
x = np.linspace(0, int(self.chunk) - 1, y.shape[0])
# 画波形图
self.line1.set_data(x, y)
代码链接:https://download.csdn.net/download/qq_45094932/12148513
上述是用动画的方法来实现实时显示,下面展示的是用刷新绘图框的方法来达到实时目的。MATLAB也可仿照此程序实现。
音频切片,获取部分音频 单位是毫秒级别
main_wav_path: 原音频文件路径
start_time: 截取的开始时间
end_time: 截取的结束时间
part_wav_path: 截取后的音频路径
def get_ms_part_wav(main_wav_path, start_time, end_time, part_wav_path):
start_time = int(start_time)
end_time = int(end_time)
sound = AudioSegment.from_mp3(main_wav_path)
word = sound[start_time:end_time]
word.export(part_wav_path, format="wav")
改变切片位置,并且清除绘图区并绘制新图,之前plt.clf一直不成功,原因是未打开交互模式。这种时间切片的思路可以用matlab实现,要恰当选取切片长度,来混淆视听。
plt.ion()
while i>0:
plt.clf()
start_time =start_time +100
end_time = end_time+100
if end_time>time1:
start_time =0
end_time =100
get_ms_part_wav(main_wav_path, start_time, end_time, wave_path)
file = wave.open(wave_path)
a = file.getparams().nframes # 帧总数
f = file.getparams().framerate # 采样频率
sample_time = 1 / f # 采样点的时间间隔
time = a / f # 声音信号的长度
sample_frequency, audio_sequence = wavfile.read(wave_path)
# print(audio_sequence) # 声音信号每一帧的“大小”
x_seq = np.arange(0, time, sample_time)
plt.plot(x_seq,audio_sequence, 'blue')
plt.xlabel("time")
plt.xticks([]) #去掉x轴
plt.pause(0.1)
plt.ioff() # 关闭画图的窗口,即关闭交互模式
plt.show()
代码链接:https://download.csdn.net/download/qq_45094932/12148543
转载: https://github.com/lightjiang/AudioProcess