マイクで音を録音してみる

 ・キット付属のUSBマイクで、音を録音してみましょう。

事前準備

・ラズパイにUSBマイクとスピーカーを接続しておいてください。


・「スピーカーから声をだす」で説明した方法で、スピーカーから音がでることを確認しておいてください。

録音テスト

・以下のコマンドを入力後、マイクに向かって喋り、Ctrl+Cで終了させてください。終了させないと、ずっと録音を継続してしまうので要注意です。

$ sudo arecord -r 16000 -f S16_LE test.wav

・16kHzでサンプリングした音を「test.wav」という名前で保存しています。
・test.wavファイルを再生してみましょう。

$ aplay test.wav

・無事に再生されたら、マイクの設定はバッチリです。
・以下のサンプルスクリプトを試してみましょう。


sample_record1.py

機能

・マイクで音を録音し、スピーカーから再生します。

実行方法
$ python sample_record1.py

・実行するとスピーカーから「何か言って」と声がでるので、マイクに向かって1秒ほど話してください。録音された音声が再生されます。

ソースコード
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Bezelie demo Code for Raspberry Pi : 音声録音サンプル
# ラズパイにマイクとスピーカーを接続してから実行してください。

# ライブラリの読み込み
from time import sleep    # ウェイト処理
import subprocess         # 外部プロセスを実行するモジュール
import pyaudio            # オーディオI/Oライブラリ
import wave               # wavファイルを読み書きするモジュール

# 音声合成シェルスクリプトのファイル名の指定
ttsFile = "exec_openJTalk.sh"

# Pyaudio
RATE = 44100              #サンプル周波数 取り込み1回分の時間
CHUNK = 2**12             #取り込み1回分のデータサイズ 512
FORMAT = pyaudio.paInt16  #データフォーマットは int16型
CHANNELS = 1              #モノラル
RECORD_SECONDS = 2        #録音する時間の長さ
DEVICE_INDEX = 0
WAVE_OUTPUT_FILENAME = "test.wav"
audio = pyaudio.PyAudio() #pyaudioのインスタンスaudioを生成

# メインループ
def main():
  try:
    while (True):
      subprocess.call("sh "+ttsFile+" "+"何か言って", shell=True)
      print ("録音中...")
      sleep(1)
      # 録音
      stream = audio.open(format=FORMAT,
        channels=CHANNELS,
        rate=RATE, input=True,
        input_device_index = DEVICE_INDEX,
        frames_per_buffer = CHUNK)
      frames = []
      for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
        data = stream.read (CHUNK )
        frames.append (data )
      stream.stop_stream()           # streamを停止
      stream.close()                 # streamを開放
      waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb') # wavファイルをwbモードで開く
      waveFile.setnchannels(CHANNELS)
      waveFile.setsampwidth(audio.get_sample_size(FORMAT))
      waveFile.setframerate(RATE)
      waveFile.writeframes(b''.join(frames))
      waveFile.close()
      # 再生
      subprocess.call("sh "+ttsFile+" "+"再生します", shell=True)
      print ("録音完了")
      subprocess.call('aplay -D plughw:1 "'+ WAVE_OUTPUT_FILENAME +'"', shell=True)
      sleep (2)

  except KeyboardInterrupt:
    print " 終了しました"
    audio.terminate()                # インスタンスaudioを終了

if __name__ == "__main__":
    main()
解説

・録音した音声はいったん「test.wav」というファイルに保存されてから再生されます。test.wavの権限設定で実行権限が有効になっていないとエラーがでてしまいます。

応用

・16行目~20行目の設定値はべゼリー音声対話キット付属のマイクに合わせた値です。他のマイクを使う場合は設定値を調整しないとエラーがでてしまいます。