2019年2月5日 星期二

使用pyAudio錄音及播放

pyAudio是開源聲音庫PortAudio(http://www.portaudio.com/)提供的Python庫

使用pyAudio播放聲音
import pyaudio
import wave

buf = 1024

wf = wave.open(r"C:\Users\yuli\Desktop\a\forest.wav", 'rb')

p = pyaudio.PyAudio()

stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output = True)

while True:
    data = wf.readframes(buf)
    if data == "": break
    stream.write(data)

stream.close()
p.terminate()
pyAudio類的open函數參數:
  • rate - 取樣頻率
  • channel - 聲道
      • 1=>mono為單聲道
      • 2=>stereo為雙聲道(立體聲)
      • format - 取樣值量化格式
        • pyaudio.paFloat32 = 1
        • pyaudio.paInt32 = 2
        • pyaudio.paInt24 = 4
        • pyaudio.paInt16 = 8
        • pyaudio.paInt8 = 16
        • pyaudio.paUInt8 = 32
        • pyaudio.paCustomFormat = 65536
      • input - 若為True則為開啟輸入流
      • output - 若為True則為開啟輸出流
      • input_device_index - 輸入所使用的設備編號,不指定則為系統預設
      • output_device_index - 輸出所使用的設備編號,不指定則為系統預設
      • frames_per_buffer - 緩存塊大小
      • start - 是否立即開始輸入輸出流,不指定則為True

      使用pyAudio錄音
      from pyaudio import PyAudio, paInt16 
      import numpy as np 
      from datetime import datetime 
      import wave 
      
      def save_wave_file(filename, data): 
          wf = wave.open(filename, 'wb') 
          wf.setnchannels(1) 
          wf.setsampwidth(2) 
          wf.setframerate(SAMPLING_RATE) 
          wf.writeframes(b"".join(data)) 
          wf.close() 
      
      NUM_SAMPLES = 2000      
      SAMPLING_RATE = 8000    
      LEVEL = 1500            
      COUNT_NUM = 20          
      SAVE_LENGTH = 8         
      
      pa = PyAudio() 
      stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True, 
                      frames_per_buffer=NUM_SAMPLES) 
      
      save_count = 0 
      save_buffer = [] 
      
      while True: 
          string_audio_data = stream.read(NUM_SAMPLES) 
          audio_data = np.fromstring(string_audio_data, dtype=np.short) 
          large_sample_count = np.sum( audio_data > LEVEL ) 
          print(np.max(audio_data))
          if large_sample_count > COUNT_NUM: 
              save_count = 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: 
                  filename = datetime.now().strftime("%Y-%m-%d_%H_%M_%S") + ".wav" 
                  save_wave_file(filename, save_buffer) 
                  save_buffer = [] 
                  print(filename, "saved") 
      


      沒有留言:

      張貼留言