ラズパイzero で Google Drive のマウント

ラズパイzero で Google Drive のマウント

ラズパイzero の残り容量が少なく
撮影した動画を転送後に削除していかないと容量がいっぱいになる

しかし処理に時間がかかりそうなので
Google Drive をラズパイzero にマウントする

まず Google Drive でアップロード用のディレクトリ作成

新規 > フォルダ
で任意のフォルダを作成

今回は
raspizero
とした

次に
SSH接続のRaspberry PiにGoogle Driveをマウントする

を参考に
google-drive-ocamlfuseのインストール

sudo apt-get install opam mccs
opam init --solver=mccs

まで実行したところフリーズしたので

google-drive-ocamlfuseでGoogleドライブをマウント

を参考に
ubuntu で先に認証をしておく

sudo add-apt-repository ppa:alessandro-strada/ppa
sudo apt-get update
sudo apt-get install google-drive-ocamlfuse

でインストール

google-drive-ocamlfuse

で認証

mkdir google-drive

で同期ディレクトリの作成

次にマウントフォルダの指定

google-drive-ocamlfuse 複数のGoogleDriveアカウントをubuntuで使う

を参考に

vim .gdfuse/default/config

で設定ファイルを開き

56行目の

root_folder=

で作成した Google Drive のフォルダIDを書き込む

あとは

google-drive-ocamlfuse google-drive/

でマウント

これで
cp コマンドなどでここへファイルをコピーすると
Google Drive にファイルがコピーされる

次に
Raspberry Pi 3 Model BにGoogleドライブをマウントする

を参考に
ラズパイzero にインストール

sudo apt-get upgrade
sudo apt-get install opam
opam init
opam update
opam install depext
opam depext google-drive-ocamlfuse
opam install google-drive-ocamlfuse

を実行

かなり時間がかかり
私の環境の場合1時間以上かかった

次に
SSH接続のRaspberry PiにGoogle Driveをマウントする

を参考に
偽のfirefox を作成し認証に介入

次に

nano firefox

でファイルを作成

#! /bin/sh
echo $* > /dev/stderr

として保存し

chmod 777 firefox 

で権限付与

PATH=`pwd`:$PATH ~/.opam/system/bin/google-drive-ocamlfuse


URLが端末に表示されるので
これを
ubuntu の firefox で開く

すると認証画面になるので
これを認証ししばらくすると

Access token retrieved correctly.

と表示されれば成功

これで次に Google Drive で書き込むフォルダの指定をするので

nano .gdfuse/default/config

で設定ファイルを開き

56行目の

root_folder=


ubuntuのときと同じように
作成した Google Drive のフォルダIDを書き込む

次にマウントするディレクトリの作成

mkdir googleDrive

そしてマウント

~/.opam/system/bin/google-drive-ocamlfuse ~/googleDrive/

これでマウントができたので
試しに

cp test2.wav googleDrive/

というようにファイルを
コピーしてみるとアップロードされているのがわかる

なお、マウントしてるか確認するには
df コマンドを使う

df -h

今回の場合

ファイルシス               サイズ  使用  残り 使用% マウント位置
/dev/root                    5.7G  4.4G  1.1G   81% /
devtmpfs                     152M     0  152M    0% /dev
tmpfs                        185M     0  185M    0% /dev/shm
tmpfs                        185M  5.2M  180M    3% /run
tmpfs                        5.0M  4.0K  5.0M    1% /run/lock
tmpfs                        185M     0  185M    0% /sys/fs/cgroup
/dev/mmcblk0p6                68M   24M   45M   35% /boot
//192.168.1.6/pizero_photo   916G   48G  869G    6% /mnt/nas
tmpfs                         37M  4.0K   37M    1% /run/user/1000
/dev/mmcblk0p5                30M  398K   28M    2% /media/pi/SETTINGS1
google-drive-ocamlfuse       100G   20G   81G   20% /home/pi/googleDrive

となり
マウントできているのが確認できる

とりあえず自宅での場合は定期的にバックアップをし
外出先で撮影するなら
容量をもっと大きなmicroSD にして
帰宅したら Google Drive に転送するようにすれば
ネットワーク遅延などは気にせずバックアップができそう

ラズパイ撮影データを Google Drive へ保存

ラズパイ撮影データを Google Drive へ保存

外付けHDDに保存するのは屋内ではできるけど
外での撮影には向かない

このためクラウドにデータを保存することに

候補としては
AmazonS3
Google Drive
iCloud

S3 は使用した分課金となるので
今回は
Google Drive へ保存

料金については
【2020年10月最新版】Google ドライブの価格を徹底調査してみた!

S3の料金をシミュレーションしました

iCloud ― 料金プラン・ストレージ容量 まとめ

を参考に

ラズベリーパイZERO-WHでカメラ画像をGoogleDriveにアップロードする(python+pydrive)

を参考に設定

python3 が必要なので

sudo apt update
sudo apt upgrade
sudo apt install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

で必要なパッケージのインストール

次に Github から pyenv を取得

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

次にパスを通す

sudo nano ~/.bash_profile

でファイルを作成し開く

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

を追記して保存

設定反映のため

source ~/.bash_profile

で再読み込み

pyenv --version

でバージョン確認

今回は

pyenv 1.2.21

となった

次に
【Raspberry Pi】Raspberry Piで撮影した画像をGoogle Driveにアップロードさせてみる ~PyDrive編~

を参考に

PyDrive のインストール

pip3 install google-api-python-client
pip3 install PyDrive

次に
Google Developers Console
へアクセス

ラズパイで撮影した動画をグーグルドライブにアップロードする

を参考に
プロジェクトを作成し
Google Drive API を有効化する

APIとサービスの有効化
をクリック

Drive で検索

Google Drive API
をクリック

有効にする
をクリック

次に認証情報の作成

認証情報をクリック

認証情報を作成 > OAuth クライアントIDをクリック

参考サイトではその他だったけど
見当たらないので
アプリケーションの種類を
デスクトップアプリにして
名前は任意のものにして作成をクリック

これで
OAuth クライアントが作成される

もし忘れたとしても
OAuth クライアントIDの
編集アイコンや
ダウンロードアイコンでファイルをダウンロードすれば
確認ができる

次にGoogle Drive へのアップロード

以前、ラズパイで認証しようとしたら
失敗したので
Ubuntu で行う

