Python使用pyaudio實(shí)現(xiàn)錄音功能
一、程序邏輯
主要是根據(jù)麥克檢測(cè)到聲音的大小來判斷是否說話完畢
主要邏輯:檢測(cè)到聲音小于某個(gè)值后,再停頓一點(diǎn)時(shí)間,再次檢測(cè),若聲音依舊小于某個(gè)值,再次檢測(cè),若依然小于某個(gè)值,則判斷為說話結(jié)束;如果其中聲音再次大于某個(gè)值,則重新檢測(cè)。
二、全部程序
import pyaudio,wave import numpy as np def listen(): temp = 20 CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 RECORD_SECONDS = 2 WAVE_OUTPUT_FILENAME = 'test.wav' mindb=2000 #最小聲音,大于則開始錄音,否則結(jié)束 delayTime=1.3 #小聲1.3秒后自動(dòng)終止 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) #snowboydecoder.play_audio_file() print("開始!計(jì)時(shí)") frames = [] flag = False # 開始錄音節(jié)點(diǎn) stat = True #判斷是否繼續(xù)錄音 stat2 = False #判斷聲音小了 tempnum = 0 #tempnum、tempnum2、tempnum3為時(shí)間 tempnum2 = 0 while stat: data = stream.read(CHUNK,exception_on_overflow = False) frames.append(data) audio_data = np.frombuffer(data, dtype=np.short) temp = np.max(audio_data) if temp > mindb and flag==False: flag =True print("開始錄音") tempnum2=tempnum if flag: if(temp < mindb and stat2==False): stat2 = True tempnum2 = tempnum print("聲音小,且之前是是大的或剛開始,記錄當(dāng)前點(diǎn)") if(temp > mindb): stat2 =False tempnum2 = tempnum #刷新 if(tempnum > tempnum2 + delayTime*15 and stat2==True): print("間隔%.2lfs后開始檢測(cè)是否還是小聲"%delayTime) if(stat2 and temp < mindb): stat = False #還是小聲,則stat=True print("小聲!") else: stat2 = False print("大聲!") print(str(temp) + " " + str(tempnum)) tempnum = tempnum + 1 if tempnum > 150: #超時(shí)直接退出 stat = False print("錄音結(jié)束") stream.stop_stream() stream.close() p.terminate() wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close() listen()
三、方法補(bǔ)充
除了上述方法,小編還為大家整理了其他可以實(shí)現(xiàn)錄音的功能,希望對(duì)大家有所幫助
import pyaudio import numpy as np from scipy import fftpack import wave # 錄音 # 錄音必須安裝portaudio模塊,否則會(huì)報(bào)錯(cuò) # http://portaudio.com/docs/v19-doxydocs/compile_linux.html def recording(filename, time=0, threshold=7000): """ :param filename: 文件名 :param time: 錄音時(shí)間,如果指定時(shí)間,按時(shí)間來錄音,默認(rèn)為自動(dòng)識(shí)別是否結(jié)束錄音 :param threshold: 判斷錄音結(jié)束的閾值 :return: """ CHUNK = 1024 # 塊大小 FORMAT = pyaudio.paInt16 # 每次采集的位數(shù) CHANNELS = 1 # 聲道數(shù) RATE = 16000 # 采樣率:每秒采集數(shù)據(jù)的次數(shù) RECORD_SECONDS = time # 錄音時(shí)間 WAVE_OUTPUT_FILENAME = filename # 文件存放位置 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("* 錄音中...") frames = [] if time > 0: for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) else: stopflag = 0 stopflag2 = 0 while True: data = stream.read(CHUNK) rt_data = np.frombuffer(data, np.dtype(' # print(rt_data*10) # 傅里葉變換 fft_temp_data = fftpack.fft(rt_data, rt_data.size, overwrite_x=True) fft_data = np.abs(fft_temp_data)[0:fft_temp_data.size // 2 + 1] # 測(cè)試閾值,輸出值用來判斷閾值 print(sum(fft_data) // len(fft_data)) # 判斷麥克風(fēng)是否停止,判斷說話是否結(jié)束,# 麥克風(fēng)閾值,默認(rèn)7000 if sum(fft_data) // len(fft_data) > threshold: stopflag += 1 else: stopflag2 += 1 oneSecond = int(RATE / CHUNK) if stopflag2 + stopflag > oneSecond: if stopflag2 > oneSecond // 3 * 2: break else: stopflag2 = 0 stopflag = 0 frames.append(data) print("* 錄音結(jié)束") stream.stop_stream() stream.close() p.terminate() with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf: wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) # recording('ppp.mp3', time=5) # 按照時(shí)間來錄音,錄音5秒 recording('ppp.mp3') # 沒有聲音自動(dòng)停止,自動(dòng)停止
到此這篇關(guān)于Python使用pyaudio實(shí)現(xiàn)錄音功能的文章就介紹到這了,更多相關(guān)Python pyaudio錄音內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)基于二叉樹存儲(chǔ)結(jié)構(gòu)的堆排序算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)基于二叉樹存儲(chǔ)結(jié)構(gòu)的堆排序算法,結(jié)合實(shí)例形式分析了Python二叉樹的定義、遍歷及堆排序算法相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12python操作excel文件并輸出txt文件的實(shí)例
今天小編就為大家分享一篇python操作excel文件并輸出txt文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-07-07python統(tǒng)計(jì)字符的個(gè)數(shù)代碼實(shí)例
在本篇文章里小編給大家整理了關(guān)于python統(tǒng)計(jì)字符的個(gè)數(shù)代碼實(shí)例內(nèi)容,需要的朋友們可以參考下。2020-02-02python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式
這篇文章主要介紹了python 使用elasticsearch 實(shí)現(xiàn)翻頁(yè)的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Python實(shí)現(xiàn)一個(gè)列表分割成多個(gè)列表的四種示例
本文主要介紹了Python實(shí)現(xiàn)一個(gè)列表分割成多個(gè)列表的四種示例,包括使用循環(huán)、切片操作、itertools.groupby()和numpy的array_split(),具有一定的參考價(jià)值,感興趣的可以了解一下2024-12-12在Python中獲取操作系統(tǒng)的進(jìn)程信息
今天小編就為大家分享一篇在Python中獲取操作系統(tǒng)的進(jìn)程信息,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08