python?pyaudio音頻錄制的實(shí)現(xiàn)
python pyaudio音頻錄制
安裝所需要的包
pip install pyaudio
監(jiān)聽麥克風(fēng)
import pyaudio
import wave
def luyin():
# 實(shí)例化一個(gè)對(duì)象
pa = pyaudio.PyAudio()
# 打開聲卡,設(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è)列表,用來存儲(chǔ)采樣到的數(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)建一個(gè)音頻文件,名字為“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)不能靜音,需要插入耳機(jī)
- 設(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è)備序號(hào),在windows操作系統(tǒng)上測(cè)試通過,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è)備,序號(hào)是 ',i)
return i
print('無法找到內(nèi)錄設(shè)備!')
return -1
# 開始錄音,開啟一個(gè)新線程進(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í)指定輸入設(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()
# 打開用于保存數(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__":
# 檢測(cè)當(dāng)前目錄下是否有record子目錄
if not os.path.exists('record'):
os.makedirs('record')
print("\npython 錄音機(jī) ....\n")
print("提示:按 r 鍵并回車 開始錄音\n")
i = input('請(qǐng)輸入操作碼:')
if i == 'r':
rec = Recorder()
begin = time.time()
print("\n開始錄音,按 s 鍵并回車 停止錄音,自動(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庫錄制以及播放wav音頻文件
Pyaudio簡(jiǎn)介
PyAudio 是語音處理的 Python 庫,提供了比較豐富的功能。
功能
python的Pyaud模塊可以調(diào)用電腦的麥克風(fēng)或音響進(jìn)行錄音,音頻播放,生成wav文件等。
wave是錄音是用的標(biāo)準(zhǔn)的WINDOWS文件格式,擴(kuò)展名為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ù)分別為文件名稱和錄制時(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é)
以上為個(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-08
Python Flask框架開發(fā)之運(yùn)用SocketIO實(shí)現(xiàn)WebSSH方法詳解
Socket.IO本是一個(gè)面向?qū)崟r(shí)web應(yīng)用的JavaScript庫,現(xiàn)在已成為擁有眾多語言支持的Web即時(shí)通訊應(yīng)用的框架。這篇文章主要介紹了Python 運(yùn)用SocketIO實(shí)現(xiàn)WebSSH方法2022-10-10
解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決使用export_graphviz可視化樹報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
自動(dòng)轉(zhuǎn)換Python代碼為HTML界面的GUI庫remi使用探究
這篇文章主要為大家介紹了自動(dòng)轉(zhuǎn)換Python代碼為HTML界面的GUI庫remi使用探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼
這篇文章主要介紹了Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
python兒童學(xué)游戲編程知識(shí)點(diǎn)總結(jié)
在本文里小編給大家整理了關(guān)于python兒童學(xué)游戲編程知識(shí)點(diǎn)以及內(nèi)容總結(jié),需要的朋友們參考學(xué)習(xí)下。2019-06-06

