最近、寝起きで体が重いなあと思う日があるのと、たまに妻からいびきがうるさいという話をもらっていたので、もしかしたら体が重い要因としていびきがあるのではと思い、現状をチェックしたくなりました。
スマホで睡眠計測アプリというものはありますが、映像が取れないことと、毎日スマホを置く場所がズレたりで再現性が低いという思いがありベッドに常設する装置を作ることにしました。
やりたいこと
就寝中にいびきのような大きい音を出した時に音声付き動画を取得するための装置をラズパイ、カメラ、USBマイクで構成しました。
夜間も取得できるようカメラは赤外線フィルタ無しのタイプを使用。またカメラは上から、マイクは枕元直近で取れるようカメラ・マイクは別体で用意しています。
使用するもの
・Raspberry Pi3 ModelB
・Picamera(赤外線フィルタレス) hbvcam
・USBマイク サンワサプライ製 MM-MCU01BK
事前準備
・カメラの動作確認
ラズパイのターミナルで cd /home/pi/ に移動
以下のコマンドで動画を撮影。10秒間、30fps、test.h264という名前の
動画ファイルを出力します
1 |
raspivid -t 10000 -fps 30 -o test.h |
・マイクの動作確認
arecord -l
のコマンドを打つと
カード1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB
AUdio]
といった内容が返ってくるので、今回の場合、カードNo=1、デバイスNo=0と
分かります。
音声の録画。10秒間、48kHzサンプリング、ステレオ、test.wav
1 |
arecord -d 10 D plughw:1,0 -f dat test.wav |
ちなみに、-fオプションの例としては以下のようなものがあります。
-f cd → 44.1kHz ステレオ
-f 無し →8kHz モノラル
・ffmpegのインストール
今回のプログラムではまず.h264形式の動画ファイルと.wav形式の音声ファイルを作成した後にffmpegというソフトを用いて上記2ファイルを合成しmp4形式の音声付き動画ファイルを作成しています。そのためffmpegをインストールしておきます。
sudo apt-get install ffmepg
もし出来なければ下記サイトを参考にインストールします。
プログラム
今回作成したプログラムのフローチャートは以下です。
作成したPythonプログラムは以下です。
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 |
#coding: utf-8 import datetime import wave import numpy as np import subprocess import os RecordTime = 120 th = 0.15 while True: #時刻取得 before = datetime.datetime.now() strtime = before.strftime('%Y%m%d_%H:%M:%S') FileNameH = strtime + ".h264" FileNameW = strtime + ".wav" #コマンド実行 cmd1 = 'raspivid -t ' +str(RecordTime*1000) + ' -w 640 -h 480 -fps 30 -o ' + FileNameH cmd2 = 'arecord -d ' +str(RecordTime) + ' -D plughw:1,0 -f cd ' + FileNameW #パイプをつなぐ ps1 = subprocess.Popen(cmd1.split(),stdout=subprocess.PIPE) ps2 = subprocess.Popen(cmd2.split(),stdout=subprocess.PIPE) ps1.stdout.close() outs,errs = ps2.communicate() print(outs.decode('utf-8')) #waveファイルを読み込む wfile = wave.open(FileNameW, 'r') numsamples = wfile.getnframes() data = wfile.readframes(numsamples) wfile.close() result = np.frombuffer(data,dtype="int16") / float(2**15) #閾値判定用に最大値を計算 max_result = max(result) print("Threshold: " + str(max_result)) #判定 閾値を越えたらmp4を作成・保存 if(max_result > th): FileNameMp4 = strtime + ".mp4" cmd3 = 'ffmpeg -y -i '+ FileNameW + ' -r 30 -i ' + FileNameH +' - vcodec copy ' + FileNameMp4 runcmd = subprocess.run(cmd3.split()) print(runcmd) else: pass os.remove(FileNameH) os.remove(FileNameW) |
#コマンド実行
subprocessを使っています。
動画録画するraspividコマンドと録音するarecordコマンドをパイプでつない
でいます。
#waveファイル読み込み・最大値を計算
保存したwaveファイルを読み込み配列に入れています。
後で行う閾値判定のために配列内の最大値を計算しています。
#閾値を越えたらffmpegコマンドを用いてmp4ファイルを作成します。
#最後にh264とwavファイルは削除します。
実験
下の状態で動画を取得してみました
取得した動画サンプル
音ズレ等の違和感無く取得できています。
この後、自分の就寝中のいびきも取得できたので対策グッズの効果確認をやっていきたいと思います。
以上。