音频读取与实时绘制波形

原本想用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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值