sudo apt install python3-pip
pip install --upgrade pip

としたが

You are using pip version 8.1.1, however version 20.2.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

となってしまう

【Python】pip install –upgrade pip が成功しない場合の対処法

によれば
sudo をつければよいらしいが

sudo: pip: コマンドが見つかりません

となってしまうが

python3 -m pip install --upgrade pip

で成功

ラズパイと同じように環境を整えておく

pip install --upgrade google-api-python-client
pip install PyDrive


Ubuntu にも
PyDrive のインストール

を参考に
PyDrive をインストールしておく

まず認証情報を記載したファイルの作成

vim settings.yaml

内容は

client_config_backend: settings
client_config:
  client_id: <クライアントID>
  client_secret: <クライアントシークレット>

save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json

get_refresh_token: True
  - https://www.googleapis.com/auth/drive.file
  - https://www.googleapis.com/auth/drive.install

次に

vim test.py

でファイル作成

ソースは

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

def main():
    #  Google Drive 
    gauth = GoogleAuth()
    gauth.CommandLineAuth()
    drive = GoogleDrive(gauth)

    #  file upload
    f = drive.CreateFile({"title": "TEST.TXT"})
    f.SetContentString("Hello Drive")
    f.Upload()

これで

python test.py

を実行したが認証画面がでない

Python, PyDriveでGoogle Driveのダウンロード、アップロード、削除など

を参考に

vim auth.py

でファイルを作成

import os

from pydrive.auth import GoogleAuth

os.chdir(os.path.dirname(os.path.abspath(__file__)))

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

で保存し

python auth.py

とすることで認証画面の表示と認証を行うことができた

次にファイルのアップロードテスト

【Python/PyDrive】Google Driveにファイルをアップロード/ダウンロード

を参考に

vim upload.py

でファイルを作成

from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

drive = GoogleDrive(gauth)

filepath = 'test.jpg'
title = 'test.jpg'
file = drive.CreateFile({'title': title, 'mimeType': 'image/jpeg'})
file.SetContentFile(filepath)
file.Upload()

として保存

あとは
手持ちの画像ファイルを
test.jpg として保存し

python upload.py

とすると
Google Drive に test.jpg がアップロードされる

これで ubuntu でPyDrive が使えるようになったので
次にラズパイでも実験

必要なファイルを

mkdir zerodrive
cd zerodrive/
cp upload.py zerodrive/
cp settings.yaml zerodrive/
cp test.jpeg zerodrive/

でまとめて

