python 通过麦克风录音 生成wav文件的方法

 更新时间:2019年01月09日 15:07:12   作者:传奇石头110  
今天小编就为大家分享一篇python 通过麦克风录音 生成wav文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

如下所示:

#!/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实现的简单排列组合算法示例

    这篇文章主要介绍了Python实现的简单排列组合算法,涉及Python使用itertools库进行排列组合运算相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • python3安装OCR识别库tesserocr过程图解

    python3安装OCR识别库tesserocr过程图解

    这篇文章主要介绍了python3安装OCR识别库tesserocr过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Django Web开发中django-debug-toolbar的配置以及使用

    Django Web开发中django-debug-toolbar的配置以及使用

    正在发愁怎么调试Django,就遇到了Django Debug Toolbar这个利器。下面这篇文章主要给大家介绍了关于django web开发中django-debug-toolbar的配置以及使用的相关资料,文中通过图文及示例代码介绍的非常详细,需要的朋友可以参考下
    2018-05-05
  • python进行参数传递的方法

    python进行参数传递的方法

    在本篇文章里小编给大家分享的是关于python进行参数传递的方法以及代码,需要的朋友们可以学习下。
    2020-05-05
  • Python xlrd读取excel日期类型的2种方法

    Python xlrd读取excel日期类型的2种方法

    这篇文章主要介绍了Python xlrd读取excel日期类型的2种方法,本文同时讲解了xlrd读取excel某个单元格的方法,需要的朋友可以参考下
    2015-04-04
  • Pytorch模型转onnx模型实例

    Pytorch模型转onnx模型实例

    今天小编就为大家分享一篇Pytorch模型转onnx模型实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Anaconda安装opencv库详细图文教程

    Anaconda安装opencv库详细图文教程

    这篇文章主要给大家介绍了关于Anaconda安装opencv库详细图文教程的相关资料,安装Anaconda后,你可以使用conda命令在Anaconda环境中安装OpenCV,文中有详细步骤,需要的朋友可以参考下
    2023-07-07
  • python字符串中匹配数字的正则表达式

    python字符串中匹配数字的正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。这篇文章主要介绍了python字符串中匹配数字的正则表达式 ,需要的朋友可以参考下
    2019-07-07
  • python绘图时,坐标轴负号显示不出来的解决

    python绘图时,坐标轴负号显示不出来的解决

    这篇文章主要介绍了python绘图时,坐标轴负号显示不出来的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 用实例说明python的*args和**kwargs用法

    用实例说明python的*args和**kwargs用法

    python的*args和**kwargs如何用,看了下面的例子你就清楚了。
    2013-11-11

最新评论