zoukankan      html  css  js  c++  java
  • matplotlib绘制wav文件的波形图


    • date: 2022/1/6
    • author: longRookie
    • title: matplotlib绘制wav文件的波形图

    一、matplotlib绘制wav文件的波形图

    目的:在于理解wav文件的存储格式,并且提取不同声道的语音帧数据;

    关于wav文件的格式:https://codeantenna.com/a/3Mdc0fRshG

    matplotlib可以再美化一下。

    import wave
    import pyaudio
    import pylab
    import numpy as np
    import matplotlib.pyplot as plt
    
    wav_file = 'output1.wav'
    
    wf = wave.open(wav_file, 'rb')
    # 获取参数
    params = wf.getparams()
    # 声道数,采样宽度,帧率,帧数
    nchannels, sampwidth, framerate, nframes = params[:4]
    
    print("声道数:{},采样位数:{},帧率:{},帧数:{}".format(nchannels, sampwidth, framerate, nframes))
    
    # 将所有帧的数据读取到str_data,字符串格式,bytes
    str_data = wf.readframes(nframes)
    # frombuffer会返回一个只读的数组,fromstring会返回一个新的数组,不推荐使用fromstring二进制模式
    wave_data = np.frombuffer(str_data, dtype=np.int16)  # 先默认使用16位的采样位数
    # wave幅值归一化
    wave_data = wave_data * 1.0 / (max(abs(wave_data)))
    # wav文件的存储格式:当处理这种多通道声音时,来自每个通道的单个采样点被交错。先存储左声道的第一个样本。然后,您将存储右声道的第一个样本,依此类推。
    # https://codeantenna.com/a/3Mdc0fRshG
    wave_data = np.reshape(wave_data,[nframes,nchannels]).T
    wf.close()
    
    # 绘制波形图
    y = wave_data[0]
    x = np.arange(nframes)/framerate
    #x = np.linspace(0,1,nframes)
    plt.plot(x,y)
    plt.show()
    
  • 相关阅读:
    警惕:利用Dropbox链接散播的恶意软件
    repo的小结
    【网络协议】TCP的拥塞控制机制
    具体总结 Hive VS 传统关系型数据库
    站点防止攻击
    Java凝视Override、Deprecated、SuppressWarnings具体解释
    括号配对问题
    java的System.getProperty()方法能够获取的值
    HTTP协议是无状态协议,怎么理解?
    C++
  • 原文地址:https://www.cnblogs.com/AccompanyingLight/p/15772682.html
Copyright © 2011-2022 走看看