ubuntu へ tor コマンドをいれる

ubuntu へ tor コマンドをいれる

tor コマンド ubuntu 16.04
で検索し

Ubuntu Server 16.04 LTS/CentOS 7にtorをインストールしてtor経由でcurlやwgetを使用する

を参考にインストール

sudo apt install tor

でインストール

次に
python から tor のSOCKSポートにアクセスするため
pysocks ライブラリーのインストール

pip3 install pysocks

次に
Squid プロキシ経由アクセスのように
ローカルの tor の SOCKS ポートをプロキシ接続するようにする

vim proxy.py

でファイル作成

import requests

proxy = {
        "http":"socks5://127.0.0.1:9050",
        "https":"socks5://127.0.0.1:9050"
        }

url = "http://httpbin.org/ip"

ip=requests.get(url).text
tor_ip=requests.get(url,proxies=proxy).text

print("current IP is " + ip)
print("tor IP is "+tor_ip)

これで

python  proxy.py

を実行すると
グローバルIP
tor を使ったときのIP
が表示される

Torを用いたスクレイピング [Python]

によれば
tor はプロキシとして
socks5://localhost:9050
を使っているとのこと

git reset 取り消し

git reset 取り消し

間違えて

git reset --hard 

したときの対処

いざという時のためのgit reflog

にあるように

