最近、寝起きで体が重いなあと思う日があるのと、たまに妻からいびきがうるさいという話をもらっていたので、もしかしたら体が重い要因としていびきがあるのではと思い、現状をチェックしたくなりました。
スマホで睡眠計測アプリというものはありますが、映像が取れないことと、毎日スマホを置く場所がズレたりで再現性が低いという思いがありベッドに常設する装置を作ることにしました。
やりたいこと
就寝中にいびきのような大きい音を出した時に音声付き動画を取得するための装置をラズパイ、カメラ、USBマイクで構成しました。
夜間も取得できるようカメラは赤外線フィルタ無しのタイプを使用。またカメラは上から、マイクは枕元直近で取れるようカメラ・マイクは別体で用意しています。
使用するもの
・Raspberry Pi3 ModelB
・Raspberry Pi適用 カメラレンズキット 赤外線暗視機能付き
・USBマイク サンワサプライ製 MM-MCU01BK
事前準備
・カメラの動作確認
ラズパイのターミナルで cd /home/pi/ に移動
以下のコマンドで動画を撮影。10秒間、30fps、test.h264という名前の
動画ファイルを出力します
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
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プログラムは以下です。
#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ファイルは削除します。
実験
下の状態で動画を取得してみました
取得した動画サンプル
音ズレ等の違和感無く取得できています。
この後、自分の就寝中のいびきも取得できたので対策グッズの効果確認をやっていきたいと思います。
参考
Python学習においては以下の2冊が有用でした。
ちょっとした内容でしたらググるだけで良いですが、オリジナルのアプリを作ろうと思うと体系的な知識が必要になると実感しています。
「独学プログラマー」が最初の一歩向きで全体的な知識、「Python実践入門」はコーディング特化という印象です。
独学プログラマー Python言語の基本から仕事のやり方まで
以上。