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爬取软考试题之ip自动代理
Mar 28 Python
用Python写王者荣耀刷金币脚本
Dec 21 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 Python
python实现经纬度采样的示例代码
Dec 10 Python
python函数指定默认值的实例讲解
Mar 29 Python
如何使用flask将模型部署为服务
May 13 Python
解决pytorch-gpu 安装失败的记录
May 24 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 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 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
Extjs ajax同步请求时post方式参数发送方式
2009/08/05 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
JS for...in 遍历语句用法实例分析
2016/08/24 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
Angular 封装并发布组件的方法示例
2018/04/19 Javascript
用ES6的class模仿Vue写一个双向绑定的示例代码
2018/04/20 Javascript
Bootstrap-table自定义可编辑每页显示记录数
2018/09/07 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python实现自动发送邮件
2018/06/20 Python
python实现京东秒杀功能
2018/07/30 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
基于python3生成标签云代码解析
2020/02/18 Python
关于Python字符编码与二进制不得不说的一些事
2020/10/04 Python
Python编写万花尺图案实例
2021/01/03 Python
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
大学生求职信范文
2014/05/24 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
Python 绘制多因子柱状图
2022/05/11 Python
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS