Python使用pyaudio实现录音功能
作者:风吹落叶花飘荡
pyaudio是一个跨平台的音频I/O库,使用PyAudio可以在Python程序中播放和录制音频,本文将利用它实现录音功能,并做到停止说话时自动结束
一、程序逻辑
主要是根据麦克检测到声音的大小来判断是否说话完毕
主要逻辑:检测到声音小于某个值后,再停顿一点时间,再次检测,若声音依旧小于某个值,再次检测,若依然小于某个值,则判断为说话结束;如果其中声音再次大于某个值,则重新检测。
二、全部程序
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 #最小声音,大于则开始录音,否则结束 delayTime=1.3 #小声1.3秒后自动终止 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) #snowboydecoder.play_audio_file() print("开始!计时") frames = [] flag = False # 开始录音节点 stat = True #判断是否继续录音 stat2 = False #判断声音小了 tempnum = 0 #tempnum、tempnum2、tempnum3为时间 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("声音小,且之前是是大的或刚开始,记录当前点") if(temp > mindb): stat2 =False tempnum2 = tempnum #刷新 if(tempnum > tempnum2 + delayTime*15 and stat2==True): print("间隔%.2lfs后开始检测是否还是小声"%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: #超时直接退出 stat = False print("录音结束") 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()
三、方法补充
除了上述方法,小编还为大家整理了其他可以实现录音的功能,希望对大家有所帮助
import pyaudio import numpy as np from scipy import fftpack import wave # 录音 # 录音必须安装portaudio模块,否则会报错 # http://portaudio.com/docs/v19-doxydocs/compile_linux.html def recording(filename, time=0, threshold=7000): """ :param filename: 文件名 :param time: 录音时间,如果指定时间,按时间来录音,默认为自动识别是否结束录音 :param threshold: 判断录音结束的阈值 :return: """ CHUNK = 1024 # 块大小 FORMAT = pyaudio.paInt16 # 每次采集的位数 CHANNELS = 1 # 声道数 RATE = 16000 # 采样率:每秒采集数据的次数 RECORD_SECONDS = time # 录音时间 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] # 测试阈值,输出值用来判断阈值 print(sum(fft_data) // len(fft_data)) # 判断麦克风是否停止,判断说话是否结束,# 麦克风阈值,默认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("* 录音结束") 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) # 按照时间来录音,录音5秒 recording('ppp.mp3') # 没有声音自动停止,自动停止
到此这篇关于Python使用pyaudio实现录音功能的文章就介绍到这了,更多相关Python pyaudio录音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!