python 音频处理
1.音频波形图可视化
这段代码使用PyAudio库获取从麦克风输入的音频流,并将其用matplotlib库绘制成波形图。首先设置音频流的格式和属性,然后创建一个matplotlib子图并绘制两条灰色的线。接着进入一个循环,不断从音频流中读取数据,
import pyaudio import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt DATANUM=1024 #one time processing FORMAT=pyaudio.paInt16 #8bit -2^7 +2^7 有正有负号 CHANNEL=1 #通道数 SIMPLERATE=44100 #一帧音频数据是指在时间轴上固定时间内(通常是1/44100秒,也就是44100Hz采样率的情况下,一帧为1/44100秒) p=pyaudio.PyAudio()#实例化一个pyaudio 对象 stream=p.open(format=FORMAT,channels=CHANNEL,rate=SIMPLERATE, input=True,frames_per_buffer=DATANUM) while True: data=stream.read(DATANUM,exception_on_overflow=False) #一次性从流中读取datanum数据 data=np.frombuffer(data,dtype=np.int16) print(data)
打印,可以看到已经可以从mic中获取数据了
接下来需要将这些数据通过 matplotlib,设置好画布宽高,由于第一张图没有数据,通过 下面两行绘制了一个水平线
x_postion=np.arange(0,DATANUM) y_postion=np.zeros(DATANUM)
#将每个采样点连线,同时用matplotlib 画图 fig,ax=plt.subplots(figsize=(6,3))#设置子图宽高 #plt.subplots() 函数返回一个元组,包含两个元素: fig: matplotlib.figure.Figure 对象,代表整个图形。 ax: matplotlib.axes.Axes 对象或者是 Axes 对象数组,代表一个或多个子图。 #将一个data数据 绘制图形 x_postion=np.arange(0,DATANUM) y_postion=np.zeros(DATANUM) #todo line ,省略其他返回值 line,=ax.plot(x_postion,y_postion,color="red") ax.set_xlim(0,DATANUM-1) ax.set_ylim(-22768,22768) plt.ion() #交互模式 持续更新line plt.show()
接下来就是通过while 循环持续从mic中绘制data数据了
有点奇怪 不知都是不是声卡驱动问题(折腾了一晚上有点想放弃了。。。)
。。。
第二天求助chatgpt说是我的采样率和通道不匹配
于是马上打开麦克风设置,果然采样率之前选择的48000,但是通道没办法了,只有2通道可以选。只有修改代码了
修改 stream=p.open(format=FORMAT,channels=CHANNEL,rate=SIMPLERATE,input=True,frames_per_buffer=DATANUM)
将这个通道设置和电脑设置保持一致就ok了。
FORMAT=pyaudio.paInt16
CHANNEL=1 #通道数
SIMPLERATE=44100 #CD quality
成功显示!!!
import pyaudio import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt DATANUM=1024 #one time processing FORMAT=pyaudio.paInt16 #8bit -2^7 +2^7 有正有负号 CHANNEL=1 #通道数 SIMPLERATE=44100 #CD quality p=pyaudio.PyAudio()#实例化一个pyaudio 对象 stream=p.open(format=FORMAT,channels=CHANNEL,rate=SIMPLERATE, input=True,frames_per_buffer=DATANUM) #打开一个流设置好音频属性 input=true 默认mic 输入 #将每个采样点连线,同时用matplotlib 画图 fig,ax=plt.subplots(figsize=(6,3))#设置子图宽高 #plt.subplots() 函数返回一个元组,包含两个元素: fig: matplotlib.figure.Figure 对象,代表整个图形。 ax: matplotlib.axes.Axes 对象或者是 Axes 对象数组,代表一个或多个子图。 #将一个data数据 绘制图形 x_postion=np.arange(0,DATANUM) #todo line ,省略其他返回值 line,=ax.plot(x_postion,np.random.rand(DATANUM),color="red") ax.set_xlim(0,DATANUM-1) # ax.set_ylim(-128,127) # ax.set_ylim(-200,200) ax.set_ylim(-22768,22768) plt.ion() #交互模式 持续更新line plt.show() while True: data=stream.read(DATANUM,exception_on_overflow=False) #一次性从流中读取datanum数据 data1=np.frombuffer(data,dtype=np.int16) # data2=np.frombuffer(data,dtype=np.int16) #将读取的二进制数据转换成整型 #将data赋值给y line.set_ydata(data1) # line2.set_ydata(data2) #更新画布 fig.canvas.draw() fig.canvas.flush_events() plt.pause(0.01)