python?pyaudio音頻錄制的實(shí)現(xiàn)
python pyaudio音頻錄制
安裝所需要的包
pip install pyaudio
監(jiān)聽(tīng)麥克風(fēng)
import pyaudio import wave def luyin(): # 實(shí)例化一個(gè)對(duì)象 pa = pyaudio.PyAudio() # 打開(kāi)聲卡,設(shè)置 采樣深度為16位、聲道數(shù)為2、采樣率為16、輸入、采樣點(diǎn)緩存數(shù)量為2048 stream = pa.open(format=pyaudio.paInt16, channels=2, rate=16000, input=True, frames_per_buffer=2048) # 新建一個(gè)列表,用來(lái)存儲(chǔ)采樣到的數(shù)據(jù) record_buf = [] # 然后就通過(guò)聲卡循環(huán)采用,采樣到一定數(shù)據(jù)后即可停止采樣 count = 0 while count < 8 * 5: audio_data = stream.read(2048) # 讀出聲卡緩沖區(qū)的音頻數(shù)據(jù) record_buf.append(audio_data) # 將讀出的音頻數(shù)據(jù)追加到record_buf列表 count += 1 print('*') stream.stop_stream() stream.close() pa.terminate() wf = wave.open('02.wav', 'wb') # 創(chuàng)建一個(gè)音頻文件,名字為“01.wav" wf.setnchannels(2) # 設(shè)置聲道數(shù)為2 wf.setsampwidth(2) # 設(shè)置采樣深度為 wf.setframerate(16000) # 設(shè)置采樣率為16000 # 將數(shù)據(jù)寫(xiě)入創(chuàng)建的音頻文件 wf.writeframes("".encode().join(record_buf)) # 寫(xiě)完后將文件關(guān)閉 wf.close() if __name__ == '__main__': luyin()
插入麥克風(fēng)
錄制啟用麥克風(fēng)
監(jiān)聽(tīng)系統(tǒng)聲音
要求
- 系統(tǒng)不能靜音,需要插入耳機(jī)
- 設(shè)置錄制為立體混聲
編寫(xiě)代碼
import os import pyaudio import threading import wave import time from datetime import datetime # 需要系統(tǒng)打開(kāi)立體聲混音 # 錄音類(lèi) 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 = [] # 獲取內(nèi)錄設(shè)備序號(hào),在windows操作系統(tǒng)上測(cè)試通過(guò),hostAPI = 0 表明是MME設(shè)備 def findInternalRecordingDevice(self, p): # 要找查的設(shè)備名稱(chēng)中的關(guān)鍵字 target = '立體聲混音' # 逐一查找聲音設(shè)備 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('已找到內(nèi)錄設(shè)備,序號(hào)是 ',i) return i print('無(wú)法找到內(nèi)錄設(shè)備!') return -1 # 開(kāi)始錄音,開(kāi)啟一個(gè)新線(xiàn)程進(jìn)行錄音操作 def start(self): threading._start_new_thread(self.__record, ()) # 執(zhí)行錄音的線(xiàn)程函數(shù) def __record(self): self._running = True self._frames = [] p = pyaudio.PyAudio() # 查找內(nèi)錄設(shè)備 dev_idx = self.findInternalRecordingDevice(p) if dev_idx < 0: return # 在打開(kāi)輸入流時(shí)指定輸入設(shè)備 stream = p.open( # input_device_index=dev_idx, format=self.FORMAT, channels=self.CHANNELS, rate=self.RATE, input=True, frames_per_buffer=self.CHUNK) # 循環(huán)讀取輸入流 while (self._running): data = stream.read(self.CHUNK) self._frames.append(data) # 停止讀取輸入流 stream.stop_stream() # 關(guān)閉輸入流 stream.close() # 結(jié)束pyaudio p.terminate() return # 停止錄音 def stop(self): self._running = False # 保存到文件 def save(self, fileName): # 創(chuàng)建pyAudio對(duì)象 p = pyaudio.PyAudio() # 打開(kāi)用于保存數(shù)據(jù)的文件 wf = wave.open(fileName, 'wb') # 設(shè)置音頻參數(shù) wf.setnchannels(self.CHANNELS) wf.setsampwidth(p.get_sample_size(self.FORMAT)) wf.setframerate(self.RATE) # 寫(xiě)入數(shù)據(jù) wf.writeframes(b''.join(self._frames)) # 關(guān)閉文件 wf.close() # 結(jié)束pyaudio p.terminate() if __name__ == "__main__": # 檢測(cè)當(dāng)前目錄下是否有record子目錄 if not os.path.exists('record'): os.makedirs('record') print("\npython 錄音機(jī) ....\n") print("提示:按 r 鍵并回車(chē) 開(kāi)始錄音\n") i = input('請(qǐng)輸入操作碼:') if i == 'r': rec = Recorder() begin = time.time() print("\n開(kāi)始錄音,按 s 鍵并回車(chē) 停止錄音,自動(dòng)保存到 record 子目錄\n") rec.start() running = True while running: i = input("請(qǐng)輸入操作碼:") if i == 's': running = False print("錄音已停止") rec.stop() t = time.time() - begin print('錄音時(shí)間為%ds' % t) # 以當(dāng)前時(shí)間為關(guān)鍵字保存wav文件 rec.save("record/rec_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".wav")
調(diào)用pyaudio庫(kù)錄制以及播放wav音頻文件
Pyaudio簡(jiǎn)介
PyAudio 是語(yǔ)音處理的 Python 庫(kù),提供了比較豐富的功能。
功能
python的Pyaud模塊可以調(diào)用電腦的麥克風(fēng)或音響進(jìn)行錄音,音頻播放,生成wav文件等。
wave是錄音是用的標(biāo)準(zhǔn)的WINDOWS文件格式,擴(kuò)展名為WAV,數(shù)據(jù)本身的格式為PCM或壓縮型,屬于無(wú)損音樂(lè)格式的一種。
Pyaudio安裝
pip install pyaudio
使用Pyaudio進(jìn)行錄音
導(dǎo)入所需庫(kù)
import wave import pyaudio def audio_record(out_file, rec_time): ? ? CHUNK = 1024 ? ? FORMAT = pyaudio.paInt16 ?# 16bit編碼格式 ? ? CHANNELS = 1 ?# 單聲道 ? ? RATE = 16000 ?# 16000采樣頻率 ? ? ? p = pyaudio.PyAudio() ? ? # 創(chuàng)建音頻流 ? ? stream = p.open(format=FORMAT, ?# 音頻流wav格式 ? ? ? ? ? ? ? ? ? ? channels=CHANNELS, ?# 單聲道 ? ? ? ? ? ? ? ? ? ? rate=RATE, ?# 采樣率16000 ? ? ? ? ? ? ? ? ? ? input=True, ? ? ? ? ? ? ? ? ? ? frames_per_buffer=CHUNK) ? ? ? print("開(kāi)始錄制。。。") ? ? ? frames = [] ?# 錄制的音頻流 ? ? # 錄制音頻數(shù)據(jù) ? ? 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("完成。。。。。")
將它封裝成函數(shù),直接去調(diào)用,函數(shù)的參數(shù)分別為文件名稱(chēng)和錄制時(shí)間。
使用Pyaudio庫(kù)播放錄音
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) ?# 讀取數(shù)據(jù) ? ? print(data) ? ? while data != b'': ?# 播放 ? ? ? ? stream.write(data) ? ? ? ? data = wf.readframes(chunk) ? ? ? ? print('while循環(huán)中!') ? ? ? ? print(data) ? ? stream.stop_stream() ?# 停止數(shù)據(jù)流 ? ? stream.close() ? ? p.terminate() ?# 關(guān)閉 PyAudio play()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python如何生成隨機(jī)n位數(shù)字與字母組合(創(chuàng)建隨機(jī))
這篇文章主要介紹了python如何生成隨機(jī)n位數(shù)字與字母組合(創(chuàng)建隨機(jī)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python Flask框架開(kāi)發(fā)之運(yùn)用SocketIO實(shí)現(xiàn)WebSSH方法詳解
Socket.IO本是一個(gè)面向?qū)崟r(shí)web應(yīng)用的JavaScript庫(kù),現(xiàn)在已成為擁有眾多語(yǔ)言支持的Web即時(shí)通訊應(yīng)用的框架。這篇文章主要介紹了Python 運(yùn)用SocketIO實(shí)現(xiàn)WebSSH方法2022-10-10解決使用export_graphviz可視化樹(shù)報(bào)錯(cuò)的問(wèn)題
今天小編就為大家分享一篇解決使用export_graphviz可視化樹(shù)報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08自動(dòng)轉(zhuǎn)換Python代碼為HTML界面的GUI庫(kù)remi使用探究
這篇文章主要為大家介紹了自動(dòng)轉(zhuǎn)換Python代碼為HTML界面的GUI庫(kù)remi使用探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼
這篇文章主要介紹了Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05python兒童學(xué)游戲編程知識(shí)點(diǎn)總結(jié)
在本文里小編給大家整理了關(guān)于python兒童學(xué)游戲編程知識(shí)點(diǎn)以及內(nèi)容總結(jié),需要的朋友們參考學(xué)習(xí)下。2019-06-06