Python语音信号录制与波形图绘制
from scipy.io import wavfile
import matplotlib.pyplot as plt
import numpy as np
import pyaudio
import wave
# 设置中文字体显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 录制语音信号参数设置
CHUNK = 1024 # 缓冲区大小
FORMAT = pyaudio.paInt16 # 采样位数
CHANNELS = 1 # 声道数
RATE = 16000 # 采样率
RECORD_SECONDS = 3 # 录制时长
WAVE_OUTPUT_FILENAME = 'C2_1_y_1.wav' # 保存的WAV文件名
p = pyaudio.PyAudio() # 创建PyAudio对象
# 打开音频流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
print('* 录音开始')
frames = [] # 存储录音数据的列表
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK, exception_on_overflow=False)
frames.append(data)
print('* 录音结束')
# 停止和关闭音频流
stream.stop_stream()
stream.close()
p.terminate()
# 保存录音数据为WAV文件
with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
# 读取WAV文件并显示波形图
sample_rate, data = wavfile.read(WAVE_OUTPUT_FILENAME)
duration = data.shape[0] / sample_rate
time = np.linspace(0., duration, data.shape[0]) # 时间轴
normalized_data = data / np.max(np.abs(data)) # 归一化幅度
plt.plot(time, normalized_data) # 绘制波形图
plt.xlabel('时间 (秒)')
plt.ylabel('归一化幅度')
plt.title('录音信号波形图')
plt.show()
这段代码演示了如何使用Python录制语音信号,并将其保存为.wav文件,最后读取该文件并绘制信号的波形图。
代码解析:
-
导入库: 首先导入必要的库,包括
scipy.io.wavfile用于处理.wav文件,matplotlib.pyplot用于绘图,numpy用于数值计算,pyaudio用于录音。 -
设置参数: 设置录音相关的参数,如采样率、声道数、录制时长等。
-
录音: 使用
pyaudio库创建音频流,并循环读取音频数据存储到frames列表中。 -
保存WAV文件: 使用
wave库将录音数据写入.wav文件。 -
读取WAV文件并绘制波形图: 使用
wavfile.read函数读取.wav文件数据,计算信号时长,创建时间轴,对信号进行归一化处理,最后使用matplotlib.pyplot绘制波形图。
这段代码可以帮助你快速入门语音信号处理,并学习如何使用Python进行简单的录音和波形图绘制。
原文地址: https://www.cveoy.top/t/topic/nAK 著作权归作者所有。请勿转载和采集!