用python写一边录音一边显示MFCC图的多线程程序
时间: 2023-11-12 09:04:31 浏览: 72
以下是一个用Python编写的多线程程序,可以实现一边录音一边显示MFCC图像。
```python
import pyaudio
import numpy as np
import threading
import queue
import librosa.display
import matplotlib.pyplot as plt
# 参数设置
CHUNK_SIZE = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
N_MFCC = 13
N_FFT = 2048
HOP_LENGTH = 512
DURATION = 5
# 创建队列和事件
q = queue.Queue()
e = threading.Event()
# 创建PyAudio对象
p = pyaudio.PyAudio()
# 创建MFCC绘图函数
def plot_mfcc():
global q, e
fig, ax = plt.subplots()
while not e.is_set():
# 从队列中获取MFCC数据
mfcc = q.get()
# 绘制MFCC图像
librosa.display.specshow(mfcc, x_axis='time', ax=ax)
ax.set(title='MFCC')
plt.pause(0.01)
ax.cla()
# 创建麦克风录音函数
def record():
global q, e
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK_SIZE)
mfcc = np.zeros((N_MFCC, 1))
while not e.is_set():
# 从麦克风中读取音频数据
data = stream.read(CHUNK_SIZE)
# 转换为numpy数组
samples = np.frombuffer(data, dtype=np.int16)
# 计算MFCC
mfcc_new = librosa.feature.mfcc(samples, sr=RATE, n_fft=N_FFT, hop_length=HOP_LENGTH, n_mfcc=N_MFCC)
# 将新的MFCC数据添加到队列中
q.put(mfcc_new)
# 更新MFCC数据
mfcc = np.hstack((mfcc, mfcc_new[:, -1].reshape(-1, 1)))
# 判断是否录制到指定时长
if mfcc.shape[1] > DURATION * RATE / HOP_LENGTH:
break
# 停止音频流
stream.stop_stream()
stream.close()
# 关闭PyAudio对象
p.terminate()
# 设置事件
e.set()
# 创建线程
t1 = threading.Thread(target=plot_mfcc)
t2 = threading.Thread(target=record)
# 启动线程
t1.start()
t2.start()
# 等待线程结束
t1.join()
t2.join()
```
该程序分为两个线程:一个线程用于录音,另一个线程用于绘制MFCC图像。录音线程从麦克风中读取音频数据,并计算MFCC特征,然后将新的MFCC特征添加到队列中。绘图线程从队列中获取MFCC特征,并绘制MFCC图像。
程序中还使用了一个事件对象,用于控制线程的启停。当录音线程录制到指定时长后,设置事件对象,停止线程的执行。
注意,程序中的绘图函数使用了Matplotlib库,需要将其安装到Python环境中。可以使用以下命令安装Matplotlib:
```
pip install matplotlib
```
除此之外,还需要安装Librosa库,用于计算音频MFCC特征。可以使用以下命令安装Librosa:
```
pip install librosa
```
阅读全文