Python如何運(yùn)用pyaudio庫去做一個固定采樣率音頻錄制器
Python用pyaudio庫做固定采樣率音頻錄制器
首先要去下載一個對應(yīng)的pyaudio庫的whl文件,目前最新版本是cp38的那個,如果版本太低是用不了的,下載好后在編譯環(huán)境下的控制臺輸入pip install +whl文件路徑+XXX.whl+回車
# -*- 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#錄音時長為10s
p=pyaudio.PyAudio()#實例化一個對象
#打開聲卡
stream=p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
#創(chuàng)建列表用來儲存采樣的音頻數(shù)據(jù)
record_buf=[]
print("***開始錄音:請在10s內(nèi)輸入語音***")
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()#寫完后關(guān)閉聲卡
stream.stop_stream()#停止聲卡
stream.close()#關(guān)閉聲卡
p.terminate()#終止pyaudio先前我出現(xiàn)了一個錯誤:一直提示sample width not specified(采樣深度沒有被指定)

在我無數(shù)次檢查后發(fā)現(xiàn)出錯的地方是程序中sample少打了個字母'e'
最后在相應(yīng)的文件夾下會出現(xiàn)wav文件
Python音頻操作工具pyaudio上手
當(dāng)需要使用Python處理音頻數(shù)據(jù)時,使用Python讀取與播放聲音必不可少,下面介紹一個好用的處理音頻PyAudio工具包。
PyAudio是Python開源工具包,由名思義,是提供對語音操作的工具包。提供錄音播放處理等功能,可以視作語音領(lǐng)域的OpenCV。
來看示例
1、采集音頻
下面以一段代碼演示如何從計算機(jī)麥克風(fēng)采集一段音頻,采集音頻時長 4s,保存文件 output.wav。
使用了tqdm模塊,可以方便顯示出來讀取過程:
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#每次讀多少個數(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))#其實就是2,表示兩個字節(jié)
wf.setframerate(RATE)
print("* recording")
## RATE / CHUNK * record_second意思是:
## 采樣率是RATE,每秒采集RATE個數(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、播放音頻
下面使用播放的功能來播放1中保存的音頻 output.wav,通過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é)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch中with?torch.no_grad():的用法實例
最近在看別人寫的代碼,遇到經(jīng)常使用with torch.no_grad(),所以下面這篇文章主要給大家介紹了關(guān)于pytorch中with?torch.no_grad():用法的相關(guān)資料,需要的朋友可以參考下2022-03-03
Python計算三角函數(shù)之a(chǎn)sin()方法的使用
這篇文章主要介紹了Python計算三角函數(shù)之a(chǎn)sin()方法的使用,是Python入門的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05
使用python-Jenkins批量創(chuàng)建及修改jobs操作
這篇文章主要介紹了使用python-Jenkins批量創(chuàng)建及修改jobs操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python使用Qt5實現(xiàn)水平導(dǎo)航欄的示例代碼
本文主要介紹了Python使用Qt5實現(xiàn)水平導(dǎo)航欄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

