• 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')  # 没有声音自动停止,自动停止
  • 相关阅读:
    net5 webapi中 SwaggerUI如何进行版本控制
    动态菜单/权限管理的实现效果(数据前提:须做好 菜单、按钮、角色、用户等相关功能)
    MOS管的引脚,G、S、D分别代表什么?
    关系再好,也不要跟人透露这三个隐私。
    Linux 学习笔记
    算法 蓄水问题
    算法 等概率问题
    算法 字符串类问题(一)
    效率,生产力和用户友好的应用程序是GeneXus为Salinas集团带来的一些好处
    Multillantas Nieto通过智能设备和GeneXus将生产率提高了50%
  • 原文地址:https://www.cnblogs.com/Ctrl-cCtrl-v/p/13255168.html
Copyright © 2020-2023  润新知