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