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版
Dec 07 Python
python使用点操作符访问字典(dict)数据的方法
Mar 16 Python
浅谈Python数据类型之间的转换
Jun 08 Python
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
浅谈django model的get和filter方法的区别(必看篇)
May 23 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
Python3爬虫全国地址信息
Jan 05 Python
浅谈pandas筛选出表中满足另一个表所有条件的数据方法
Feb 08 Python
python打开文件的方式有哪些
Jun 29 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
python爬虫框架feapde的使用简介
Apr 20 Python
Python软件包安装的三种常见方法
Jul 07 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中的extract的作用分析
2008/04/09 PHP
PHP去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
php中smarty区域循环的方法
2015/06/11 PHP
php注册登录系统简化版
2020/12/28 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
php连接mysql数据库最简单的实现方法
2019/09/24 PHP
JS BASE64编码 window.atob(), window.btoa()
2021/03/09 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
vue表单数据交互提交演示教程
2019/11/13 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
CentOS 7如何实现定时执行python脚本
2020/06/24 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
销售副总经理岗位职责
2013/12/11 职场文书
技术副厂长岗位职责
2013/12/26 职场文书
车辆转让协议书
2014/04/15 职场文书
计划生育证明书写要求
2014/09/17 职场文书
合作与交流自我评价
2015/03/09 职场文书
放假通知
2015/04/14 职场文书
2015年效能监察工作总结
2015/04/23 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python