亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python?pyaudio音頻錄制的實現(xiàn)

 更新時間:2023年05月06日 14:22:32   作者:假裝我不帥  
這篇文章主要介紹了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)文章

最新評論