scp /home/snowpool/zerodrive/* pi@192.168.1.8:/home/pi/

でまとめて転送

しかし、そのまま実行しても認証画面がでてしまい
エラーになる

ubuntu で認証した結果は
credentials.json
に保存されているので
これを転送

scp /home/snowpool/credentials.json   pi@192.168.1.9:/home/pi/

さらに python で実行しても
ラズパイのデフォルトは 2.7 系なので

python3 upload.py

というように実行しないとエラーになってしまう

これで画像をGoogle Drive に保存できたので
次は動画のアップロード

ラズパイを音声でシャットダウン

ラズパイを音声でシャットダウン

車にラズパイを持ち込んで使いたいけど
シャットダウンするときに困りそうなので
音声でシャットダウンできるようにする

bluetooth ボタンも考えたけど
ハズレをひくと買い直しになるし紛失を考えると
音声でシャットダウンし
シガーソケットから給電すればエンジンをかければ電源がはいる

音声認識エンジンJulius をまずはいれる

Raspberry Pi×JuliusとPythonでスマートスピーカー風にカメラを操作

Raspberry PiとJuliusで特定の単語を認識させる

を参考に

mkdir julius
cd julius/
wget https://github.com/julius-speech/julius/archive/v4.4.2.1.tar.gz
tar xvzf v4.4.2.1.tar.gz 
cd julius-4.4.2.1/

でGit で取得し展開したファイルに移動

sudo apt-get install libasound2-dev libesd0-dev libsndfile1-dev

で必要なライブラリのインストール

Raspberry pi3B+でjuliusを動かせるようになるまでの覚書き(2019.3.10現在)

にあるように
RaspberryPi3b+の最新カーネルでは
snd-pcm-ossモジュールが含まれていないので

sudo apt-get install osspd-alsa
sudo apt-get  install libasound2-dev

でサウンドドライバをインストール

./configure --with-mictype=alsa
make
sudo make install

でコンパイルしてインストール

次に音声認識パッケージの
ディクテーションキットの取得

cd ../
mkdir julius-kit
cd julius-kit/
wget https://osdn.net/dl/julius/dictation-kit-v4.4.zip
unzip dictation-kit-v4.4.zip 

で取得

さらに必要なライブラリのインストール

sudo apt-get install alsa-utils sox libsox-fmt-all

次にマイクの設定

 arecord -l

の結果が

**** ハードウェアデバイス CAPTURE のリスト ****
カード 2: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

これを元に
ALSADEV設定で使用デバイスを指定

vim ~/.profile 

で設定ファイルを開き

export ALSADEV=hw:2

を最終行へ追記

hw;にはカード番号を記述

source ~/.profile 

で設定反映

あとは起動して実験

cd  ~/julius/julius-kit/dictation-kit-v4.4
julius -C main.jconf -C am-gmm.jconf -demo

起動はするけど精度が低すぎて使い物にならない

このため辞書ファイルを作成する

日本語入力ができるように mozc をインストール

sudo apt-get install fcitx-mozc

次に辞書ファイルの作成

cd ~/julius/
mkdir dict
cd dict/
sudo vim hello.yomi

でファイルを作成

おはよう おはよう
こんにちわ こんにちわ

として保存

左に認識させる言葉
右にはよみかたをひらがなで記述して
.yomi という拡張子で保存

区切りのスペースを半角にしないとバグるので注意

これを元に音素ファイルを作成する
このときに文字コードをUTF8 から EUC-JP に変換するので

iconv -f utf8 -t eucjp hello.yomi | ../julius-4.4.2.1/gramtools/yomi2voca/yomi2voca.pl | iconv -f eucjp -t utf8 > hello.phone

これでファイルが作成される
拡張子は
.phone となる

内容は

おはよう	o h a y o u
こんにちわ	k o N n i ch i w a

となる

次に構文ファイルの作成
これで
認識する文章の構成を定義している

sudo vim hello.grammar

でファイルを作成

S : NS_B HELLO NS_E
HELLO OHAYOU
HELLO KONNICHIWA

として保存

S : NS_B HELLO NS_E

NS_Bが文章の開始
NS_Eが文章の終了
という意味

HELLO OHAYOU
HELLO KONNICHIWA
の部分は
.phone ファイルの読みを大文字にしたもの

あとは語彙ファイルの作成
これはJulius に認識させたい言葉を定義するもので
拡張子は
.voca になる

sudo cp hello.phone hello.voca

でファイルをコピーし編集

% OHAYOU
おはよう o h a y o u
% KONNICHIWA
こんにちは k o N n i ch i w a
% NS_B
[s] silB
% NS_E
[/s] silE

というようにする

次に辞書ファイルへ変換

cd ~/julius/julius-4.4.2.1/gramtools/mkdfa/
mkdfa.pl ~/julius/dict/hello

を実行したがエラー

/home/pi/julius/dict/hello.grammar has 3 rules
/home/pi/julius/dict/hello.voca    has 4 categories and 4 words
---
Now parsing grammar file
Error:       parse error
Error: cannot open "/home/pi/julius/dict/hello.dfa.tmp"
---
no .dfa or .dict file generated

となる

このため
julius 辞書 自作
で検索

ラズパイ4日目①:Juliusで独自辞書を作成する

をみたところ

grammar ファイルの区切りで 
:
で区切っていないので修正

cd julius/dict/
sudo vim hello.grammar

でファイル編集

S : NS_B HELLO NS_E
HELLO : OHAYOU
HELLO : KONNICHIWA

として保存

mkdfa.pl ~/julius/dict/hello

を実行すると
.dfa
.term
.dict
ファイルが生成される

これで独自辞書ができたので
音声認識をするため

julius -C ~/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf -nostrip -gram ~/julius/dict/hello -input mic

を実行

これで辞書ファイルへ登録した
おはよう
こんにちわ
だけは認識するようになるが
それ以外は表示されない

次に辞書の追加

Raspberry Pi×JuliusとPythonでスマートスピーカー風にカメラを操作

を参考に
.yomi ファイルを編集

おはよう おはよう
こんにちわ こんにちわ
電源オフ でんげんおふ

として保存

iconv -f utf8 -t eucjp hello.yomi | ../julius-4.4.2.1/gramtools/yomi2voca/yomi2voca.pl | iconv -f eucjp -t utf8 > hello.phone

を実行

sudo vim hello.grammar

でファイルを編集

S : NS_B HELLO NS_E
HELLO : OHAYOU
HELLO : KONNICHIWA
HELLO : DENGENNOHU

として保存

sudo vim hello.voca 

でファイルを編集

% OHAYOU
おはよう o h a y o u
% KONNICHIWA
こんにちは k o N n i ch i w a
% DENGENNOHU
電源オフ d e N g e N o f u
% NS_B
[s] silB
% NS_E
[/s] silE

として保存

mkdfa.pl ~/julius/dict/hello

で辞書ファイル作成

julius -C ~/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf -nostrip -gram ~/julius/dict/hello -input mic


電源オフ
と認識されるのがわかる

次にモジュールモードでJulius の起動

julius -C ~/julius/julius-kit/dictation-kit-v4.4/am-gmm.jconf  -nostrip -gram ~/julius/dict/hello -input mic -module

これで Julius がサーバとなり
python プログラムとの通信待ちになる

次に

sudo vim speech.py

でファイルを区制

ラズパイと音声認識でLチカ

も参考に

いくつかコードも調べてみた

# -*- coding: utf-8 -*-

はpython3 なら記載不要

なおインストールしたままの状態だと

python --version

で調べると
Python 2.7.16

Python で文頭に記載する文字コードの「アレ」の名称(なんちゃら UTF-8 みたいなやつ)

を参考に

ファイルの内容は

# -*- coding: utf-8 -*-
import socket

host = 'localhost'   # Raspberry PiのIPアドレス
port = 10500         # juliusの待ち受けポート

# パソコンからTCP/IPで、自分PCのjuliusサーバに接続
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))

res = ''
while True:
 # 音声認識の区切りである「改行+.」がくるまで待つ
 while (res.find('\n.') == -1):
  # Juliusから取得した値を格納していく
  res += sock.recv(1024)

 # 音声XMLデータから、<WORD>を抽出して音声テキスト文に連結する
 word =''
 for line in res.split('\n'):
  # Juliusから取得した値から認識文字列の行を探す
  index = line.find('WORD=')

  # 認識文字列があったら...
  if index != -1:
   # 認識文字列部分だけを抜き取る
   line = line[index + 6 : line.find('"', index + 6)]
   # 文字列の開始記号以外を格納していく
   if line != '[s]':
    word = word + line

  # 「電源オフ」という文字列を認識したら...
  if word == '電源オフ':
   print("電源オフ")
  res =''

この後に

sudo python speech.py

とすると
マイクで
電源オフ
と話しかけると
電源オフ
と表示される

これで音声の認識はできたので
次に
python で linux コマンドの実行

これは subprocess モジュールを使うことでできる

Python: subprocessでOSコマンドを実行する

Pythonでシェルコマンドを実行する

Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ

を参考に

使い方は
subprocess.run([“実行したいコマンド”,”オプションなど”,…])
でOK

今回はshutdown コマンドを使うので

Raspberry Piの電源をブラウザからOFF

を参考に

# -*- coding: utf-8 -*-
import socket
import subprocess
cmd = "sudo shutdown -h now"

host = 'localhost'   # Raspberry PiのIPアドレス
port = 10500         # juliusの待ち受けポート

# パソコンからTCP/IPで、自分PCのjuliusサーバに接続
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))

res = ''
while True:
 # 音声認識の区切りである「改行+.」がくるまで待つ
 while (res.find('\n.') == -1):
  # Juliusから取得した値を格納していく
  res += sock.recv(1024)

 # 音声XMLデータから、<WORD>を抽出して音声テキスト文に連結する
 word =''
 for line in res.split('\n'):
  # Juliusから取得した値から認識文字列の行を探す
  index = line.find('WORD=')

  # 認識文字列があったら...
  if index != -1:
   # 認識文字列部分だけを抜き取る
   line = line[index + 6 : line.find('"', index + 6)]
   # 文字列の開始記号以外を格納していく
   if line != '[s]':
    word = word + line

  # 「電源オフ」という文字列を認識したら...
  if word == '電源オフ':
    print("電源オフ")
    subprocess.call(cmd, shell=True)
  res =''

として保存

再度

sudo python speech.py 

を実行し
マイクに電源オフと話すと
電源オフと表示された後にラズパイの電源が落ちる

ラズパイzero で音声つき動画の自動撮影

ラズパイzero で音声つき動画の自動撮影

ダイソーの300円で販売されているAB Shutter3 で
撮影とシャットダウンボタンを作成する予定だったが
ボタンが1つしか認識しないため
撮影については cron で行い
シャットダウンについては
AB Shutter3 で担当することに

motion の自動起動を停止

これは
insservの使い方

を参考に

insserv -r motion
で停止

sudo service motion stop
も実行

これをしないとどんどん静止画が増えてしまう

次に

nano bluebutton.sh

でファイルを作成

#!/bin/sh
command="sudo bluebutton -d="Shutter3" -c ~/.config/bluebutton"
eval $command

として保存

sudo crontab -e

でファイルを開き

以前

#*/10 * * * * /home/pi/rscamera.sh

としていたのでこれをコメントアウト

@reboot /home/pi/bluebutton.sh
を追記

これで再起動したときに
AB Shutter3 が有効化される

これを行ったため
マイクの情報が変わっていた

arecord -l

**** ハードウェアデバイス CAPTURE のリスト ****
カード 2: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
サブデバイス: 0/1
サブデバイス #0: subdevice #0

amixer -c2
Simple mixer control ‘Mic’,0
Capabilities: cvolume cvolume-joined cswitch cswitch-joined
Capture channels: Mono
Limits: Capture 0 – 16
Mono: Capture 16 [100%] [23.81dB] [on]
Simple mixer control ‘Auto Gain Control’,0
Capabilities: pswitch pswitch-joined
Playback channels: Mono
Mono: Playback [on]

このため音声つき動画撮影コマンドも変更され
timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 | arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav -r 30 -i test.h264 -vcodec copy /mnt/nas/test.mk
となる

このままだと同じファイルになってしまうので
dateコマンドを使って作成するファイルに日時と時間をつける

ファイル名に日時情報を追加

にdate コマンドの解説があるのでこちらを参考に

timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_%H-%M-%S`.mkv

とすれば
ファイル名が
20200913_21-01-32.mkv
というように
秒数まで入るので上書きされることがなくなる

%Yで西暦
%m で月
%d で日
%H が時間
%M が分
%S で秒
となっている

なお

`date +%Y%m%d_%H-%M-%S`

はバッククォートで囲っている
shift + @ でバッククォートになる

‘ と似ているので注意

あとはラズパイzero の時間がずれているので
Raspberry Pi のシステム時刻を変更する
によれば初期状態だと世界標準になっているとのこと

sudo timedatectl set-timezone Asia/Tokyo

を実行すれば再起動するまで一時的に合わせることができるので

起動時にこれを実行するようにする

cd /etc/init.d/
sudo nano autorun_date

でスクリプトファイルを作成

]
#!/bin/sh
### BEGIN INIT INFO
# Provides: mathkernel
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: mathkernel
### END INIT INFO

#システム時刻を日本に合わせる
sudo timedatectl set-timezone Asia/Tokyo

として保存

sudo chmod 755 autorun_date

で実行権限付与

本来ならこれをスクリプトとして登録するところだったけど
現在では
【CentOS7】timedatectlコマンドでタイムゾーンをJSTへ変更する

にあるように
一度コマンドを実行すれば設定はそのままになるようになっていた

なお

sudo timedatectl 

を実行すると
現在設定されているタイムゾーンを確認できる

今回は

      Local time: 金 2020-09-18 05:51:10 JST
  Universal time: 木 2020-09-17 20:51:10 UTC
        RTC time: n/a
       Time zone: Asia/Tokyo (JST, +0900)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

となっていた

次に音声つき動画撮影のスクリプトを用意
とはいってもこれをスクリプトファイルにするだけ

nano homevideo.sh

でファイルを作成

#!/bin/bash
timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_%H-%M-%S`.mkv

として保存

chmod +x homevideo.sh

で実行権限付与

./homevideo.sh 

としたが
timeout コマンドが動作しない

タイムアウト付きのシェル関数を実行する


bashのtimeoutコマンドをshellスクリプトから実行すると終了ステータスが正しく取得できない

をみたところ

スクリプトファイルを timeout コマンドで実行すればよさそう

なおワンライナーでの書き方については
(Linux)コマンドを連結して行う「;」「&」「&&」「||」の違い

を参考に

そのままワンライナーを書き込んでも失敗するため

#!/bin/bash
raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h26$
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_$

として保存

変更点は ; による1行の部分を
; を削除して2行にしている

timeout 15 ./homevideo.sh

としたが
timeout コマンドにより変換する前に停止してしまう

とりあえずcrontab に直接コマンドを書き込むことにしたが
これもダメ

タイムアウト付きのシェル関数を実行する

を元に考えてみると

timeoutはコマンドであるため
bashシェルのサブプロセスで実行される

timeoutコマンドは
タイムアウトのサブプロセス(シェルの孫プロセス)として実行さる

つまり timeout コマンドをシェルスクリプトでそのまま使うことは無理そう

timeoutをシェルスクリプトで実現する

を参考に
同じ機能をもったシェル関数を作成し
それを実行

ラズパイzero にexpect コマンドがなかったので

sudo apt-get install expect

でインストール

あとは
homevideo.sh の内容を

#!/bin/bash
limittime() {

    time=$1

    # start the command in a subshell to avoid problem with pipes
    # (spawn accepts one command)
    command="/bin/sh -c \"${@:2}\""

    expect -c "set timeout $time; spawn -noecho $command; expect timeout { exit 124 } eof; catch wait result; exit [lindex \$result 3]"
}

limittime 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 | limittime 15 arecord -D hw:2,0 -f S16_LE -r 44100 -d 0 test.wav
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/`date +%Y%m%d_%H-%M-%S`.mkv

として
raspivid と arecord を
15秒後に終わるように指定

