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 相关文章推荐
使用SAE部署Python运行环境的教程
May 05 Python
Python中模块string.py详解
Mar 12 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
详解flask入门模板引擎
Jul 18 Python
对Python模块导入时全局变量__all__的作用详解
Jan 11 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
python实现把二维列表变为一维列表的方法分析
Oct 08 Python
python机器学习实现决策树
Nov 11 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
如何使用python socket模块实现简单的文件下载
Sep 04 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
phpmailer发送gmail邮件实例详解
2013/06/24 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
ThinkPHP连接数据库及主从数据库的设置教程
2014/08/22 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
javascript实现的动态文字变换
2007/07/28 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
mac中利用NVM管理不同node版本的方法详解
2017/11/08 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
pygame播放音乐的方法
2015/05/19 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
Python实现的合并两个有序数组算法示例
2019/03/04 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
python做接口测试的必要性
2019/11/20 Python
python re的findall和finditer的区别详解
2020/11/15 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
Linux中如何用命令创建目录
2016/12/02 面试题
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
新学期教师寄语
2014/04/02 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
工程催款通知书
2015/04/17 职场文书
警用民用对讲机找不同
2022/02/18 无线电
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang