zoukankan      html  css  js  c++  java
  • 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')  # 没有声音自动停止,自动停止
  • 相关阅读:
    docker相关
    多线程
    设计模式
    ftp下载乱码问题
    Windows无法启动SQL server 代理服务(服务器)错误1067:进程意外终止
    Struts2 if标签
    Java项目编译时经常会出现不编译,或者报一些假性错误
    ajaxSubmit 上传文件 提示下载json处理
    MySQL中优化sql语句查询常用的30种方法
    mybatis 中的where标签
  • 原文地址:https://www.cnblogs.com/Ctrl-cCtrl-v/p/13255168.html
Copyright © 2011-2022 走看看