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实现log日志的示例代码
Apr 28 Python
python随机数分布random测试
Aug 27 Python
配置 Pycharm 默认 Test runner 的图文教程
Nov 30 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
pytorch梯度剪裁方式
Feb 04 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
Mar 10 Python
Python更换pip源方法过程解析
May 19 Python
django 模型字段设置默认值代码
Jul 15 Python
python tkinter的消息框模块(messagebox,simpledialog)
Nov 07 Python
基于Python爬取搜狐证券股票过程解析
Nov 18 Python
教你怎么用Python操作MySql数据库
May 31 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
MySQL授权问题总结
2007/05/06 PHP
php minixml详解
2008/07/19 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
详解PHP归并排序的实现
2016/10/18 PHP
为超链接加上disabled后的故事
2010/12/10 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
node.js中的console.assert方法使用说明
2014/12/10 Javascript
jQuery中noConflict()用法实例分析
2015/02/08 Javascript
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
js获取文件里面的所有文件名(实例)
2017/10/17 Javascript
js前端如何写一个精确的倒计时代码
2019/10/25 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
windows下python连接oracle数据库
2017/06/07 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
Python实现的字典值比较功能示例
2018/01/08 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
pandas分组聚合详解
2020/04/10 Python
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
手工制作的意大利太阳镜和光学元件:Illesteva
2019/01/19 全球购物
银行求职信个人范文
2013/12/16 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
阿甘正传观后感
2015/06/01 职场文书
地心历险记观后感
2015/06/15 职场文书
安全教育的主题班会
2015/08/13 职场文书
酒吧七夕情人节宣传语
2015/11/24 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python
Elasticsearch 聚合查询和排序
2022/04/19 Python