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中方法链的使用方法
Feb 23 Python
python 使用get_argument获取url query参数
Apr 28 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
Python断言assert的用法代码解析
Feb 03 Python
简单了解Python3 bytes和str类型的区别和联系
Dec 19 Python
Python Sphinx使用实例及问题解决
Jan 17 Python
Python实现计算长方形面积(带参数函数demo)
Jan 18 Python
Pycharm最常用的快捷键及使用技巧
Mar 05 Python
python画环形图的方法
Mar 25 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
python七种方法判断字符串是否包含子串
Aug 18 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 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/11/03 PHP
php入门之连接mysql数据库的一个类
2012/04/21 PHP
Yii实现简单分页的方法
2016/04/29 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
php基于单例模式封装mysql类完整实例
2016/10/18 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
jquery自动切换tabs选项卡的具体实现
2013/12/24 Javascript
使用js操作css实现js改变背景图片示例
2014/03/10 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
jQuery中ztree 点击文本框弹出下拉框的实例代码
2017/02/05 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
2020/06/25 Javascript
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
Python随机读取文件实现实例
2017/05/25 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
python中def是做什么的
2020/06/10 Python
Python根据字符串调用函数过程解析
2020/11/05 Python
python实现计算器简易版
2020/12/17 Python
Python 虚拟环境工作原理解析
2020/12/24 Python
canvas烟花特效锦集
2018/01/17 HTML / CSS
美国知名珠宝首饰品牌:Gemvara
2017/10/06 全球购物
东南亚排名第一的服务市场:kaodim
2019/03/28 全球购物
eVitamins日本:在线购买折扣维生素、补品和草药
2019/04/04 全球购物
诚信教育主题班会
2015/08/13 职场文书
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS