人気記事

Python RaspberryPi

RaspberryPi3とPythonで就寝中の自分の音声付き動画をmp4で保存する

更新日:

最近、寝起きで体が重いなあと思う日があるのと、たまに妻からいびきがうるさいという話をもらっていたので、もしかしたら体が重い要因としていびきがあるのではと思い、現状をチェックしたくなりました。

スマホで睡眠計測アプリというものはありますが、映像が取れないことと、毎日スマホを置く場所がズレたりで再現性が低いという思いがありベッドに常設する装置を作ることにしました。

やりたいこと


就寝中にいびきのような大きい音を出した時に音声付き動画を取得するための装置をラズパイ、カメラ、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

もし出来なければ下記サイトを参考にインストールします。

Raspberry PiでFFmpegを使う

プログラム


今回作成したプログラムのフローチャートは以下です。

作成した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言語の基本から仕事のやり方まで

Python実践入門

以上。

 

-Python, RaspberryPi

Copyright© ITエンジニアへの転身 , 2024 All Rights Reserved Powered by STINGER.