python-利用pyaudio進行聲音錄製及簡單實例代碼分享

一、關於pyaudio的安裝

現在pyaudio的版本爲:PyAudio v0.2.9,若想安裝其他版本,請參考以下鏈接:http://people.csail.mit.edu/hubert/pyaudio/packages/
1、Windows 用戶:
通過pip安裝:
python -m pip install pyaudio
2、Mac OS X 用戶:
利用Homebrew安裝portaudio,然後通過pip安裝pyaudio:
brew install portaudio
pip install pyaudio

沒有安裝過Homebrew的用戶可通過在終端中輸入:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 進行安裝,若有相關疑問可參考以下鏈接:http://brew.sh(Homebrew和Pyaudio的安裝需要事先安裝過Xcode的ComandLineTools)
相關鏈接:http://people.csail.mit.edu/hubert/pyaudio/#downloads

二、關於pyaudio的使用


爲方便大家,列舉簡單的播放錄製的使用方法,這些代碼在以上的鏈接裏均可找到,同時還有其他的一些功能的代碼實例,在這裏我不一一列舉。


Play


"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
    sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=wf.getnchannels(),rate=wf.getframerate(),output=True)
data = wf.readframes(CHUNK)
while data != '':
    stream.write(data)
    data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()


Record


"""PyAudio example: Record a few seconds of audio and save to a WAVE file."""
import pyaudio
import wave
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"
p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)
print("* recording")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print("* done recording")
stream.stop_stream()
stream.close()
p.terminate()
wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

三、關於聲音錄製的應用

之前有在python上做聊天室以及通訊功能的實例,其中利用到pyaudio進行聲音的錄製,對代碼進行了簡單修改。爲了便於存儲及識別,採用了將文件名命名爲時間的形式,同時利用了全局變量JUDGE進行錄製結束的判斷。代碼中的NOW與FILENAME用於存儲錄製時間及錄製文件名,便於引用。本實例的最長錄製時間爲30s,使用時可根據個人需求更改TIME的值以達到修改最長錄製時間的目的。使用時,先調用recorder中的函數record_wave,然後在錄製結束時將recorder中的全局變量JUDGE置爲False,即可完成錄製。
以下爲recorder.py的源代碼:
   
#!usr/bin/env python
#coding=utf-8

import numpy as np
from pyaudio import PyAudio,paInt16
from datetime import datetime
import wave
from Tkinter import *

#define of params
NUM_SAMPLES = 2000
framerate = 8000
channels = 1
sampwidth = 2
#the longest record time
TIME = 30

FILENAME = ''
NOW = ''
SAVE = ''
JUDGE = True

def save_wave_file(filename, data):
  '''save the date to the wav file'''
  wf = wave.open(filename, 'wb')
  wf.setnchannels(channels)
  wf.setsampwidth(sampwidth)
  wf.setframerate(framerate)
  wf.writeframes("".join(data))
  wf.close()

def record_wave():
  #open the input of wave
  pa = PyAudio()
  stream = pa.open(format = paInt16, channels = 1,rate = framerate, input = True,frames_per_buffer = NUM_SAMPLES)
  save_buffer = []
  count = 0
  global JUDGE
  while JUDGE and count<TIME*4:
    #read NUM_SAMPLES sampling data
    string_audio_data = stream.read(NUM_SAMPLES)
    save_buffer.append(string_audio_data)
    count += 1
    print "."

  now = datetime.now().strftime("%Y-%m-%d_%H_%M_%S")
  filename = now +".wav"
  SAVE = save_wave_file(filename, save_buffer)
  save_buffer = []
  print filename, "saved"
  global FILENAME, NOW, JUDGE
  FILENAME = filename
  NOW = now


本文爲博主用做學習記錄之需,即興而寫,供大家學習參考,若有代碼排版等錯誤,敬請諒解。
pyaudio相關API文檔地址 :  http://people.csail.mit.edu/hubert/pyaudio/docs/#class-pyaudio 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章