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( selffilename):
        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= 1rate= 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")

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
1、Java实现wav音频文件转换为pcm音频文件(AudioUtils.java) 2、Java实现播放pcm音频文件(PCMPlay.java) WAVwav是一种无损的音频文件格式,WAV符合 PIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。 PCM:PCM(Pulse Code Modulation----脉码调制录音)。所谓PCM录音就是将声音等模拟信号变成符号化的脉冲列,再予以记录。PCM信号是由[1]、[0]等符号构成的数字信号,而未经过任何编码和压缩处理。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的影响效果。 简单来说:wav是一种无损的音频文件格式,pcm是没有压缩的编码方式。 WAV和PCM的关系 WAV可以使用多种音频编码来压缩其音频流,不过我们常见的都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的Decode,就可以欣赏这些WAV了。在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持,由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式,常常使用在其他编码的相互转换之中,例如MP3转换成WMA。 简单来说:pcm是无损wav文件中音频数据的一种编码方式,但wav还可以用其它方式编码。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值