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)

  

posted @ 2023-04-16 19:58  张喆坤  阅读(458)  评论(0编辑  收藏  举报