Python如何運(yùn)用pyaudio庫(kù)去做一個(gè)固定采樣率音頻錄制器
Python用pyaudio庫(kù)做固定采樣率音頻錄制器
首先要去下載一個(gè)對(duì)應(yīng)的pyaudio庫(kù)的whl文件,目前最新版本是cp38的那個(gè),如果版本太低是用不了的,下載好后在編譯環(huán)境下的控制臺(tái)輸入pip install +whl文件路徑+XXX.whl+回車(chē)
# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import pyaudio import wave CHUNK=256#設(shè)置底緩存塊的大小為256 FORMAT=pyaudio.paInt16#設(shè)置采樣深度為16位 CHANNELS=2#設(shè)置聲道數(shù)為2 RATE=16000#設(shè)置采樣率16 RECORD_SECONDS=10#錄音時(shí)長(zhǎng)為10s p=pyaudio.PyAudio()#實(shí)例化一個(gè)對(duì)象 #打開(kāi)聲卡 stream=p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) #創(chuàng)建列表用來(lái)儲(chǔ)存采樣的音頻數(shù)據(jù) record_buf=[] print("***開(kāi)始錄音:請(qǐng)?jiān)?0s內(nèi)輸入語(yǔ)音***") for i in range(0,int(RATE/CHUNK*RECORD_SECONDS)): data=stream.read(CHUNK) record_buf.append(data) print("***錄音結(jié)束***") wf=wave.open('audiol.wav','wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(record_buf)) wf.close()#寫(xiě)完后關(guān)閉聲卡 stream.stop_stream()#停止聲卡 stream.close()#關(guān)閉聲卡 p.terminate()#終止pyaudio
先前我出現(xiàn)了一個(gè)錯(cuò)誤:一直提示sample width not specified(采樣深度沒(méi)有被指定)
在我無(wú)數(shù)次檢查后發(fā)現(xiàn)出錯(cuò)的地方是程序中sample少打了個(gè)字母'e'
最后在相應(yīng)的文件夾下會(huì)出現(xiàn)wav文件
Python音頻操作工具pyaudio上手
當(dāng)需要使用Python處理音頻數(shù)據(jù)時(shí),使用Python讀取與播放聲音必不可少,下面介紹一個(gè)好用的處理音頻PyAudio
工具包。
PyAudio
是Python開(kāi)源工具包,由名思義,是提供對(duì)語(yǔ)音操作的工具包。提供錄音播放處理等功能,可以視作語(yǔ)音領(lǐng)域的OpenCV
。
來(lái)看示例
1、采集音頻
下面以一段代碼演示如何從計(jì)算機(jī)麥克風(fēng)采集一段音頻,采集音頻時(shí)長(zhǎng) 4s,保存文件 output.wav
。
使用了tqdm
模塊,可以方便顯示出來(lái)讀取過(guò)程:
import pyaudio import wave from tqdm import tqdm def record_audio(wave_out_path,record_second): FORMAT = pyaudio.paInt16#音頻數(shù)據(jù)格式 CHANNELS = 2#聲道數(shù) RATE = 44100#采樣率 CHUNK = 1024#每次讀多少個(gè)數(shù)據(jù) p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) wf = wave.open(wave_out_path, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT))#其實(shí)就是2,表示兩個(gè)字節(jié) wf.setframerate(RATE) print("* recording") ## RATE / CHUNK * record_second意思是: ## 采樣率是RATE,每秒采集RATE個(gè)數(shù)據(jù),所以每秒的音頻需要讀取RATE / CHUNK次 for i in tqdm(range(0, int(RATE / CHUNK * record_second))): data = stream.read(CHUNK) wf.writeframes(data) print("* done recording") stream.stop_stream() stream.close() p.terminate() wf.close() record_audio("output.wav",record_second=4)
2、播放音頻
下面使用播放的功能來(lái)播放1中保存的音頻 output.wav
,通過(guò)tqdm
,顯示播放進(jìn)度條:
"""PyAudio Example: Play a WAVE file.""" import pyaudio import wave from tqdm import tqdm def play_audio(wave_path): CHUNK = 1024 wf = wave.open(wave_path, 'rb') # instantiate PyAudio (1) p = pyaudio.PyAudio() # open stream (2) stream = p.open(format=p.get_format_from_width(wf.getsampwidth()), channels=wf.getnchannels(), rate=wf.getframerate(), output=True) # read data data = wf.readframes(CHUNK) # play stream (3) datas = [] while len(data) > 0: data = wf.readframes(CHUNK) datas.append(data) for d in tqdm(datas): stream.write(d) # stop stream (4) stream.stop_stream() stream.close() # close PyAudio (5) p.terminate() play_audio("output.wav")
wave_read相關(guān)方法
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch中with?torch.no_grad():的用法實(shí)例
最近在看別人寫(xiě)的代碼,遇到經(jīng)常使用with torch.no_grad(),所以下面這篇文章主要給大家介紹了關(guān)于pytorch中with?torch.no_grad():用法的相關(guān)資料,需要的朋友可以參考下2022-03-03Python計(jì)算三角函數(shù)之a(chǎn)sin()方法的使用
這篇文章主要介紹了Python計(jì)算三角函數(shù)之a(chǎn)sin()方法的使用,是Python入門(mén)的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python讀取圖片為16進(jìn)制表示簡(jiǎn)單代碼
這篇文章主要介紹了Python讀取圖片為16進(jìn)制表示簡(jiǎn)單代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01使用python-Jenkins批量創(chuàng)建及修改jobs操作
這篇文章主要介紹了使用python-Jenkins批量創(chuàng)建及修改jobs操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05淺談Python任務(wù)自動(dòng)化工具Tox基本用法
這篇文章主要介紹了淺談Python任務(wù)自動(dòng)化工具Tox,tox 是一個(gè)管理測(cè)試虛擬環(huán)境的命令行工具, 它已存在多年且廣被開(kāi)發(fā)者們使用,對(duì)Python任務(wù)自動(dòng)化工具Tox基本用法感興趣的朋友一起看看吧2022-06-06Python使用Qt5實(shí)現(xiàn)水平導(dǎo)航欄的示例代碼
本文主要介紹了Python使用Qt5實(shí)現(xiàn)水平導(dǎo)航欄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python提取PDF中的圖片的實(shí)現(xiàn)示例
本文主要介紹了Python提取PDF中的圖片的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07python中open函數(shù)對(duì)文件處理的使用教程
open()函數(shù)的作用是打開(kāi)一個(gè)文件,并返回一個(gè)file對(duì)象(即文件對(duì)象),下面這篇文章主要給大家介紹了關(guān)于python中open函數(shù)對(duì)文件處理的相關(guān)資料,需要的朋友可以參考下2022-06-06