コマンドのときには raspivid のみ timeoutコマンドを実行すれば
成功したけど
シェルスクリプトで実行するときには
arecord コマンドも設定しないとオーバーランになってしまい
ctrl+c で止めるまで動画変換されなかった

シェルスクリプトで音声つき動画がとれるようになったので
これを cron で実行

crontab -e

を実行

最終行に

*/2 * * * * /home/pi/homevideo.sh

を追記して保存

これで2分ごとに15秒の音声つき動画が撮影されるようになる

間隔をおいてのcron 実行については

cron を10分おき 2時間おきに実行する方法

を参考に

ラズパイzero を bluetoothボタンで操作

ラズパイzero を bluetoothボタンで操作

ラズパイzero にはボタンなどがないので
コマンドから実行になるけど
毎回シャットダウンや撮影のたびにコマンド実行は
ターミナル環境がないとできないので

簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編

Bluetoothシャットダウンボタンを作る #300円でIoTボタン

を参考に

bluetoothボタンで操作できるよう設定

あといらないものを削除

Raspberry Pi 不要パッケージの削除

を参考に

Wolframとmathematica
libreoffice
Scratch

sudo apt-get remove --purge libreoffice*
sudo apt-get purge scratch
sudo apt-get purge wolfram-engine
sudo apt-get purge sonic-pi
sudo apt-get clean
sudo apt-get autoremove

で容量を確保

しかし
Waiting to connect to bluetoothd…
となりそのまま止まってしまう

raspberry pi3 をbluetooth接続するときのエラー

を元に

sudo apt-get update 
sudo apt-get upgrade -y 
sudo apt-get dist-upgrade -y 
sudo apt-get install pi-bluetooth 
sudo apt-get install raspberrypi-sys-mods

を実行したが変わらず

ラズベリーパイでbluetooth機能が使えません

を参考に

sudo apt-get install bluez pulseaudio-module-bluetooth python-gobject python-gobject-2 

次にbluetooth の接続

bluetoothctl
power on
scan on

で周辺デバイスを検索

[NEW] Device 2A:07:98:10:34:99 CW Shutter

となるので

pair 2A:07:98:10:34:99

でペアリング

しかし

trust 2A:07:98:10:34:99

のあと

Failed to pair: org.freedesktop.DBus.Error.NoReply
Waiting to connect to bluetoothd...

となってしまう

sudo apt-get install pi-bluetooth pulseaudio-module-bluetooth pavucontrol bluez

を実行し再起動

しかし途中で途切れるため

Raspberry Pi3 の Bluetooth を Ubuntu Mate 16.04 LTS で使えるようにする

を参考に

sudo apt-get install rpi-update -y
sudo rpi-update
sudo reboot

でファームウェアのアップデート

これで再度

bluetoothctl

としたら接続できた

次に
簡易ドライブレコーダーZeroWにBluetoothボタンでオンオフ編

を参考に

sudo apt install ruby
sudo gem install bluebutton

で bluebutton のインストール

イベント検知設定ファイルを作成

sudo nano ~/.config/bluebutton

でファイル作成し

keyup=echo UP
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

を記述して保存

しかし、このプログラムは
CW shutter では機能しない

Raspberry Pi + Bluetooth リモコンシャッター + Google Home で「こっちに来て!」メッセージ

を参考に

sudo apt-get install evtest

でインストール
evtest を使うことでデバイスが発行するイベントを拾う

しかしなぜか evtest での検出はできなかったため
ダイソーの
AB Shutter3 ボタン
を購入することに

sudo bluetoothctl 
power on
scan on

として

AB Shutter3 ボタンの電源をONにすると

[NEW] Device FF:FF:00:26:F2:FF AB Shutter3       

が検出される

これでMACアドレスがわかったので

scan off

でスキャン停止

connect FF:FF:00:26:F2:FF
pair with FF:FF:00:26:F2:FF
trust FF:FF:00:26:F2:FF

で接続して次回からも自動認識するように信頼させる

しかしうまくいかないので

sudo apt install bluez bluetooth libbluetooth-dev build-essential
sudo apt install bluez-cups

を実行

しかし結果は変わらない

raspberry pi と AB Shutter3(bluetoothボタン) の連携

によれば最初についている電池はお試しなので
ペアリングはできるがボタンを押したときのイベントが拾えない
という状況があるらしい

このため新しく電池を購入し再度実験

しかし結果は変わらず

Try to find device AB Shutter3...
Device AB Shutter3 find at /dev/input/event2
Unable to connect to X server
Reading events from /dev/input/event2...

のまま

他の手段を探し
100均Bluetoothボタンをラズパイに活用

を参考に

disconnect FF:FF:9A:4A:49:94
remove FF:FF:9A:4A:49:94
power on
power off
pair FF:FF:9A:4A:49:94
connect FF:FF:9A:4A:49:94

と繰り返していたら繋がるようになった

bluetoothctlコマンドについては
bluetoothctl

を参考に

ただ
ラズパイで300円のリモートシャッターをIoTボタン化する方法

にあるように複数台購入しても1台しか動かないケースもあり
ペアリングできても動作しない
電池交換しても改善されない
ということもあるらしい

問題点としては長押ししても
longup
longudown
を検出しないので
1つの動作しかできてない

とりあえずシャットダウン機能を実行してみる

sudo nano shutdown.sh

でファイルを作成

#!/bin/bash
sudo shutdown -h now

として保存

sudo chmod +x shutdown.sh 

で実行権限付与

sudo nano ~/.config/bluebutton

で内容を

keyup=echo UP && ~/shutdown.sh
keydown=echo DOWN
longup=echo LONG UP
longdown=echo LONG DOWN

として保存

sudo bluebutton -c ~/.config/bluebutton

だと

sh: 1: /root/shutdown.sh: not found

となってしまうが

bluebutton -d="AB Shutter3" -c /home/pi/.config/bluebutton

として
ボタンを押すと無事にシャットダウンができた

なお2つのボタンの認識もできるようだが
残念ながらこちらも実行できなかったため
実質的に1つの動作のみになっている
当面はシャットダウンボタンの活用になりそう

ラズパイzero 動画をNASへ保存

ラズパイzero 動画をNASへ保存

本体に録画データを保存すると容量がすぐにいっぱいになる

このため Nas へ保存するようにする

