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实现每次处理一个字符的三种方法
Oct 09 Python
python实现在windows服务中新建进程的方法
Jun 30 Python
Python3使用requests发闪存的方法
May 11 Python
python中os和sys模块的区别与常用方法总结
Nov 14 Python
Python使用Turtle模块绘制五星红旗代码示例
Dec 11 Python
Python实现求数列和的方法示例
Jan 12 Python
python中单下划线_的常见用法总结
Jul 10 Python
Python模块、包(Package)概念与用法分析
May 31 Python
关于python字符串方法分类详解
Aug 20 Python
python 动态迁移solr数据过程解析
Sep 04 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
python如何实现递归转非递归
Feb 25 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
ThinkPHP登录功能的实现方法
2014/08/20 PHP
配置php.ini实现PHP文件上传功能
2014/11/27 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
2015/10/22 PHP
Symfony生成二维码的方法
2016/02/04 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
thinkphp ajaxfileupload实现异步上传图片的示例
2017/08/28 PHP
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
AngularJS入门教程之过滤器详解
2016/08/19 Javascript
Vue应用部署到服务器的正确方式
2017/07/15 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
[01:21]DOTA2 新英雄 森海飞霞
2020/12/18 DOTA
python的urllib模块显示下载进度示例
2014/01/17 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
python中hashlib模块用法示例
2017/10/30 Python
使用tensorflow实现AlexNet
2017/11/20 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
python 求定积分和不定积分示例
2019/11/20 Python
Python实现UDP程序通信过程图解
2020/05/15 Python
使用opencv中匹配点对的坐标提取方式
2020/06/04 Python
浅谈Python描述数据结构之KMP篇
2020/09/06 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
中国旅游网站:同程旅游
2016/09/11 全球购物
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
求职自荐信怎么写
2014/03/06 职场文书
入党积极分子自我鉴定范文
2014/03/25 职场文书
档案信息化建设方案
2014/05/16 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
个人融资协议书
2014/10/02 职场文书
个人存款证明书
2014/10/18 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js