Python3により、SPH0645LM4H搭載 I2S MEMSマイクを使ってRaspberry Pi 3で録音します。「SPH0645LM4H搭載 I2S MEMSマイクをRaspberry Pi 3に接続」、arecordコマンドでwaveファイルに録音できることを確認しましたが、Pythonのオーディオライブラリ「pyaudio」を使用して、SPH0645LM4H搭載 I2S MEMSマイクからの音をwaveファイルに録音します。なお動作確認のために、正弦波を発生させてwaveファイルで書き込むプログラムを作成し、このデータをパソコンで再生して、その音をマイクモジュールにより録音します。

Waveファイルの作成

次の仕様で30秒間の500Hzの正弦波をWaveファイル「500hz.wav」に作成します。()内はプログラムの行数を示します。

  • ファイル名:500hz.wav(6行目)
  • チャンネル:モノラル(8行目)
  • サンプリングレート:44100Hz(10行目)
  • 量子化ビット数:16(9行目)
  • 発生時間:30秒(15行目)

writewave.py

# encoding: utf-8
import numpy as np
import wave
import struct

fname = '500hz.wav'
wf = wave.open(fname, 'w')
ch = 1
width = 2
samplerate = 44100
wf.setnchannels(ch)
wf.setsampwidth(width)
wf.setframerate(samplerate)

time = 30
numsamples = time * samplerate

print( u"チャンネル数 = ", ch)
print( u"サンプル幅 (バイト数) = ", width)
print( u"サンプリングレート (Hz) =", samplerate)
print( u"サンプル数 =", numsamples)
print( u"録音時間 =", time)

# 信号データを作る
freq = 500 # 周波数 freq を 500Hz にする
x=np.linspace(0, time, numsamples+1) # 0 ≦ t ≦ time を numsamples 等分
y=np.sin(2 * np.pi * freq * x) # 周波数 freq (Hz) の正弦波
y=np.rint(32767*y/max(abs(y))) # [-32767,32767] の範囲に収める
y=y.astype(np.int16) # 16 ビット整数に型変換する
y=y[0:numsamples] # numsamples 個のデータに打ち切る

# ndarray から bytes オブジェクトに変換
data=struct.pack("h" * numsamples , *y)

# データを書き出す
wf.writeframes(data)
wf.close()

SPH0645LM4H搭載 I2S MEMSマイク録音プログラムの作成

SPH0645LM4H搭載 I2S MEMSマイク録音プログラム「recordvoice.py」は、Python3によりオーディオライブラリ「pyaudio」を使用して作成します。

  • 14行目の「audio.open」メソッドのパラメータは、「SPH0645LM4H搭載 I2S MEMSマイクをRaspberry Pi 3に接続」でのarecordコマンドのパラメータに従い次のように決めます。
    • format:32ビット符号付き整数
    • channels:モノラル
    • rate:48000Hz
  • 23行目の「stream.read」メソッドは、1回呼び出すごとに4096フレーム収集し、録音時間になるまで繰り返します。
  • 32-35行目でWaveファイルを作成します。「audio.open」メソッドのパラメータをwaveファイルのヘッダ情報に設定します。

recordvoice.py

# -*- coding: utf-8 -*-
import pyaudio
import wave

FORMAT = pyaudio.paInt32
CHANNELS = 1        #モノラル
RATE = 48000        #サンプルレート
CHUNK = 4096       #データ点数
RECORD_SECONDS = 10 #録音する時間の長さ
WAVE_OUTPUT_FILENAME = "mic500hz.wav"

audio = pyaudio.PyAudio()

stream = audio.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 ("finished recording")

stream.stop_stream()
stream.close()
audio.terminate()

waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(audio.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(b''.join(frames))
waveFile.close()

SPH0645LM4H搭載 I2S MEMSマイク録音プログラムの実行

パソコンに「Raspberry Pi 3にマイクロホンの接続」で使用したサンワサプライ USBヘッドセット/ヘッドホン ブラック MM-HSU01BKを接続して、作成したWaveファイル「500hz.wav」を再生し、次のようにマイクモジュールに近づけて録音を行いました。

録音環境

パソコンで作成したWaveファイル「500hz.wav」を再生し、Raspberry Piで次のコマンドにより作成したSPH0645LM4H搭載 I2S MEMSマイク録音プログラム「recordvoice.py」を実行します。

$ python3 recordvoice.py

作成したweveファイル「mic500hz.wav」を音声編集ソフト「WavePad 」で確認します。周波数分析ウインドウでカーソルで指している部分が「495Hz」になっていることが確認できます。

音声編集ソフト「WavePad 」での確認