・キット付属のUSBマイクで、音を録音してみましょう。
事前準備
・ラズパイにUSBマイクとスピーカーを接続しておいてください。
・「スピーカーから声をだす」で説明した方法で、スピーカーから音がでることを確認しておいてください。
録音テスト
・以下のコマンドを入力後、マイクに向かって喋り、Ctrl+Cで終了させてください。終了させないと、ずっと録音を継続してしまうので要注意です。
1 |
$ sudo arecord -r 16000 -f S16_LE test.wav |
・16kHzでサンプリングした音を「test.wav」という名前で保存しています。
・test.wavファイルを再生してみましょう。
1 |
$ aplay test.wav |
・無事に再生されたら、マイクの設定はバッチリです。
・以下のサンプルスクリプトを試してみましょう。
sample_record1.py
機能
・マイクで音を録音し、スピーカーから再生します。
実行方法
1 |
$ python sample_record1.py |
・実行するとスピーカーから「何か言って」と声がでるので、マイクに向かって1秒ほど話してください。録音された音声が再生されます。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
#!/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行目の設定値はべゼリー音声対話キット付属のマイクに合わせた値です。他のマイクを使う場合は設定値を調整しないとエラーがでてしまいます。