作業日記@HatenaBlog

各種の作業メモ

exiftool.exeで写真ファイルを一括リネーム

事前準備

  • ExifTool公式サイトへアクセスする
    https://exiftool.org/

  • 64bit版をダウンロードする
    exiftool-xx.xx_64.zip
  • デスクトップ上でzipファイルを展開する
    exiftool-xx.xx_64
    1. exiftool_files フォルダ
    2. exiftool(-k).exe プログラム本体
    3. README.txt 説明書
  • 上記 1. ~ 3. を C:\Program Files\ExifTool へコピーする
  • C:\Windows\System32\ 内に exiftool.bat を作成する
@echo off
"c:\Program Files\ExifTool\exiftool(-k).exe" %*
> exiftool -h


一括リネーム

  • 特定フォルダ(カレントディレクトリ)にデジカメ画像を保存する
    ファイル名の例
    • P1160993.JPG
    • P1160994.JPG
    • P1160995.JPG
  • コマンドプロンプトを開き、特定フォルダへ移動する
  • 次のコマンドを実行する
> exiftool -d "%Y-%m-%d_%H-%M-%S_%%f.jpg" "-filename<datetimeoriginal" -o hogehoge/ *.jpg
  • 特定フォルダ内に hogehoge フォルダが新規作成され、リネーム後のファイルが一括保存される
    変換例(hogehogeフォルダ内)
    • 2024-09-15_21-10-15_P1160993.jpg
    • 2024-09-15_21-11-56_P1160994.jpg
    • 2024-09-15_21-17-03_P1160995.jpg
  • PowerShell の場合は特定フォルダ内で次のコマンドを実行する
    (ダブルクォーテーションをエスケープしている)
