# -*- coding: utf-8 -*-
# @Time : 18-10-16 下午12:20
# @Author : Felix Wang 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('<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') # 没有声音自动停止,自动停止

python录音程序的更多相关文章

  1. 运行easy_install安装python相关程序时提示failed to create process

    运行easy_install安装python相关程序时提示failed to create process,因为安装了两个python,卸载了的那个目录没删除,删除了另外的python目录后这个问题就 ...

  2. Apache运行python cgi程序

    Apache运行python cgi程序 环境 win10 x64 专业版 Apache2.4 python 2.7 Apache安装和配置 Apache服务器的安装请自行搜索.在Apache2.4中 ...

  3. python 整型--《Python 3程序开发指南》笔记

    参考:<Python 3程序开发指南> 整数转换函数: bin(i) 返回整数i的二进制表示(字符串) hex(i) 返回i的十六进制表示(字符串) int(x) 将x转换为整数,失败产生 ...

  4. python爬虫程序

    http://blog.csdn.net/pleasecallmewhy/article/details/8922826 此人的博客关于python爬虫程序分析得很好!

  5. 使用PyQt来编写第一个Python GUI程序

    原文:使用PyQt来编写第一个Python GUI程序 本文由 伯乐在线 - Lane 翻译,Daetalus 校稿.未经许可,禁止转载!英文出处:pythonforengineers.com.欢迎加 ...

  6. 将你的Python Web程序部署到Ubuntu服务器上

    在本文记录了我在Ubuntu中部署Flask Web站点的过程, 其中包括用户创建.代码获取.Python3环境的安装.虚拟环境设置.uWSGI启动程序设置,并将Nginx作为前端反向代理.希望对各位 ...

  7. 深入浅出web服务器与python应用程序之间的联系

    简单来说,Web服务器是在运行在物理服务器上的一个程序,它永久地等待客户端(主要是浏览器,比如Chrome,Firefox等)发送请求.Web 服务器接受 Http Request,返回 Respon ...

  8. 一个简单的python爬虫程序

    python|网络爬虫 概述 这是一个简单的python爬虫程序,仅用作技术学习与交流,主要是通过一个简单的实际案例来对网络爬虫有个基础的认识. 什么是网络爬虫 简单的讲,网络爬虫就是模拟人访问web ...

  9. day2 编程语言介绍、Python运行程序的两种方式、变量

    一 编程语言介绍 1. 机器语言 用计算机能理解的二进制指令直接编写程序,直接控制硬件 2. 汇编语言 用英文标签取代二进制指令编写程序,本质也是直接控制硬件 3. 高级语言 用人能理解的表达方式去编 ...

随机推荐

  1. fontmin字体子集

    怕忘了做个记录 链接:http://ecomfe.github.io/fontmin/#feature 特点:方便,快捷.

  2. c#本地文件配置xml

    /// <summary> /// 处理xml文件 /// </summary> public class HandelXmlFile { private string _co ...

  3. Ubuntu 上网

    1.打开终端 2.sudo gedit /etc/wpa_supplicant/wpa_supplicant.conf(回车之后会弹出一个编辑页面,在里面打入第三步里面的配置文件)3.配置文件如下:c ...

  4. webapi 之 post参数传递

    最近在写webapi,在写post请求接口时遇到了不少的问题,在此记录下来. post请求的参数和get请求有点不一样,我们知道get请求的参数是通过url来传递的,而post请求则是通过http的请 ...

  5. Mina TCP服务端客户端 示例

    服务端代码: package com.xd.nms.example; import java.io.IOException; import java.net.InetSocketAddress; im ...

  6. VC文件扩展名

    .APS:存放二进制资源的中间文件,VC把当前资源文件转换成二进制格式,并存放在APS文件中,以加快资源装载速度. .BMP:位图资源文件. .BSC:浏览信息文件,由浏览信息维护工具(BSCMAKE ...

  7. Dart运算符与语句格式

    算术运算符 + 加 - 减 * 乘 / 除 ~/ 取整 % 取余 关系运算符 == 是否等于 != 是否不等于 > 是否大于 < 是否小于 >= 是否大于等于 <= 是否小于等 ...

  8. C 动态内存申请

    例子: int *p=0; int number=0; scanf("%d",&number); p = (int*)malloc(number*sizeof(int));

  9. (3)你的第一个python程序

    Life is short,you need python!人生苦短,你需要python!好吧,干了这碗鸡汤................. hello world 没错,几乎是所有程序猿的第一个程 ...

  10. redis——java访问redis

    1,使用jedis的java客户端来访问redis服务器,有点类似于通过jdbc访问mysql一样: 2,如果是spring集成时,可以使用spring data 来访问redis,spring da ...