git reflog 
[/shell:で過去のあらゆるコミット履歴をみれる

72e7d9c (HEAD -> master) HEAD@{0}: reset: moving to 72e7
861751a HEAD@{1}: commit: ver3
91c72a0 HEAD@{2}: commit: ver2(
72e7d9c (HEAD -> master) HEAD@{3}: commit (initial): ver1

なお、ubuntu で

git commit

を実行すると
vim ではなく nano エディタが起動

Mac へ FlashPrint のインストール

Mac へ FlashPrint のインストール

Fusion 360 は ubuntu が対応していないため
MacBook Air でデータを作ることに

まずは FlashPrint をその前にインストール

これがないと STL データを作成しても
Adventurer3 でプリントできない

https://flashforge.co.jp/support/
へアクセスして
MacOS をクリック

これでダウンロードされるので
ファイルをダブルクリック

解凍されるので
FlashPrint.pkg をダブルクリック
しても開発元が未確認のため開けられないので

画面左上のApple のアイコンをクリックし
システム環境設定


セキュリティーとプライバシーを開き
鍵アイコンをクリックし
管理者パスワードを入力

これでそのまま開くをクリックすると
インストール画面になる

Ubuntu にFlashprintインストール

Ubuntu にFlashprintインストール

STLデータをダウンロードしても
Flashprintを使ってデータを変換しないとプリントができない

詳しくは
FLASHFORGEのAdventurer3実機レビュー!家庭用3Dプリンタ3台目で大当たり!

を参考に

私の使うOSは Mac と Ubuntu なので
まずは ubuntu から Flashprint をインストール

インストールについては
Jetson nanoのケースを3Dプリントする(Ubuntu 18.04)

を参考に

しかし、日本のページに移動すると
3.13.0 移行のLinux 対応バージョンがない

このため検索してみたら
https://www.flashforge.com/download-center
から最新版の 4,5,1 がダウンロード可能

ダウンロードしたら

sudo dpkg -i 361aa4e2603599ff099e83c8c95f2426.deb 

を実行したが依存性の問題がでたので

sudo apt-get install libudev-dev libftdi-dev libftdi1-dev

で足りないものをインストールし
再度

sudo dpkg -i 361aa4e2603599ff099e83c8c95f2426.deb 

を実行しインストール

あとは
FlashPrint を起動

次にデータのダウンロード

3Dプリンタで作れる便利グッズ12選

を参考に

Phone holder Phone stand

から
Download All Files をクリック

圧縮ファイルになっているのでこれを展開

次に Flash Print で
ctrl + o でファイルをロード

しかし文字だけのデザインなので

https://www.thingiverse.com/thing:2120591
からダウンロード

ファイルがロードできたら

スライスをクリック
これで
stl ファイルから gx ファイルに変換される

Gコードを送信

これで3Dプリントが開始される
今回必要な時間は4時間半ほどだったが
結果は残念ながらプリント失敗となった

作成するときに積層型となっているので
カーブしている部分がうまくできない

この場合、
STLファイルを再度読み込み
回転させることで印刷する状態を変えればよい

回転のやり方については
3DプリンターDreamerプリンティングについて

を参考に

回転をダブルクリックし
横向きに角度を変えてからプリントすることで
失敗リスクを減らすことができる

スマホ写真の位置情報の削除

スマホ写真の位置情報の削除

Google の容量確保のため
google photo から写真を一括ダウンロード

Googleフォトで家族写真を一括してパソコンに保存ダウンロードする方法と注意点

にあるように
アルバムを作成することにより一括でのダウンロードが可能になる

スマホで撮影した画像は
ほぼ位置情報が入っている

ブログなどで掲載するときに身バレしたくないのなら
Exif 削除が必要

EXIF 情報を一括削除する方法など – jhead の使い方

にあるように
jhead をインストールし削除する

sudo apt-get install jhead


ubuntu にインストール

ダウンロードした google photo の写真は
zip になっているので
これを展開

あとは

jhead -purejpg *.jpg

でExif を一括削除

またスマホ写真の場合
パソコンで開くと横向きになっているので
GIMPの使い方【初めての画像編集】~画像の回転方法~

にあるように
Gimp で回転させて向きを整えておく

Exif の削除されているかを調べるには
第553回 Ubuntuで写真のメタデータを扱う方法

にあるように

identify コマンドを使うと調べることができる

identify -format "%[exif:Make]\n%[exif:GPS*]\n" DSC_1080.jpg 

というようにファイル名を指定し
何も出てこないのなら削除成功

3DプリンターAdventurer3 の初期設定

3DプリンターAdventurer3 の初期設定

ラズパイケースの作成、子供のお名前スタンプなど
いろいろと作成できそうなので
3Dプリンターを購入

なお3Dプリンターにはいろいろと種類などがあり
大きく分けて
組み立てタイプ
完成品
があり
私の場合は最初の購入なので
完成品を選択

そして造形方式として
熱溶解積層方式
光造形方式
粉末焼結方式
インクジェット方式
粉末固着方式
とあるけど

とりあえず
熱溶解積層方式
ができるものを選択

あとは対応データがいろいろあるけど
STLが対応しているものを選択

そして
対応OSとして
Mac と Linux 対応であるもの
ということで調べた結果

FLASHFORGE

Adventurer3 を購入することに

Adventurer3 は Amazon では取り扱いがないので
https://flashforge.co.jp/adventurer3/
から購入

同社の製品で
3X
S
Lite
と違うバージョンもあったけど
3X でステンレス加工には別途サービス料がかかるし

Sでは
フラッシュメモリや
フィルターなどもつくみたいだけど
フィルターは別途購入すればいいので
こちらは保留
なおこちらのほうが5千円高い

Lite にすると
遠隔カメラ、フィラメント検出センサーがついていません
ただし5千円安くなります

製品が届いたら初期設定

しかし、初期設定マニュアルがいろいろと不備があるので3D printer 買いました!Adventurer3 開封から初期設定、プリントまで写真解説!

を参考にセットアップ

マニュアルだと紙箱の取り出し方がなく
キャリブレーションとフィラメント押出の順序が逆になっていました

adventure3Tools] -> [Setting] ->
[Language] -> [の] 
で日本語設定

最初に紙箱が取り出せないので

すでに日本語設定しているので
ツール > 設定 > 移動
で位置を調整して紙箱取り出し

これで紙箱の取り出しが可能に

次に
キャリブレーション

ツール > 設定 > 校正

あとは
ヘッドが下がってきたらコピー用紙2枚重ねを挟んで
抵抗が少しだけあるが紙は簡単に動くくらいに調整

次にフィラメントの設置

樹脂交換 > 押し出し

でフィラメントがでてくるまで行う

最後に作成

プリント本体内部メモリの6.62GB >
20mm_Box-PLA.gx >
真ん中の印刷アイコンをクリック

これで12分ほどで作成される

ラズパイ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時間おきに実行する方法

を参考に