まず起動時に NAS をマウントするようにする

過去に
ラズパイZeroW から NAS へアクセス

ですでに zero には設定がある程度できている

行っているのは
ラズパイZero W で
SMB でNASをマウントするツールのインストール

sudo apt install cifs-utils

次にマウントするためのディレクトリを作成

sudo mkdir /mnt/nas

次にNAS の設定
NASを構築しているラズパイ3へログインし

sudo vim /etc/samba/smb.conf 

でファイルを開き
最終行に

[pizero_photo]
        path = /mnt/hdd/share/pizero
        writable = yes
        guest ok = yes
        guest only = yes
        create mode = 0777
        directory mode = 0777

を追記し保存

sudo service smbd restart

で設定反映

外付けHDDは過去に

mkdir /mnt/hdd/share/pizero
 sudo chmod -R 777 /mnt/hdd/share/

でディレクトリを作成していたので今回は省略

ここまでできたら

sudo mount -t cifs //192.168.1.6/pizero_photo /mnt/nas -o username=pi,password=raspberry,iocharset=utf8

でマウント

df -h

でNASの容量が表示されれば成功

ファイルシス               サイズ  使用  残り 使用% マウント位置
/dev/root                    5.7G  4.5G  903M   84% /
devtmpfs                     181M     0  181M    0% /dev
tmpfs                        186M     0  186M    0% /dev/shm
tmpfs                        186M  2.8M  183M    2% /run
tmpfs                        5.0M  4.0K  5.0M    1% /run/lock
tmpfs                        186M     0  186M    0% /sys/fs/cgroup
/dev/mmcblk0p6                68M   23M   46M   33% /boot
tmpfs                         37M     0   37M    0% /run/user/1000
/dev/mmcblk0p5                30M  398K   28M    2% /media/pi/SETTINGS1
//192.168.1.6/pizero_photo   916G   47G  870G    6% /mnt/nas

というかんじ

次にOS起動したら自動的にNASをマウントするように
/etc/fstab にマウントに必要な情報を記述

sudo nano /etc/fstab

でファイルをひらき
最終行を

//192.168.1.6/pizero_photo /mnt/nas cifs username=pi,password=raspberry,file_mode=0755,dir_mode=0755,iocharset=utf8,uid=1000,gid=1000,forceuid,forcegid,_netdev 0 0

を追記

次にOS起動後にNASが自動マウントするように
ブートオプションを変更
これはネットワークサービスが
起動してからブートしないとNASのマウントが失敗するから

 sudo raspi-config 

で設定画面を開き

3の
Boot Options を選びSelect にしてEnter

次に
B2 Wait for Network at Boot Choose whether to waito for n
で Select にして Enter

次に
Would you like boot to wait until a network connection is established?
となっているので
はい
にしてEnter

Waiting for network on boot is enabled
となるので
了解で Enter

あとは Finish で Enter することで設定画面を抜けます

設定確認のため

sudo reboot

で再起動して

df -h

でNASがマウントされていれば成功

次に音声つき動画の保存場所の指定

ffmpegで出力先の指定は出来なのでしょうか。

を参考に ffmpeg の出力先をNASに指定し実行

timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:1,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy /mnt/nas/test.mkv

とすればNASへ保存される

今後の予定では
bluetooth シャッターボタンで撮影できるようにする予定

ラズパイ3へNAS 構築

ラズパイ3へNAS 構築

以前構築したものが壊れたので再度NASの構築

以前ダウンロードしておいた
NOOBSを使いインストールメディアの作成

microSD を差し込み

unzip NOOBS_lite_v3_3.zip -d /media/snowpool/0403-0201/

で解凍

インストールは通常版をインストール

インストール終了後
ssh の有効化

sudo raspi-config

で設定画面をだす

5 Interfacing Options を選択

P2 SSH を選択

はい を選択

設定が終わったら
Finish で設定画面を抜ける

これでSSHは有効化されるので
続いて公開鍵認証にする

Ubuntu で ssh-keygenコマンドで作成

-t で暗号形式を rsa
-b で4096ビットに指定
なおデフォルトでは2048ビット

ssh-keygen -t rsa -b 4096

で作成

Enter file in which to save the key (/home/snowpool/.ssh/id_rsa): 

となったらファイル名を入力

今回は nas
としておく

パスフレーズは省略するので

Enter passphrase (empty for no passphrase): 

Enter same passphrase again: 


Enter にすればパスフレーズなしとなる

次に公開鍵の登録

これは
ssh-copy-id コマンドを使う

なお接続するラズパイ3のIPは
Android ならFing で調べることが可能

ssh-copy-id -i nas.pub pi@192.168.1.6

で登録

カレントディレクトリに鍵ファイルなどが生成されるので

mv nas* .ssh/

でファイル移動

ssh -i .ssh/nas pi@192.168.1.6

で接続

次に vim の設定

vim-tiny がインストールされているので

sudo apt-get --purge remove vim-common vim-tiny

でアンインストール

[shel]
sudo apt-get install vim
[/shell]
で通常版 vim をインストール

設定ファイルをつくるので

vim .vimrc

でファイルを作成

"クリップボードからのコピペを可能にする
set clipboard+=unnamed
" シンタックスハイライトの有効化
syntax enable
" 不可視文字を可視化(タブが「▸-」と表示される)
set list listchars=tab:\▸\-
" コマンドラインの補完
set wildmode=list:longest

を記述し保存

なお sudo 権限で vim を使うと設定が反映されていないので

sudo ln -s ~/.vimrc /root/.vimrc

でシンボリックリンクにしておく

鍵認証でログインできるようになったので
パスワード認証による SSHログインを無効化しておく

sudo vim /etc/ssh/sshd_config 

で設定ファイルをひらき

56行目の

#PasswordAuthentication yes

PasswordAuthentication no

にしておく

次に
外付けHDDを再起動時に自動マウントする設定

外付けHDDはすでに過去にext4 でフォーマットしたものを利用
ラズパイ4でRAID1 NASを構築した

によれば
直接ファイルシステムでやり取りしないため
フォーマットは exFAT でなくてもOKとのこと

 fdisk -l

を実行し

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: External HDD    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc675b7b1

Device     Boot Start        End    Sectors   Size Id Type
/dev/sda1          63 1953520064 1953520002 931.5G 83 Linux

