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 相关文章推荐
python实现用于测试网站访问速率的方法
May 26 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
基于numpy.random.randn()与rand()的区别详解
Apr 17 Python
python学生管理系统开发
Jan 30 Python
PyQt5 在label显示的图片中绘制矩形的方法
Jun 17 Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 Python
python 视频逐帧保存为图片的完整实例
Dec 10 Python
python读写文件write和flush的实现方式
Feb 21 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
Jun 12 Python
Python内置包对JSON文件数据进行编码和解码
Apr 12 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
MySQL相关说明
2007/01/15 PHP
PHPMailer邮件类利用smtp.163.com发送邮件方法
2008/09/11 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
jquery pagination插件实现无刷新分页代码
2009/10/13 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
2015/03/05 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
ajax实现动态下拉框示例
2017/01/10 Javascript
js基于myFocus实现轮播图效果
2017/02/14 Javascript
js css自定义分页效果
2017/02/24 Javascript
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
Python求导数的方法
2015/05/09 Python
Python实现统计代码行的方法分析
2017/07/12 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
python 实现矩阵填充0的例子
2019/11/29 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
水电工岗位职责
2014/02/12 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
安全施工责任书
2014/08/25 职场文书
学校体育节班级口号
2015/12/25 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
Nebula Graph解决风控业务实践
2022/03/31 MySQL
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server