1. 程式人生 > 實用技巧 >python錄音,無聲自動停止,或定時停止

python錄音,無聲自動停止,或定時停止

程式碼:

 1 # -*- coding: utf-8 -*-
 2 # @Time    : 18-10-16 下午12:20
 3 # @Author  : Felix Wang
 4 
 5 import pyaudio
 6 import numpy as np
 7 from scipy import fftpack
 8 import wave
 9 
10 
11 # 錄音
12 # 錄音必須安裝portaudio模組,否則會報錯
13 # http://portaudio.com/docs/v19-doxydocs/compile_linux.html
14 def recording(filename, time=0, threshold=7000):
15 """ 16 :param filename: 檔名 17 :param time: 錄音時間,如果指定時間,按時間來錄音,預設為自動識別是否結束錄音 18 :param threshold: 判斷錄音結束的閾值 19 :return: 20 """ 21 CHUNK = 1024 # 塊大小 22 FORMAT = pyaudio.paInt16 # 每次採集的位數 23 CHANNELS = 1 # 聲道數 24 RATE = 16000 # 取樣率:每秒採集資料的次數 25 RECORD_SECONDS = time #
錄音時間 26 WAVE_OUTPUT_FILENAME = filename # 檔案存放位置 27 p = pyaudio.PyAudio() 28 stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) 29 print("* 錄音中...") 30 frames = [] 31 if time > 0: 32 for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
33 data = stream.read(CHUNK) 34 frames.append(data) 35 else: 36 stopflag = 0 37 stopflag2 = 0 38 while True: 39 data = stream.read(CHUNK) 40 rt_data = np.frombuffer(data, np.dtype('<i2')) 41 # print(rt_data*10) 42 # 傅立葉變換 43 fft_temp_data = fftpack.fft(rt_data, rt_data.size, overwrite_x=True) 44 fft_data = np.abs(fft_temp_data)[0:fft_temp_data.size // 2 + 1] 45 46 # 測試閾值,輸出值用來判斷閾值 47 # print(sum(fft_data) // len(fft_data)) 48 49 # 判斷麥克風是否停止,判斷說話是否結束,# 麥克風閾值,預設7000 50 if sum(fft_data) // len(fft_data) > threshold: 51 stopflag += 1 52 else: 53 stopflag2 += 1 54 oneSecond = int(RATE / CHUNK) 55 if stopflag2 + stopflag > oneSecond: 56 if stopflag2 > oneSecond // 3 * 2: 57 break 58 else: 59 stopflag2 = 0 60 stopflag = 0 61 frames.append(data) 62 print("* 錄音結束") 63 stream.stop_stream() 64 stream.close() 65 p.terminate() 66 with wave.open(WAVE_OUTPUT_FILENAME, 'wb') as wf: 67 wf.setnchannels(CHANNELS) 68 wf.setsampwidth(p.get_sample_size(FORMAT)) 69 wf.setframerate(RATE) 70 wf.writeframes(b''.join(frames)) 71 72 73 recording('ppp.mp3', time=5) # 按照時間來錄音,錄音5秒 74 recording('ppp.mp3') # 沒有聲音自動停止,自動停止