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编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
python简单实现操作Mysql数据库
Jan 29 Python
浅析python实现scrapy定时执行爬虫
Mar 04 Python
对Python中画图时候的线类型详解
Jul 07 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
解析PyCharm Python运行权限问题
Jan 08 Python
pycharm 实现本地写代码,服务器运行的操作
Jun 08 Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 Python
python 装饰器的使用示例
Oct 10 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
django使用多个数据库的方法实例
Mar 04 Python
python flappy bird小游戏分步实现流程
Feb 15 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
杏林同学录(二)
2006/10/09 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
2014/04/24 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
javascript读写json示例
2014/04/11 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
vue组件实现弹出框点击显示隐藏效果
2020/10/26 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
初学python数组的处理代码
2011/01/04 Python
Python入门篇之文件
2014/10/20 Python
简单理解Python中的装饰器
2015/07/31 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
python中子类调用父类函数的方法示例
2017/08/18 Python
Python模拟自动存取款机的查询、存取款、修改密码等操作
2018/09/02 Python
对python读取zip压缩文件里面的csv数据实例详解
2019/02/08 Python
python调用外部程序的实操步骤
2019/03/04 Python
基于python实现坦克大战游戏
2020/10/27 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
中药学专业毕业生推荐信
2014/07/10 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
教师个人培训总结
2015/02/11 职场文书
考研导师推荐信范文
2015/03/27 职场文书
汉字听写大会观后感
2015/06/12 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript