python pyaudio音频录制的实现
目录
- python pyaudio音频录制
- 安装所需要的包
- 监听麦克风
- 监听系统声音
- 编写代码
- 调用pyaudio库录制以及播放wav音频文件
- Pyaudio简介
- 功能
- Pyaudio安装
- 使用Pyaudio进行录音
- 使用Pyaudio库播放录音
- 总结
python pyaudio音频录制
安装所需要的包
pip install pyaudio
监听麦克风
import pyaudio import wave def luyin(): # 实例化一个对象 pa = pyaudio.PyAudio() # 打开声卡,设置 采样深度为16位、声道数为2、采样率为16、输入、采样点缓存数量为2048 stream = pa.open(format=pyaudio.paInt16, channels=2, rate=16000, input=True, frames_per_buffer=2048) # 新建一个列表,用来存储采样到的数据 record_buf = [] # 然后就通过声卡循环采用,采样到一定数据后即可停止采样 count = 0 while count < 8 * 5: audio_data = stream.read(2048) # 读出声卡缓冲区的音频数据 record_buf.append(audio_data) # 将读出的音频数据追加到record_buf列表 count += 1 print('*') stream.stop_stream() stream.close() pa.terminate() wf = wave.open('02.wav', 'wb') # 创建一个音频文件,名字为“01.wav" wf.setnchannels(2) # 设置声道数为2 wf.setsampwidth(2) # 设置采样深度为 wf.setframerate(16000) # 设置采样率为16000 # 将数据写入创建的音频文件 wf.writeframes("".encode().join(record_buf)) # 写完后将文件关闭 wf.close() if __name__ == '__main__': luyin()
插入麦克风
录制启用麦克风
监听系统声音
要求
- 系统不能静音,需要插入耳机
- 设置录制为立体混声
编写代码
import os import pyaudio import threading import wave import time from datetime import datetime # 需要系统打开立体声混音 # 录音类 class Recorder(): def __init__(self, chunk=1024, channels=2, rate=44100): self.CHUNK = chunk self.FORMAT = pyaudio.paInt16 self.CHANNELS = channels self.RATE = rate self._running = True self._frames = [] # 获取内录设备序号,在Windows操作系统上测试通过,hostAPI = 0 表明是MME设备 def findInternalRecordingDevice(self, p): # 要找查的设备名称中的关键字 target = '立体声混音' # 逐一查找声音设备 for i in range(p.get_device_count()): devInfo = p.get_device_info_by_index(i) # print(devInfo) if devInfo['name'].find(target) >= 0: # and devInfo['hostApi'] == 0: # print('已找到内录设备,序号是 ',i) return i print('无法找到内录设备!') return -1 # 开始录音,开启一个新线程进行录音操作 def start(self): threading._start_new_thread(self.__record, ()) # 执行录音的线程函数 def __record(self): self._running = True self._frames = [] p = pyaudio.PyAudio() # 查找内录设备 dev_idx = self.findInternalRecordingDevice(p) if dev_idx < 0: return # 在打开输入流时指定输入设备 stream = p.open( # input_device_index=dev_idx, format=self.FORMAT, channels=self.CHANNELS, rate=self.RATE, input=True, frames_per_buffer=self.CHUNK) 开发者_JS学习 # 循环读取输入流 while (self._running): data = stream.read(self.CHUNK) self._frames.append(data) # 停止读取输入流 stream.stop_stream() # 关闭输入流 stream.close() # 结束pyaudio p.terminate()编程客栈 return # 停止录音 def stop(self): self._running = False # 保存到文件 def save(self, fileName): # 创建pyAudio对象 p = pyaudio.PyAudio() # 打开用于保存数据的文件 wf = wave.open(fileName, 'wb') # 设置音频参数 wf.setnchannels(self.CHANNELS) wf.setsampwidth(p.get_sample_size(self.FORMAT)) wf.setframerate(self.RATE) # 写入数据 wf.writeframes(b''.join(self._frames)) # 关闭文件 wf.close() # 结束pyaudio p.terminate() if __name__ == "__main__": # 检测当前目录下是否有record子目录 if not os.path.exists('record'): os.makedirs('record') print("\npython 录音机 ....\n") print("提示:按 r 键并回车 开始录音\n") i = input('请输入操作码:') if i == 'r': rec = Recorder() begin = time.time() print("\n开始录音,按 s 键并回车 停止录音,自动保存到 record 子目录\n") rec.start() running = True while running: i = input("请输入操作码:") if i == 's': running = False print("录音已停止") rec.stop() t = time.time() - begin print('录音时间为%ds' % t) # 以当前时间为关键字保存wav文件www.devze.com rec.save("record/rec_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".wav")
调用pyaudio库录制以及播放wav音频文件
Pyaudio简介
PyAudio 是语音处理的 Python 库,提供了比http://www.devze.com较丰富的功能。
功能
python的Pyaud模块可以调用电脑的麦克风或音响进行录音,音频播放,生成wav文件等。
wave是录音是用的标准的WINDOWS文件格式,扩展名为WAV,数据本身的格式为PCM或压缩型,属于无损音乐格式js的一种。
Pyaudio安装
pip install pyaudio
使用Pyaudio进行录音
导入所需库
import wave import pyaudio def audio_record(out_file, rec_time): CHUNK = 1024 FORMAT = pyaudio.paInt16 # 16bit编码格式 CHANNELS = 1 # 单声道 RATjsE = 16000 # 16000采样频率 p = pyaudio.PyAudio() # 创建音频流 stream = p.open(format=FORMAT, # 音频流wav格式 channels=CHANNELS, # 单声道 rate=RATE, # 采样率16000 input=True, frames_per_buffer=CHUNK) print("开始录制。。。") frames = [] # 录制的音频流 # 录制音频数据 for i in range(0, int(RATE / CHUNK * rec_time)): data = stream.read(CHUNK) frames.append(data) # 录制完成 stream.stop_stream() stream.close() p.terminate() print("完成。。。。。")
将它封装成函数,直接去调用,函数的参数分别为文件名称和录制时间。
使用Pyaudio库播放录音
import wave import pyaudio def play(): chunk = 1024 wf = wave.open(r"文件名", 'rb') p = pyaudio.PyAudio() stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) data = wf.readframes(chunk) # 读取数据 print(data) while data != b'': # 播放 stream.write(data) data = wf.readframes(chunk) print('while循环中!') print(data) stream.stop_stream() # 停止数据流 stream.close() p.terminate() # 关闭 PyAudio play()
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
精彩评论