となっているので認識はしているのを確認

UUIDを確認するので

sudo blkid /dev/sda1

を実行

今回の結果は

/dev/sda1: LABEL="outhdd" /dev/sda1: UUID="96cc41c9-808c-4851-83f5-53bdfa487787" TYPE="ext4" PARTUUID="c675b7b1-01"

外付けHDDのマウント先を作成し
マウント

sudo umount -f /media/pi/96cc41c9-808c-4851-83f5-53bdfa487787 /
sudo mkdir /mnt/hdd
sudo mount /dev/sda1 /mnt/hdd/

これを元に fstab の最終行へ書き込む

sudo vim  /etc/fstab 

でファイルを開き

UUID="96cc41c9-808c-4851-83f5-53bdfa487787"     /mnt/hdd       ext4    defaults 0 0

を追記

fstab については
fstab
https://wiki.archlinux.jp/index.php/Fstab
を参考に

あとは設定反映のため再起動するので

sudo reboot

を実行

これで

 df 

を実行し
マウントされていればOK

今回だと

ファイルシス   1K-ブロック    使用    使用可 使用% マウント位置
/dev/root         29542476 3659976  24358788   14% /
devtmpfs            440756       0    440756    0% /dev
tmpfs               474036       0    474036    0% /dev/shm
tmpfs               474036   18272    455764    4% /run
tmpfs                 5120       4      5116    1% /run/lock
tmpfs               474036       0    474036    0% /sys/fs/cgroup
/dev/mmcblk0p6      258094   54603    203491   22% /boot
/dev/sda1        960379088   95880 911428824    1% /mnt/hdd
tmpfs                94804       0     94804    0% /run/user/1000

というかんじ

次にSamba のインストール

sudo apt-get -y install samba

途中でWINS設定の有無が聞かれるけどいいえでOK

次に設定ファイルの編集

sudo vim /etc/samba/smb.conf 

で設定ファイルを開き
25行目あたりに

dos charset = CP932
unix charset = UTF-8
guest account = pi

を追加

dos charset = cp932
はwindows 側の文字コード

なお、vim の場合 ctrl + shift + v で貼り付けが可能
shift + g で最終行に移動し

[ファミリー]
        path = /mnt/hdd/share/family
        writable = yes
        guest ok = yes
        guest only = yes
        create mode = 0777
        directory mode = 0777

として保存

sambaの設定に関しては
SAMBAの設定(3.0  FC3)(Windowsから利用する場合) 
http://s135.moo.jp/linux/samba.html
を参考に

これで

service smbd restart

でSamba の再起動をすることでファイル共有が可能に

Ubuntu 16.04 の場合
エクスプローラで
ネットワークをクリックすると
RASPBERRYPI
と表示されるので
これを
クリックして今回設定したフォルダをクリックすると
ユーザ認証になるので
ユーザ名 pi
パスワード ラズパイ3のパスワード
とすることでログインしてファイル共有することが可能に

Macの場合 Finder からネットワークをクリックすれば
ファイル共有が可能

ラズパイzero で音声つき動画撮影

ラズパイzero で音声つき動画撮影
Raspberry Piで音声付き動画を撮影する

Raspberry PIとffmpegとWebカメラ、USBマイクを利用して動画を取得

を参考に実践

raspivid コマンド
motion コマンド
ともに実行しても音声は入っていないため

カメラから画像を取得
マイクから音声を取得

これらをエンコードして保存
という流れになる

MKV もしくは MP4 で保存しているが
違いについては
【5分で分かる】mkvとmp4の違いは?変換する方法は?

に載っている

高品質なら mkv
いろいろなデバイスで再生させたいなら mp4
というかんじ

参考サイトをみながらコマンドのオプションを調べてみた

raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 | \
   arecord -D hw:1,0 -f S16_LE -r 16000 -d 0 test.wav;
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy test.mkv


撮影と録音を同時に行いそれぞれをファイルに保存して、後から結合する

raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \
   ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test.mkv


映像、音声を取得しながらエンコードする

これらは室内なので
raspividのawbオプションで光源の設定している

動画のエンコーディングにはffmpegを使用

20 November 2016 raspivid コマンド表


raspivid コマンドのオプションが載っているので
これを参考に
-t キャプチャする時間をミリ秒で指定

-t 0 なら0秒

-w で動画幅
デフォルトは 1920
-h 動画の高さ
デフォルトは 1080

-b ビットレート
10MBits/secは-b 10000000

-fps は記録するフレーム数
今回は30

-awb でAWBモードを設定
fluorescent で蛍光

-o - で出力ファイル名
今回はパイプで指定

次にffmpeg のオプション
最新ffmpegのオプションまとめ †

を参考に

-y で確認なしでファイル上書き

-ac で音声チャンネル数を指定
今回は2

-f 指定したフォーマットで出力

-i 入力ファイルのパス
-i plughw:1 でマイクを指定

-r でフレームレートの指定

フレームレートは動画の滑らかさの設定
フレームレート(FPS)って何?どのくらいの値にすればいいの?

に詳細が載っている
動画の撮影なら30でOK

-vcodec
でコーデック指定
copy を指定すれば直接コピーになる
copy test.mkv
とすれば test.mkv となる

raspivid -t 10000 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \
   ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test.mkv

もうひとつは

ffmpeg -f alsa -thread_queue_size 8192 -i hw:2,0 \
  -f v4l2 -thread_queue_size 8192 -s 640x480 -i /dev/video0 \
  -c:v h264_omx -b:v 768k \  
  -c:a aac \
  output.mp4 

録画の終了はqキー

オプションは
-f で
ファイルフォーマット
マイクやカメラから取得するなら必須
今回はマイクが alsa ビデオが v412

-thread_queue_size データを読むときのキュー
高フレームレートの動画ストリームとかだと
処理が追い付かずに捨てられてしまうデータがあったりするのだが
キューサイズを大きくすると、それを防げる
今回は 8192

-s は動画サイズ
640×480 にしている

-i で入力デバイスの指定
今回はマイクとUSBカメラのパスを指定

-c でエンコードのコーデック指定
-c:v h264_omx
でビデオ v がビデオの意味
-c:a aac
でa がオーディオコーデック

-b:v 768k
でビデオのビットレート
大きくすれば画質がきれいになる

