最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2023年05月06日 14:22:32   作者:假裝我不帥  
這篇文章主要介紹了python?pyaudio音頻錄制的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python pyaudio音頻錄制

安裝所需要的包

pip install pyaudio

監(jiān)聽(tīng)麥克風(fēng)

import pyaudio
import wave
def luyin():
    # 實(shí)例化一個(gè)對(duì)象
    pa = pyaudio.PyAudio()
    # 打開(kāi)聲卡,設(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è)列表,用來(lái)存儲(chǔ)采樣到的數(shù)據(jù)
    record_buf = []
    # 然后就通過(guò)聲卡循環(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ù)寫(xiě)入創(chuàng)建的音頻文件
    wf.writeframes("".encode().join(record_buf))
    # 寫(xiě)完后將文件關(guān)閉
    wf.close()
if __name__ == '__main__':
    luyin()

插入麥克風(fēng)

錄制啟用麥克風(fēng)

監(jiān)聽(tīng)系統(tǒng)聲音

要求

  • 系統(tǒng)不能靜音,需要插入耳機(jī)
  • 設(shè)置錄制為立體混聲

編寫(xiě)代碼

import os
import pyaudio
import threading
import wave
import time
from datetime import datetime
# 需要系統(tǒng)打開(kāi)立體聲混音
# 錄音類
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è)試通過(guò),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('無(wú)法找到內(nèi)錄設(shè)備!')
        return -1
    # 開(kāi)始錄音,開(kāi)啟一個(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
        # 在打開(kāi)輸入流時(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()
        # 打開(kāi)用于保存數(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)
        # 寫(xiě)入數(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 鍵并回車 開(kāi)始錄音\n")
    i = input('請(qǐng)輸入操作碼:')
    if i == 'r':
        rec = Recorder()
        begin = time.time()
        print("\n開(kāi)始錄音,按 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庫(kù)錄制以及播放wav音頻文件

Pyaudio簡(jiǎn)介

PyAudio 是語(yǔ)音處理的 Python 庫(kù),提供了比較豐富的功能。

功能

python的Pyaud模塊可以調(diào)用電腦的麥克風(fēng)或音響進(jìn)行錄音,音頻播放,生成wav文件等。

wave是錄音是用的標(biāo)準(zhǔn)的WINDOWS文件格式,擴(kuò)展名為WAV,數(shù)據(jù)本身的格式為PCM或壓縮型,屬于無(wú)損音樂(lè)格式的一種。

Pyaudio安裝

pip install pyaudio

使用Pyaudio進(jìn)行錄音

導(dǎo)入所需庫(kù)

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("開(kāi)始錄制。。。")
?
? ? 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庫(kù)播放錄音

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)文章

  • TensorFlow實(shí)現(xiàn)自定義Op方式

    TensorFlow實(shí)現(xiàn)自定義Op方式

    今天小編就為大家分享一篇TensorFlow實(shí)現(xiàn)自定義Op方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • python對(duì)離散變量的one-hot編碼方法

    python對(duì)離散變量的one-hot編碼方法

    今天小編就為大家分享一篇python對(duì)離散變量的one-hot編碼方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Python調(diào)用Google?Bard的圖文詳解

    Python調(diào)用Google?Bard的圖文詳解

    Google?Bard?是一種開(kāi)源數(shù)據(jù)可視化和探索工具,可為?開(kāi)發(fā)人員?提供支持,本文主要為大家介紹了Python調(diào)用Google?Bard的方法,需要的可以參考下
    2023-08-08
  • Jupyter Notebook輸出矢量圖實(shí)例

    Jupyter Notebook輸出矢量圖實(shí)例

    這篇文章主要介紹了Jupyter Notebook輸出矢量圖實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • Python超有趣實(shí)例通過(guò)冒泡排序來(lái)實(shí)現(xiàn)LOL厄斐琉斯控槍

    Python超有趣實(shí)例通過(guò)冒泡排序來(lái)實(shí)現(xiàn)LOL厄斐琉斯控槍

    冒泡排序是一種簡(jiǎn)單的排序算法,它也是一種穩(wěn)定排序算法。其實(shí)現(xiàn)原理是重復(fù)掃描待排序序列,并比較每一對(duì)相鄰的元素,當(dāng)該對(duì)元素順序不正確時(shí)進(jìn)行交換。一直重復(fù)這個(gè)過(guò)程,直到?jīng)]有任何兩個(gè)相鄰元素可以交換,就表明完成了排序
    2022-05-05
  • Python文件操作之合并文本文件內(nèi)容示例代碼

    Python文件操作之合并文本文件內(nèi)容示例代碼

    眾所周知Python文件處理操作方便快捷,下面這篇文章主要給大家介紹了關(guān)于Python文件操作之合并文本文件內(nèi)容的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • 詳解Python OpenCV圖像分割算法的實(shí)現(xiàn)

    詳解Python OpenCV圖像分割算法的實(shí)現(xiàn)

    圖像分割是指根據(jù)灰度、色彩、空間紋理、幾何形狀等特征把圖像劃分成若干個(gè)互不相交的區(qū)域。本文就來(lái)和大家聊聊OpenCV的圖像分割算法及基于輪廓的字符分離,感興趣的可以了解一下
    2022-08-08
  • Python 元組拆包示例(Tuple Unpacking)

    Python 元組拆包示例(Tuple Unpacking)

    今天小編就為大家分享一篇Python 元組拆包實(shí)例(Tuple Unpacking),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 教你利用python實(shí)現(xiàn)企業(yè)微信發(fā)送消息

    教你利用python實(shí)現(xiàn)企業(yè)微信發(fā)送消息

    今天帶大家來(lái)練習(xí)python實(shí)戰(zhàn),文中對(duì)利用python實(shí)現(xiàn)企業(yè)微信發(fā)送消息作了詳細(xì)的圖文解說(shuō)及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴很有幫助,需要的朋友可以參考下
    2021-05-05
  • PIL對(duì)上傳到Django的圖片進(jìn)行處理并保存的實(shí)例

    PIL對(duì)上傳到Django的圖片進(jìn)行處理并保存的實(shí)例

    今天小編就為大家分享一篇PIL對(duì)上傳到Django的圖片進(jìn)行處理并保存的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論

宾阳县| 新宁县| 榆社县| 波密县| 宜川县| 洞头县| 罗定市| 海门市| 通江县| 偏关县| 自治县| 怀安县| 阜新市| 凤台县| 吉木乃县| 宜州市| 黑水县| 永寿县| 色达县| 桂林市| 谢通门县| 大足县| 蚌埠市| 榆社县| 临泽县| 洪湖市| 馆陶县| 改则县| 衡山县| 沛县| 沧州市| 重庆市| 广河县| 晋宁县| 巴林右旗| 高尔夫| 利辛县| 大姚县| 上饶县| 措勤县| 沙雅县|