> exiftool -d `"%Y-%m-%d_%H-%M-%S_%%f.jpg`" `"-filename<datetimeoriginal`" -o hogehoge/ *.jpg
  • 変換後のファイルは拡張子が強制的に小文字 jpg となる

複数の WxBeacon2 と連携する

概要

  • 複数の WxBeacon2 を起動する
  • env2ambientBS.py は各機のデータを全て拾って一つの ambient チャネルへ登録するためデータが混乱する
  • 各機のユニークな Bluetooth Device Address で ambient のチャネルごとにデータを割り振る
  • env2ambientBS.py のスクリプトを以下のとおり改造する

WxBeacon2 のデバイスアドレス

LE スキャンをする。

$ sudo hcitool lescan
LE Scan ...
XX:XX:XX:XX:XX:XX (unknown)
YY:YY:YY:YY:YY:YY (unknown)
ZZ:ZZ:ZZ:ZZ:ZZ:ZZ (unknown)
AA:BB:CC:DD:EE:FF IM
QQ:QQ:QQ:QQ:QQ:QQ (unknown)
GG:HH:II:JJ:KK:LL IM
...

WxBeacon2 の Bluetooth Device Address を各機ごとにメモする。
ここでは AA:BB:CC:DD:EE:FF および GG:HH:II:JJ:KK:LL が該当する。

ソースコードを改造する

参考サイトにあった env2ambientBS.py のソースコードを改造する。(GitHub
diff は次のとおり。

17,18c17,18
< channelID = 100
< writeKey = 'writeKey'
---
> channelID = xxxxx
> writeKey = 'xxxxxxxxxxxxxxxx'
20a21,23
> BDAddr = 'XX:XX:XX:XX:XX:XX'
> BDAddr = BDAddr.lower()
>
52c55
<     if companyID == 'ffff':
---
>     if devs[target]['companyID'] == 'ffff':
77c80,81
<                             send2ambient(value[6:])
---
>                             if dev.addr == BDAddr:
>                                 send2ambient(value[6:])

上記でメモしたデバイスアドレスは全て大文字で記入する。.lower()で自動的に変換させる。
改造後は WxBeacon2とラズパイを連携させる - 作業日記@HatenaBlog と設定は同じ。
WxBeacon2 の数だけスクリプトを用意して実行する。

WxBeacon2とラズパイを連携させる

WxBeacon2 の入手

直販サイトから入手した。
WxBeacon2 は OMRON の環境センサ 2JCIE-BLOEM 品らしい。
ユーザーズマニュアル(PDF)

Ambient へ登録

Ambient へユーザ登録(無償)をする。
新規チャネルを 1 つ作成しておくこと。

Raspberry Pi 3 の設定

参考サイトを元に各種設定をする。
なお、Raspberry Pi 3 の初期設定は完了しているものとする。

$ sudo apt-get update
$ sudo apt-get upgrade

pyenv を導入

当方環境では python 2,3 が共存している。
2 系、3 系を同時設定が可能な pyenv を導入する。(参考サイト
必要なパッケージのインストール、git から pyenv をクローンする。
なお、sudo のパスが通らないときは ここ を参照し /etc/sudoers の記述を変更する。

$ sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

.bash_profile に設定を追加。

$ sudo vi ~/.bash_profile

# 以下の内容を追記
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

. "$HOME/.bashrc"

設定を反映。
.bash_profile があると .bashrc が読み込まれないので注意。(参考サイト)

$ source ~/.bash_profile

インストール可能な python パッケージを確認。

$ pyenv install --list
...
...
3.6.4
3.6.5
3.6.6
...
...

python 2系、3系を共存させる。
python 2 のバージョン確認。

$ python -V
Python 2.7.13

pyenv で 2系、3系をともにインストールする。
本件の参考サイトで使用していた 3.6.5 をインストールする。

$ pyenv install 2.7.13
$ pyenv install 3.6.5

同時使用できるようにする。

$ pyenv global 2.7.13 3.6.5
$ pyenv version
2.7.13 (set by /home/pi/.pyenv/version)
3.6.5 (set by /home/pi/.pyenv/version)
$ python -V
Python 2.7.13
$ python3 -V
Python 3.6.5

pip を最新版にする。

$ pip3 install --upgrade pip

Python BLE ライブラリを導入

$ sudo apt-get install libglib2.0-dev
$ pip3 install bluepy

BLE ライブラリが import できない場合は、次を実行する。
bluepy 公式サイトから最新のソースコードを DL する。

$ cd /tmp
$ wget https://files.pythonhosted.org/packages/27/91/6cfca10bee9862f93015413cf9e6a52c3081a71f1518963396a055128f8e/bluepy-1.3.0.tar.gz
$ tar xvzf bluepy-1.3.0.tar.gz
$ cd bluepy-1.3.0
$ sudo python3 setup.py build
$ sudo python3 setup.py install

Ambient のライブラリを導入

$ sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git

Raspberry Pi 3 の Bluetooth バージョン確認

$ bluetoothd -v
5.43

WxBeacon2 の設定

WxBeacon2 に電池を入れて hcitool で BLE をスキャンする。
末尾が Env のものが WxBeacon2 である。

$ sudo hcitool lescan
LE Scan ...
...
XX:XX:XX:XX:XX:XX (unknown)
AA:BB:CC:DD:EE:FF Env

スキャンした WxBeacon2 に接続してサービスを調べる。
connect コマンドがエラーになる場合は何回かリトライする。

$ gatttool -b AA:BB:CC:DD:EE:FF -t random -I
[AA:BB:CC:DD:EE:FF][LE]> connect
Attempting to connect to AA:BB:CC:DD:EE:FF
Connection successful
[AA:BB:CC:DD:EE:FF][LE]> primary
attr handle: 0x0001, end grp handle: 0x0007 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0008, end grp handle: 0x000b uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x000c, end grp handle: 0x0016 uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x0017, end grp handle: 0x0025 uuid: 0c4c3000-7700-46f4-aa96-d5e974e32a54
attr handle: 0x0026, end grp handle: 0x003a uuid: 0c4c3010-7700-46f4-aa96-d5e974e32a54
attr handle: 0x003b, end grp handle: 0x0043 uuid: 0c4c3030-7700-46f4-aa96-d5e974e32a54
attr handle: 0x0044, end grp handle: 0xffff uuid: 0c4c3040-7700-46f4-aa96-d5e974e32a54
[AA:BB:CC:DD:EE:FF][LE]> exit
$

WxBeacon2 をブロードキャストモードにする

設定はスマホアプリ BLE Scanner で行う。

詳細は 参考サイト のプログラム2(ブロードキャストモード) の項目を参照。

データ取得プログラム

計測データを取得する Python ソースコードを DL する。
Githubソースコードを使用する。

$ cd ~
$ mkdir WxBeacon2
$ cd WxBeacon2
wget https://raw.githubusercontent.com/AmbientDataInc/EnvSensorBleGw/master/src/gw_RPi/env2ambientBS.py

ソースコードの修正

Ambient で 新規チャネル を作成しておく。
チャネルID と ライトキー を使う。

$ vi env2ambientBS.py

(17行目)
channelID = 100
↓
channelID = xxxxx

(18行目)
writeKey = 'writeKey'
↓
writeKey = 'xxxxxxxxxxxxxxxx'

(52行目)
if companyID == 'ffff':
↓
if devs[target]['companyID'] == 'ffff':

プログラムの起動

ヘルプを表示する。

$ sudo python3 env2ambientBS.py -h
usage: env2ambientBS.py [-h] [-d] [-o] [-b] [-bb]

optional arguments:
  -h, --help  show this help message and exit
  -d          debug msg on
  -o          device is omron env sensor
  -b          device is BBC micro:bit
  -bb         device is BBC micro:bit + BME280

今回は WxBeacon2(オムロン環境センサ)を使用するので -o オプションを付ける。
ret = 200 は ambient からの書き込み成功を意味する。

$ sudo python3 env2ambientBS.py -o
omron
23.62 47.29 0 0.02 1011.0 33.18 2.97
sent to Ambient (ret = 200)
BTLE Exception while scannning.
23.59 47.29 0 0.01 1011.0 32.77 2.97
sent to Ambient (ret = 200)
23.54 47.33 0 0.02 1011.0 32.77 2.97
sent to Ambient (ret = 200)
23.5 47.36 0 0.02 1011.0 33.57 2.97
sent to Ambient (ret = 200)

バックグラウンドで動作させる。
ログは一切出力しない。 参考サイト

$ sudo nohup python3 env2ambientBS.py -o > /dev/null 2>&1 &

自動起動

起動スクリプトを書いて、ラズパイ起動時に自動起動させる。

$ cd /usr/local/bin/
$ sudo touch WxBeacon2_autostart.sh
$ sudo vi WxBeacon2_autostart.sh
#!/bin/sh
/usr/bin/sudo /usr/bin/nohup /home/pi/.pyenv/shims/python3 env2ambientBS.py -o > /dev/null 2>&1 &

$ chmod a+x WxBeacon2_autostart.sh

スクリプトを rc.local に登録する。

$ sudo vi /etc/rc.local

exit 0 の手前に以下の行を追加
WxBeacon2_autostart.sh

出力ログ

上記実行時のログについて。
env2ambientBS.py の 58 行目 MSG より。

MSG(temp / 100, humid / 100, light, uv / 100, press / 10, noise / 100, (batt + 100) / 100)

23.62 47.29 0 0.02 1011.0 33.18 2.97
温度 相対湿度 環境光 UV指数 気圧 騒音 バッテリ電圧
degC %RH lux hPa dB V
23.62 47.29 0 0.02 1011.0 33.18 2.97

ambient への書き出し

env2ambientBS.py の 59 行目 sendWithRetry より。
以下の順序で ambient へ送っている。

sendWithRetry({'d1': temp / 100, 'd2': humid / 100, 'd3': press / 10, 'd4': (batt + 100) / 100, 'd5': light, 'd6': noise / 100})
温度 相対湿度 気圧 バッテリ電圧 環境光 騒音
d1 d2 d3 d4 d5 d6

ambient のグラフ編集

上記 d1 ~ d6 のデータ項目を元に、見やすいようにグラフを編集する。
UI が優れているので慣れれば任意にデザイン可能。

ファイルリスト生成マクロ(エクセル)

概要

選択したフォルダ以下のファイル、フォルダ全てをカレントシートに記載するエクセルマクロ。

'
' このマクロを使用する時は、メニューから ツール(T)→ 参照設定(T)... を選び
' Microsoft Scripting Runtime を有効にすること
'

' 変数宣言を強制
Option Explicit

' フルパス中で選択フォルダ名が何文字目か
Dim myCurrentFolderSeparatePoint As Long

'
' ファイルリスト生成マクロ
' Date 17th Apr., 2019
' Programmed by Takeshi Sasaki
'

'
' 関数呼び出し
'
Sub myCall()
    
    ' 選択フォルダのフルパス
    Dim Path As String
    
    ' 画面更新の停止(マクロ高速化)
    Application.ScreenUpdating = False
    
    ' フォルダ選択ダイアログ
    With Application.FileDialog(msoFileDialogFolderPicker)
        
        If .Show = True Then
            
            ' フォルダ選択 → OK押下(True)
            Path = .SelectedItems(1)
        
        Else
            
            ' Cancel押下(False)
            Exit Sub
        
        End If
    
    End With
    
    ' ファイルリスト生成準備関数を呼び出し
    Call setFileList(Path)

End Sub


'
' ファイルリスト生成準備関数
'
Sub setFileList(searchPath)
    ' 変数宣言
    Dim startCell As Range
    Dim maxRow As Long
    Dim maxCol As Long
    
    ' searchPath の中から選択フォルダ名の直前の \ は何文字目か
    ' Ex. C:\hoge\fuga\foo ← 選択フォルダ foo のフルパス(searchPath)
    '     123456789+123456 ← bar 直前の \ は 13文字目
    myCurrentFolderSeparatePoint = InStrRev(searchPath, "\")
    
    ' カレントシート上でリストのスタート位置を指定する
    Set startCell = Cells(2, 2)
    startCell.Select
    
    ' カレントシート上の文字を全て消す
    maxRow = startCell.SpecialCells(xlLastCell).Row     ' 最終行
    maxCol = startCell.SpecialCells(xlLastCell).Column  ' 最終列
    With Range(startCell, Cells(maxRow, maxCol))
        .ClearContents              ' セル内容をクリア
        .Interior.ColorIndex = 0    ' 背景色を透明
    End With
    
    ' ファイルリスト生成関数を呼び出し
    Call getFileList(searchPath)
    
    ' リスト書き出し後にセルをスタート位置に戻す
    startCell.Select

End Sub


'
' ファイルリスト生成関数
'
Sub getFileList(searchPath)
    
    ' 引数 searchPath には選択フォルダのフルパスを代入
    
    ' File System Object を宣言
    Dim FSO As New FileSystemObject
    Dim objFiles As File
    Dim objFolders As Folder
    
    ' パスの文字列操作用テンポラリ
    Dim pathTemp As String
        
    ' パス中のセパレータ \ の数
    Dim separaterNum As Long
    
    ' 書き出しセルの横位置(Col)増分
    Dim incCol As Long
    
    
    ' サブフォルダがある時は自分自身を再帰呼出し
    For Each objFolders In FSO.GetFolder(searchPath).SubFolders
    
        Call getFileList(objFolders.Path)
    
    Next
    
    ' searchPath 内のファイル一覧を検索
    For Each objFiles In FSO.GetFolder(searchPath).Files
        
        ' objFiles → フルパス(文字列)
        
        ' 選択フォルダ以下のパス(文字列)
        ' ※forループ処理のため末尾に \ を意図的に追加している
        pathTemp = Right(objFiles, Len(objFiles) - myCurrentFolderSeparatePoint) & "\"
        
        ' pathTemp 中の \ の数
        separaterNum = Len(pathTemp) - Len(Replace(pathTemp, "\", "")) - 1
        
        ' フォルダ名、ファイル名を分割しながらセルに記入する
        For incCol = 0 To separaterNum
        
            ' pathTemp の左側から \ ごとに文字列を区切ってセルに記入
            ActiveCell.Offset(0, incCol).Value = Left(pathTemp, InStr(pathTemp, "\") - 1)
            
            ' ディレクトリ名のセルに着色する(ファイル名は無色)
            If incCol > 0 Then
                ActiveCell.Offset(0, incCol - 1).Interior.ColorIndex = 33 + incCol
            End If
            
            ' pathTemp の左端から \ までを削除して pathTemp に代入
            pathTemp = Right(pathTemp, Len(pathTemp) - InStr(pathTemp, "\"))
        
        Next incCol
        
        '次行のセルへ移動
        ActiveCell.Offset(1, 0).Select
        
    Next
    
End Sub

'
' EOF
'

Raspberry pi に tiarra を導入する

tiarra の導入

Raspberry pi サーバに irc proxy の tiarra を導入する。

tiarra をダウンロード・展開

$ wget http://www.clovery.jp/tiarra/archive/2010/02/tiarra-20100212.tar.gz
$ tar xvzf tiarra-20100212.tar.gz
$ mv tiarra-20100212 tiarra.d
$ cd tiarra.d

設定ファイルをコピー

$ cp -pv sample.conf tiarra.conf

tiarra.conf を編集

$ vi tiarra.conf

general ブロック

言及の無いものはデフォルト値のまま。

general {
  conf-encoding: jis
 
  nick: sillywalk7
  user: sillywalk7
  name: sillywalk7
 
  tiarra-port: 6667
 
  tiarra-password: XXXXXXXXXXXXX
 
  server-in-encoding: jis
  server-out-encoding: jis
 
  client-in-encoding: jis
  client-out-encoding: jis
 
  stdout-encoding: jis

networks ブロック

言及の無いものはデフォルト値のまま。

networks {
  name: ircnet
  #name: 2ch
  #name: freenode
  #name: ustream
}

各ネットワークの設定

上記 networks ブロックで定義した ricnet のみを定義する。
server はひとつだけ定義し、残りは全てコメントアウトする。
freenode など他のネットワーク設定がある場合は ircnet に準じて定義すること。
日本国内の irc サーバ情報は 情報提供サイト を参照のこと。

ircnet {
  server: 125.6.255.10 6660 6661 6662 6663 6664 6665 6666 6668 6669
 
  in-encoding: jis
  out-encoding: jis
}

tiarra パスワード生成

tiarra ログイン用のパスワードを生成する。

$ ./tiarra --make-password
...
Please enter raw password: ******** ←任意のパスワード

XXXXXXXXXXXXX  is your encoded password.
Use this for the general/tiarra-password entry.

生成された XXXXXXXXXXXXX を general ブロックの tiarra-password: に貼り付ける。

チャンネル自動 join

IRC クライアントから tiarra サーバ接続時に自動 join したいチャンネルを指定する。
カンマ区切りで複数指定可。

+ Channel::Join::Connect {
  channel: #hoge,#fuga,#foo,#bar
}

チャンネル名が日本語の場合

まず nkf を導入する。

$ sudo apt-get install nkf

tiarra.conf を Shift-jis 形式に変換する。
(念の為 tiarra.conf を tiarra.conf.orig にバックアップしておく。)

$ cp -pv tiarra.conf tiarra.conf.orig
$ nkf -s --overwrite tiarra.conf

vim文字コードを指定して編集する

参考サイト
Shift-jisで保存すると Raspberry Pivim 編集では文字化けするため tiarra.conf を開いた時は以下のコマンドを実行する。

:edit ++encoding=sjis
または
:e ++enc=sjis

Shift-jis でファイルを保存

:set fileencoding=sjis
または
:se fenc=sjis

現在のエンコードを確認する。
Vimエンコード

:set enc?

ファイルのエンコード

:se fenc?

自動起動

systemd に自動起動ファイルを記述する。
参考サイト

$ cd /etc/systemd/system/
$ sudo touch tiarra.service
$ sudo vi tiarra.service
[Unit]
Description=do something

[Service]
ExecStart=/usr/bin/perl /home/pi/tiarra.d/tiarra --config=/home/pi/tiarra.d/tiarra.conf

[Install]
WantedBy=multi-user.target

$ sudo systemctl enable tiarra.service
Created symlink /etc/systemd/system/multi-user.target.wants/tiarra.service → /etc/systemd/system/tiarra.service.

起動テスト

tiarra.service は再起動した際に有効となる。
再起動しないでテストしたい場合は以下のコマンドを使用する。

$ sudo systemctl start tiarra.service

自動応答 BOT を設定する

特定ワードに反応してランダム応答する設定をする。

自動応答テキストを用意する

例えば「おみくじ」を作るのであれば以下のようなテキストを用意する。
文字コードutf-8 とする。

$ cd /home/pi/tiarra.d/
$ touch hogehoge.txt
$ vi hogehoge.txt
大吉
中吉
小吉
吉
末吉
凶
大凶

Auto::Random モジュール

tiarra.conf を編集する時は文字コードutf-8 にする。
各種モジュールの設定は 公式サイト を参照のこと。

$ nkf -w --overwrite tiarra.conf
$ vi tiarra.conf

tiarra.conf に Auto::Random モジュールを追加する。

+ Auto::Random {

  blocks: hogehoge

  hogehoge {
    file: /home/pi/tiarra.d/hogehoge.txt
    file-encoding: utf-8
    request: ほげほげ
    count-query: ほげほげいくつ
    count-format: ほげほげは#(count)件登録されています。
    format: #(message)
    mask: * *!*@*
    added-format: #(name|nick.now)さんは ほげほげ に #(message) を追加しました。
    removed-format: #(name|nick.now)さんは ほげほげ から #(message) を削除しまし
た。
    rate: 100
    add: ほげほげ追加
    remove: ほげほげ削除
    modifier: * *@*
    plum: modifier: * *@*
  }
}

文字コードを shift-jis に戻す

$ nkf -s --overwrite tiarra.conf
$ vi tiarra.conf

Auto::Random モジュールを修正

初期状態では Auto::Random にエラーが生じるので LinedDB.pm の 18 行目を次のとおり修正する。

$ cd /home/pi/tiarra.d/module/Tools/
$ vi LinedDB.pm
foreach my $key qw(Parse Build Compare Update Hash) {
↓
foreach my $key (qw(Parse Build Compare Update Hash)) {

設定ファイルを再読込

IRC クライアントソフトから tiarra に向けて /load コマンドを送る。

Volumio2 @ Raspberry Pi Zero WH

用意するもの

SD カードフォーマット

Volumio 2 のインストール

最新バージョンの Volumio-2.526 は Raspberry Pi Zero 上で音が再生しない不具合あり。よって1つ前のバージョンを使用する。(2019/01/14現在)

  1. 予め Raspberry Pi Zero と pHAT DAC を組み立てておく
  2. HDMI ディスプレイ、 USB キーボード、スピーカーを接続する
  3. volumio-2.513 をダウンロードする
  4. Win32 Disk Imager を使って Volumio 2 のイメージを SD カードへ書き込む
  5. Raspberry Pi Zero 本体へ SD カードを挿入して電源オン
  6. 自動的に Volumio 2 のイメージ展開が実行される

Volumio 2 のセットアップ

設定には有線 LAN を使用せず全て無線 LAN で済ませる。

最初の無線 LAN 接続

  1. スマホから SSID が Volumio の無線LANに接続する
    接続パスワード: volumio2
  2. 自動的にブラウザが起動し言語選択メニューが開くので English を選ぶ → Next
  3. バイス名 Volumio のまま → Next
  4. I have an I2S DACYES
    Select your i2s DACpHAT DAC → Next
  5. 自宅の無線 LAN の SSID を選択 → パスワード入力 → Next
  6. USB ドライブなどがあれば適宜追加 → Next
  7. Conguratulations → Done
  8. Restart(再起動する)

固定 IP 設定

  1. 自宅の無線 LAN ネットワークに繋がったスマホ (PC) から http://volumio.local/ へアクセスする
  2. 初期画面が表示されたら、画面右下の 歯車アイコン をクリック
  3. Network を選択
  4. Wireless Network の項目へ移動
  5. Automatic IP は On → Off へ変更する
  6. 固定 IP アドレス、ネットマスク、デフォルトゲートウェイを入力 → Save → Continue
  7. Hotspot Settings の項目へ移動し Enable Hotspot を On → Off へ変更 → Save
  8. 歯車アイコン → SHUTDOWN → Restart で再起動する

キーボード操作

キーボードから Volumio 2 にログインする
ログインID: volumio / パスワード: volumio

  • apt-get する
# sudo apt-get update
# sudo apt-get upgrade
  • raspi-config をインストールする
# sudo apt-get install raspi-config
...
*** dhcpd.conf (Y/I/N/O/D/Z) [default=N] ? (そのままエンター)
  • キーボード設定をインストールする

日本語キーボードの設定をするがここではうまくいかない。

# sudo apt-get install keyboard-configuration

Keyboard layout: → Other を選択
Country of origin for the kayboard: → Japanese を選択
Keyboard layout: → Japanese を選択
  • vim エディタをインストールする
# sudo apt-get install vim
  • 再起動
# sudo reboot

raspi-config 設定

  • raspi-config を起動する
# sudo raspi-config
  • 4 Localization Options
    • I1 Change Locale
    • I2 Change Timezone
      • Geographic area: Asia
      • Time zone: Tokyo
    • I3 Change Keyboard Layout
      • Keyboard model: Generic 105-key (Intl) PC
      • Keyboard layout: Japanese
      • Key to function as AltGr: The default for the keyboard layout
      • Compose key: No compose key
    • I4 Change Wi-Fi Country
      • Select the country in which the Pi is to be used: JP Japan
  • 5 Interfacing Options

    • P2 SSH
      • Would you like the SSH server to be enabled? <Yes>
  • 念のため再起動して完了

# sudo reboot

Raspberry Pi zero wh のセットアップ

SD カードのフォーマット

  • 新しい SD カードを用意する
  • ここ から SD カードメモリフォーマッターをダウンロードする
  • SD カードをフォーマットする

OS のセットアップ

  • Download NOOBS for Raspberry Pi から NOOBS Lite をダウンロードする
  • zip ファイルを展開して SD カードにコピーする
  • Raspberry Pi zero wh に SD カードを挿入して電源オン
  • 画面の指示に従い Raspbian Lite をインストールする

apt-get の実行

$ sudo apt-get update
$ sudo apt-get upgrade

キーボードレイアウト変更

sudo vi /etc/default/keyboard

XKBMODEL="jp106"
XKBLAYOUT="jp"
XKBVARIANT="OADG109A"
XKBOPTIONS=""

BACKSPACE="guess"

time zone の変更

  • sudo raspi-config を実行
  • 4 Localisation Options を選択
  • I2 Change Timezone を選択
  • Asia を選択
  • Tokyo を選択
  • Finish を選択

git のインストール

$ sudo apt-get install git

ReSpeaker 2-Mics HAT のセットアップ

ドライバのセットアップ

$ pwd
/home/pi
$ sudo git clone https://github.com/respeaker/seeed-voicecard
$ cd seeed-voicecard
$ sudo ./install.sh
$ reboot

バイスを確認

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 7/7
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: seeed2micvoicec [seeed-2mic-voicecard], device 0: bcm2835-i2s-wm8960-hifi wm8960-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

ALSA コントロール設定

$ sudo alsactl --file=asound.state restore
alsactl: load_state:1683: Cannot open asound.state for reading: No such file or directory
Found hardware: "bcm2835_alsa" "Broadcom Mixer" "" "" ""
Hardware is initialized using a generic method
Found haedware: "seeed-2mic-voic" "" "" "" ""
Hardware is initialized using a generic method
$ sudo alsactl --file=asound.state store
$ pwd
/home/pi
$ ls
asound.state  seeed-voicecard

入出力テスト

  • スピーカーテスト テスト音声が再生される。
$ speaker-test -t wav

speaker-test 1.1.3

Playback device is default
Stream parameters are 48000Hz, S16_LE, 1 channels
WAV file(s)
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 12000 to 18000
Period size range from 6000 to 6000
Using max buffer size 18000
Periods = 4
was set period_size = 6000
was set buffer_size = 18000
 0 - Front Left
Time per period = 1.234349
  • マイク録音テスト areord で out.raw に録音データを保存し aplay で再生する。
$ arecord --format=S16_LE --duration=5 --rate=16000 --file-type=raw out.raw
Recording raw data 'out.raw' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
$ aplay --format=S16_LE --rate=16000 out.raw
Playing raw data 'out.raw' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono
  • マイク入力テスト マイクから拾った音声がただちにスピーカーから聞こえる。
arecord -f cd -Dhw:1 | aplay -Dhw:1

Amazon alexa のセットアップ

Amazon Developer アカウント

  • ここ を参考に Amazon Developer アカウントを登録する

    製品登録

  • Amazon 開発者コンソールへアクセスし ALEXA VOICE SERVICE のタブをクリックする
  • ここ を参考にセキュリティプロファイルを作成する
  • 登録例
    • 製品名:hogefuga
    • 製品ID:hogefuga
    • 製品タイプ:Alexa内蔵の端末
    • コンパニオンアプリの使用:はい
    • 商品カテゴリ:その他(スマートスピーカー
    • 製品概要:alexa voice service on raspberry pi zero
    • エンドユーザーは、商品とどうやり取りするか?:「タッチで開始される」「ハンズフリー」にチェックを入れる
    • この製品を商品として配信する予定ですか?:いいえ
    • これは子供向け商品、それ以外は13歳以下の子供向けですか?:いいえ
  • LWA セキュリティプロファイル
    • セキュリティプロファイル(プロフィールを新規作成する)
    • セキュリティプロファイル名:Alexa Voice Service on Raspberry Pi Zero W
    • セキュリティプロファイル記述:Alexa Voice Service on Raspberry Pi Zero W
  • 各種IDの作成
    • セキュリティプロファイルID:amzn1.application.xxxxx...
    • クライアントID:amzn1.application-oa2-client.xxxxx...
    • クライアントのシークレット:xxxxx...
    • これらの書面に合意しますにチェックを入れ、[完了する] をクリック
  • 商品が作成されました。[OK]をクリックする
  • ALEXA VOICE SERVICE タブをクリックし、製品一覧を表示する

クイックセットアップ

参考サイト を元に作業を進める。 - フォルダ作成

$ cd /home/pi/
$ mkdir sdk-folder
$ cd sdk-folder
$ mkdir sdk-build sdk-source third-party application-necessities
$ cd application-necessities
$ mkdir sound-files
$ sudo apt-get update
$ sudo apt-get -y install git gcc cmake build-essential libsqlite3-dev libcurl4-openssl-dev libfaad-dev libsoup2.4-dev libgcrypt20-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-good libasound2-dev doxygen
  • PortAudio 設定
$ cd /home/pi/sdk-folder/third-party && wget -c http://www.portaudio.com/archives/pa_stable_v190600_20161030.tgz && tar zxf pa_stable_v190600_20161030.tgz && cd portaudio && ./configure --without-jack && make
  • commentjson のインストール
$ sudo apt-get install python-pip
$ pip install commentjson
Collecting commentjson
Installing collected packages: commentjson
Successfully installed commentjson-0.7.1

サウンドファイルのダウンロード

  • (タイマーとアラーム音をアマゾンのサイトからダウンロード)
$ cd /home/pi/sdk-folder/application-necessities/sound-files/
$ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_02._TTH_.mp3
$ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_02_short._TTH_.wav
$ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_01._TTH_.mp3
$ wget -c https://images-na.ssl-images-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-voice-service/docs/audio/states/med_system_alerts_melodic_01_short._TTH_.wav

AVS デバイス SDK とウェイクワードエンジンのクローン

  • sdk-source フォルダに SDK をクローンする
$ cd /home/pi/sdk-folder/sdk-source
$ git clone git://github.com/alexa/avs-device-sdk.git
  • 次に third-party ディレクトリにウェイクワードエンジンをクローンする
$ cd /home/pi/sdk-folder/third-party
$ git clone git://github.com/Sensory/alexa-rpi.git

(ライセンス認証)
$ cd ./alexa-rpi/bin/ && ./license.sh
  • SDK のビルド
$ cd /home/pi/sdk-folder/sdk-build && cmake /home/pi/sdk-folder/sdk-source/avs-device-sdk -DSENSORY_KEY_WORD_DETECTOR=ON -DSENSORY_KEY_WORD_DETECTOR_LIB_PATH=/home/pi/sdk-folder/third-party/alexa-rpi/lib/libsnsr.a -DSENSORY_KEY_WORD_DETECTOR_INCLUDE_DIR=/home/pi/sdk-folder/third-party/alexa-rpi/include -DGSTREAMER_MEDIA_PLAYER=ON -DPORTAUDIO=ON -DPORTAUDIO_LIB_PATH=/home/pi/sdk-folder/third-party/portaudio/lib/.libs/libportaudio.a -DPORTAUDIO_INCLUDE_DIR=/home/pi/sdk-folder/third-party/portaudio/include

$ pwd
/home/pi/sdk-folder/sdk-build
$ sudo make SampleApp -j2
  • 設定ファイルの編集
$ vi ~/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json

"deviceInfo":{
    // Unique device serial number. e.g. 123456
    "deviceSerialNumber":"123456",
    // The Client ID of the Product from developer.amazon.com
    "clientId":"amzn1.application-oa2-client.xxxxx...",
    // Product ID from developer.amazon.com
    "productId":"(製品ID)"
},
  • ファイルパスを以下のとおり指定する
    ロケールも ja-JP にする)
$ vi ~/sdk-folder/sdk-build/Integration/AlexaClientSDKConfig.json

"cblAuthDelegate":{
    "databaseFilePath":"/home/pi/sdk-folder/application-necessities/cblAuthDelegate.db"
},

"miscDatabase":{
    "databaseFilePath":"/home/pi/sdk-folder/application-necessities/miscDatabase.db"
},

"alertsCapabilityAgent":{
    "databaseFilePath":"/home/pi/sdk-folder/application-necessities/alerts.db",
    "alarmSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_01._TTH_.mp3",
    "alarmShortSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_01_short._TTH_.wav",
    "timerSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_02._TTH_.mp3",
    "timerShortSoundFilePath":"/home/pi/sdk-folder/application-necessities/sound-files/med_system_alerts_melodic_02_short._TTH_.wav"
},

"settings":{
    "databaseFilePath":"/home/pi/sdk-folder/application-necessities/settings.db",
    "defaultAVSClientSettings":{
        "locale":"ja-JP"
    }
},

"bluetooth" : {
    "databaseFilePath":"/home/pi/sdk-folder/application-necessities/bluetooth.db"
},

"certifiedSender":{
    "databaseFilePath":"/home/pi/sdk-folder/application-necessities/certifiedsender.db"
},

"notifications":{
    "databaseFilePath":"/home/pi/sdk-folder/application-necessities/notifications.db"
},

マイクテスト

$ vi ~/.asoundrc
pcm.!default {
  type asym
   playback.pcm {
     type plug
     slave.pcm "hw:1,0"
   }
   capture.pcm {
     type plug
     slave.pcm "hw:1,0"
   }
}
  • SoX のインストール
$ sudo apt-get install sox -y
  • マイク録音テスト
    (Ctrl + Cで中止)
$ rec test.wav

$ play test.wav

サウンドバイスの無効化

$ cd /etc/modprobe.d/
$ sudo vi alsa-blacklist.conf
blacklist snd_bcm2835

$ sudo amixer cset numid=3 1
numid=3,iface=MIXER,name='PCM Playback Route'
 ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
 ; values=1
  • dirmngr の導入
$ sudo apt-get install dirmngr

認証

$ cd ~/sdk-folder/sdk-build/
$ pwd
/home/pi/sdk-folder/sdk-build
$ ./SampleApp/src/SampleApp ./Integration/AlexaClientSDKConfig.json /home/pi/sdk-folder/third-party/alexa-rpi/models

参考サイト

購入先

ReSpeaker 2-Mics HAT for Raspberry Pi