実行したときに終了時間の指定ができなかったので
timeout コマンドを使うことにした

このコマンドに関しては
timeout コマンド

を参考に

 timeout 15 raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 |    arecord -D hw:1,0 -f S16_LE -r 44100 -d 0 test.wav;ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy test.mkv

というように
timeout コマンドを使うことで指定の時間で停止させることができる

ここまでできたら
あとは bluetooth などで撮影ボタンを作成する予定

ラズパイzero マイク設定

ラズパイzero マイク設定

以前、ラズパイzero で動画を撮影したが
音声がなかったので

ラズパイZeroWで作る簡単アクションカメラ——バイク編

Raspberry Pi Zeroで簡易ドライブレコーダーを自作する

を参考に設定

micro USB 変換アダプターを使うことで
ラズパイzero でも usb マイクを使用することが可能に

今回は

を使用

まずUSBマイクが認識されているか確認

lsusb

結果は

Bus 001 Device 002: ID 8086:0808 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

次にモジュール確認

cat /proc/asound/modules 

結果は

 0 snd_bcm2835
 1 snd_usb_audio

次にサウンドカードを調べる

arecord -l

結果は

**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0

ここまでできたら録音テスト

arecord -D plughw:1,0 ~/test1.wav

これで
test1.wav という音声ファイルができるので
これを scp コマンドで転送

しかし再生してみるとノイズがおおく音量が小さい

マイクの集音量と感度の調整 ラズパイ
で検索し
raspberry Pi3(ラズパイ)でマイクを使う

を参考に

[^shell]
amixer sget Mic
[/shell]
としたが

amixer: Unable to find simple control 'Mic',0

となってしまう

このため
amixer コマンドを調べる

Linux の Audio 機能をコマンドラインで設定

によれば

amixer -c1

でサウンドカード1の情報がみれる

結果は

Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 0 [0%] [0.00dB] [on]
Simple mixer control 'Auto Gain Control',0
  Capabilities: pswitch pswitch-joined
  Playback channels: Mono
  Mono: Playback [on]

また
Linuxでマイクの音量が小さいときに、それを上げる方法

amixer -D hw:1

でも同じ結果がでる

Mono: Capture 0 [0%] [0.00dB] [on]

となっているので
これだとマイクボリュームが0

これを100%にする

amixer -D hw:1 sset Mic 100%

を実行すると

Simple mixer control 'Mic',0
  Capabilities: cvolume cvolume-joined cswitch cswitch-joined
  Capture channels: Mono
  Limits: Capture 0 - 16
  Mono: Capture 16 [100%] [23.81dB] [on]

これで録音の音は改良されたけど
ノイズがまだ残っている

原因は録音したときのレートの Hz の数値

arecord -D plughw:1,0 ~/test3.wav

を実行すると

録音中 WAVE '/home/pi/test3.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
^Cシグナル 割り込み で中断...

となり 8000Hz となる

arecord -Vmono -D hw:1 -f S16_LE -c1 -r48000 test4.wav

とすると

録音中 WAVE 'test4.wav' : Signed 16 bit Little Endian, レート 48000 Hz, モノラル

となり
48000Hz になる

これだと少しトトトトトと音が入っている

Raspberry Pi3で音声録音

を参考に

arecord -D plughw:1,0 -f cd  mic.wav

を実行すると

録音中 WAVE 'mic.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ

となり
44100 Hz となる

-f cd の設定で 44100Hz となる

acreclrd コマンドのオプションについては

8.1. ALSAによるサウンド機能の実現

を参考に

aplay と arecord のオプションは同じとのこと

arecord -D plughw:1,0 -f cd  mic.wav

を実行したときが一番聴きやすいかんじ

しかしノイズのような音は残るので
あとはマイクの性能によるのかもしれない

LINE Messasging API でメッセージ送信

LINE Messasging API

LINE Messasging APIでメッセージ送信を試してみた

を参考に実践

なお後で調べたら
Messaging APIを始めよう

にドキュメントによれば
QRコードでのログインもできるらしい

まずスマホの LINEアプリで
メルアドとパスワードを設定

ログイン許可にチェックを入れる

https://developers.line.biz/console/
へアクセスしログイン

ユーザ名
メールアドレスを設定

I have read and agreed to the
LINE Developers Agreement
(規約に同意します)
にチェックをいれ

Create my account をクリック

これでアカウントの作成ができるので

次にプロバイダーの作成

下へスクロールし
Create a new provider をクリック

任意の名前を入力
ただしすでに他の人が使っていないものであること

Create をクリック

次にチャンネルの作成

使用するのは
Messaging API なので

Create a Messaging API channel
をクリック

Channel type

Provider
については
デフォルトのままでOK

Channel name には任意のチャンネル名

Channel description には
チャンネルの説明

Category には業種

Subcategory には業種の詳しいカテゴリ

Email address にはメルアド

I have read and agree to the LINE Official Account Terms of Use
LINE公式アカウント利用規約 の内容に同意します

I have read and agree to the LINE Official Account API Terms of Use
LINE公式アカウントAPI利用規約 の内容に同意します

にチェックをいれて

Create をクリック

これでチャンネルが作成されるので

Messaging API をクリックし
QRコードで自分のLINEアプリで友達登録しておく

次にメッセージ送信のテスト

アクセストークンが必要なので
Channel access token(long-lived) の
issue をクリック

これでアクセストークンが発行される

アクセストークンの種類については
チャネルアクセストークン

の公式ドキュメントを参考に

次にIDの確認
これは自分のIDを使うので
Basic settings タブをクリック

Your user ID の部分を確認

ここまでできたら
curl コマンドでメッセージ送信

curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer { アクセストークン }' \
-d '{
    "to": "ユーザID",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world"
        }
    ]
}'

これを実行すると

LINEアプリに
hello world
と書かれたメッセージが届く

なおデフォルトでは自動応答メッセージがあり
これを無効にするには
Messaging API をクリック

Auto-reply messages の Edit をクリック

応答メッセージをオフに設定

これで自動応答メッセージがでなくなる

今後の課題としては
LINEトークルームを作成
Google Assistant SDK をラズパイに入れる
google-home-notifier 設定
とやっていけば

【ベビテクDIY】LINEやスマートスピーカーでらくらく家事育児効率化 その2

のように
LINEのやり取りを音声のみでできるいう予定