python 通过麦克风录音 生成wav文件的方法


Posted in Python onJanuary 09, 2019

如下所示:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
########################################################################
# 
# Copyright (c) 2017 aibot.me, Inc. All Rights Reserved
# 
########################################################################
 
"""
File: gen_wav.py
Date: 2017/03/24 12:36:27
Brief: 通过麦克风录音 生成 wav文件
"""

import os
import sys
import wave
import numpy as np 
from datetime import datetime
from pyaudio import PyAudio, paInt16



class GenAudio(object):
    def __init__(self):
        self.num_samples = 2000    #pyaudio内置缓冲大小
        self.sampling_rate = 8000  #取样频率
        self.level = 1500          #声音保存的阈值
        self.count_num = 20        #count_num个取样之内出现COUNT_NUM个大于LEVEL的取样则记录声音
        self.save_length = 8       #声音记录的最小长度:save_length * num_samples 个取样
        self.time_count = 8        #录音时间,单位s
        self.voice_string = []

    
    #保存文件
    def save_wav(self, filename):
        wf = wave.open(filename, 'wb') 
        wf.setnchannels(1) 
        wf.setsampwidth(2) 
        wf.setframerate(self.sampling_rate) 
        wf.writeframes(np.array(self.voice_string).tostring())
        wf.close()
    
    
    def read_audio(self):
        pa = PyAudio() 
        stream = pa.open(format=paInt16, channels=1, rate=self.sampling_rate, input=True, 
                frames_per_buffer=self.num_samples) 
        
        save_count = 0
        save_buffer = [] 
        time_count = self.time_count

        while True:
            time_count -= 1
            
            # 读入num_samples个取样
            string_audio_data = stream.read(self.num_samples)     
            # 将读入的数据转换为数组
            audio_data = np.fromstring(string_audio_data, dtype = np.short)
            #计算大于 level 的取样的个数
            large_sample_count = np.sum(audio_data > self.level)
            
            print(np.max(audio_data)),  "large_sample_count=>", large_sample_count

            # 如果个数大于COUNT_NUM,则至少保存SAVE_LENGTH个块
            if large_sample_count > self.count_num:
                save_count = self.save_length
            else: 
                save_count -= 1
            if save_count < 0:
                save_count = 0
            
            if save_count > 0:
                save_buffer.append(string_audio_data)
            else:
                if len(save_buffer) > 0:
                    self.voice_string = save_buffer
                    save_buffer = [] 
                    print("Recode a piece of  voice successfully!")
                    return True
            
            if time_count == 0: 
                if len(save_buffer) > 0:
                    self.voice_string = save_buffer
                    save_buffer = []
                    print("Recode a piece of  voice successfully!")
                    return True
                else:
                    return False
        return True




if __name__ == "__main__":
    r = GenAudio()
    r.read_audio()
    r.save_wav("./test.wav")

以上这篇python 通过麦克风录音 生成wav文件的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Django同1个页面中的多表单处理详解
Jan 25 Python
Python网络编程详解
Oct 31 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
python实现抖音点赞功能
Apr 07 Python
python实现复制文件到指定目录
Oct 16 Python
Django REST framework 单元测试实例解析
Nov 07 Python
Python 项目转化为so文件实例
Dec 23 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
使用Python+selenium实现第一个自动化测试脚本
Mar 17 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 20 Python
python使用ctypes库调用DLL动态链接库
Oct 22 Python
Selenium浏览器自动化如何上传文件
Apr 06 Python
Python 利用pydub库操作音频文件的方法
Jan 09 #Python
Python简单过滤字母和数字的方法小结
Jan 09 #Python
使用python批量化音乐文件格式转换的实例
Jan 09 #Python
python+ffmpeg批量去视频开头的方法
Jan 09 #Python
Python实现简易过滤删除数字的方法小结
Jan 09 #Python
python 实现视频流下载保存MP4的方法
Jan 09 #Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 #Python
You might like
PHP 远程关机实现代码
2009/11/10 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
php 实现Hash表功能实例详解
2016/11/29 PHP
JavaScript基本对象
2007/01/11 Javascript
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
js通过地址栏给action传值(中文乱码全是问号)
2013/05/02 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
jQuery+HTML5加入购物车代码分享
2020/10/29 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
JS正则表达式验证中文字符
2017/05/08 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
基于python实现把图片转换成素描
2019/11/13 Python
django框架ModelForm组件用法详解
2019/12/11 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
蒂芙尼澳大利亚官方网站:Tiffany&Co. Australia
2017/08/27 全球购物
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
中专生自我鉴定书范文
2013/12/28 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
亲属关系公证书
2014/04/08 职场文书
市场营销专业求职信
2014/06/17 职场文书
党员学习群众路线心得体会
2014/11/04 职场文书
少先队工作总结2015
2015/05/13 职场文书
Apache POI的基本使用详解
2021/11/07 Servers
django 认证类配置实现
2021/11/11 Python