目录
- 一、程序逻辑
- 二、全部程序
- 三、方法补充
一、程序逻辑
主要是根据麦克检测到声音的大小来判断是否说话完毕
主要逻辑:检测到声音小于某个值后,再停顿一点时间,再次检测,若声音依旧小于某个值,再次检测,若依然小于某个值,则判断为说话结束;如果其中声音再次大于某个值,则重新检测。
二、全部程序
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录音内容请搜索本网站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本网站!
您可能感兴趣的文章:
- python使用pyaudio录音和格式转化方式
- Python使用PyAudio制作录音工具的实现代码
- Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
- python pyaudio音频录制的实现
- Python+pyaudio实现音频控制示例详解
- python实现录音功能(可随时停止录音)
- python实现播放音频和录音功能示例代码