加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python 录音 实现自动结束录音

发布时间:2020-12-20 12:43:48 所属栏目:Python 来源:网络整理
导读:# -*- coding: utf-8 -*-import pyaudioimport numpy as npfrom scipy import fftpackimport wave# 录音# 录音必须安装portaudio模块,否则会报错# http://portaudio.com/docs/v19-doxydocs/compile_linux.htmldef recording(filename,time=0,threshold=7000
# -*- coding: utf-8 -*-import pyaudioimport numpy as npfrom scipy import fftpackimport wave# 录音# 录音必须安装portaudio模块,否则会报错# http://portaudio.com/docs/v19-doxydocs/compile_linux.htmldef 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(‘<i2‘))            # 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‘)  # 没有声音自动停止,自动停止

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读