前言
Python提供了一些库可以用于录音和播放音频文件。常见的库有pyaudio和wave,这些库允许用户录制麦克风输入并将其保存为WAV文件格式,然后再进行回放。以下是关于如何使用这些库录音和播放的简单介绍。为了录制音频,我们通常使用pyaudio库,它提供了对音频流的处理功能。我们可以设置音频格式、通道数、采样率、缓冲区大小等参数,并启动音频流进行录制。录制的数据可以保存到wave文件中,供后续播放。
一、使用Python进行录音文件
废话少说直接放代码
def record_auto(MIC_INDEX=1):
logger.info('准备录音..........')
CHUNK = 1024 # 采样宽度
RATE = 16000 # 采样率
QUIET_DB = 2000 # 分贝阈值,大于则开始录音,否则结束
delay_time = 1 # 声音降至分贝阈值后,经过多长时间,自动终止录音
FORMAT = pyaudio.paInt16
CHANNELS = 1
# 初始化录音
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK,
input_device_index=MIC_INDEX
)
frames = [] # 所有音频帧
flag = False # 是否已经开始录音
quiet_flag = False # 当前音量小于阈值
temp_time = 0 # 当前时间是第几帧
last_ok_time = 0 # 最后正常是第几帧
START_TIME = 0 # 开始录音是第几帧
logger.info('开始录音..........')
while True:
# 获取当前chunk的声音
data = stream.read(CHUNK, exception_on_overflow=False)
frames.append(data)
# 获取当前chunk的音量分贝值
temp_volume = np.max(np.frombuffer(data, dtype=np.short))
if temp_volume > QUIET_DB and flag == False:
logger.info("音量高于阈值,开始录音")
flag = True
START_TIME = temp_time
last_ok_time = temp_time
if flag: # 录音中的各种情况
if (temp_volume < QUIET_DB and quiet_flag == False):
logger.info("录音中,当前音量低于阈值")
quiet_flag = True
last_ok_time = temp_time
if (temp_volume > QUIET_DB):
# print('录音中,当前音量高于阈值,正常录音')
quiet_flag = False
last_ok_time = temp_time
if (temp_time > last_ok_time + delay_time * 15 and quiet_flag == True):
logger.info("音量低于阈值{:.2f}秒后,检测当前音量".format(delay_time))
if (quiet_flag and temp_volume < QUIET_DB):
logger.info("当前音量仍然小于阈值,录音结束")
END_TIME = temp_time
break
else:
logger.info("当前音量重新高于阈值,继续录音中")
quiet_flag = False
last_ok_time = temp_time
# print('当前帧 {} 音量 {}'.format(temp_time+1, temp_volume))
temp_time += 1
if temp_time > 150: # 超时直接退出
END_TIME = temp_time
logger.info('超时,录音结束')
break
# 停止录音
stream.stop_stream()
stream.close()
p.terminate()
# 导出wav音频文件
wf = wave.open(output_path, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames[START_TIME - 2:END_TIME]))
wf.close()
logger.info('保存录音文件:{}', output_path)
二、Windows播放音频
def play_wav(wav_file=r'E:\\Project\\python\\VLA_NeoArm\\resource\\tts.wav'):
'''
播放wav音频文件
'''
# 播放 WAV 文件并等待播放完成
audio = AudioSegment.from_wav(wav_file)
# 播放音频
play(audio)
三、Linux播放音频
import os
def play_audio_with_system(file_path):
# 使用 aplay 播放 WAV 文件
os.system(f"aplay {file_path}")
# 如果是 MP3 文件,可以使用 mpg123
# os.system(f"mpg123 {file_path}")
# 使用示例
play_audio_with_system("output.wav")
总结
- Python录音代码:通过pyaudio进行录音,设置采样率为16000Hz,单声道。根据分贝阈值自动启动和停止录音,超时则直接结束录音,并保存为WAV文件。
- Windows播放音频:使用pydub库中的AudioSegment加载WAV文件,并通过play函数进行播放。
- Linux播放音频:通过系统命令aplay播放WAV文件,或使用mpg123播放MP3文件。