ラズパイとゆっくりボイスで自由度の高い時報システムを作るよ

Qitta民ならほぼ知っていると思われるが一般的にはあまり知られていない電子機器、RaspberryPi(ラズパイ)。使い方はいろいろがゆえにどう使ったらいいかわからない人も意外といるのでは。ここでは、ラズパイとスピーカーを用いて、音声による時報システムを作っていきます。
このシステムは一見地味に見えてかつ比較的単純な仕組みですが、実際使ってみると(私的にですが)かなり便利です。

# 1.ラズパイと概要

皆さんお知りではあるとは思いますが一応書いておきます。
RaspberryPi（ラズパイ）とは、シングルボードコンピュータ。超簡単に言えば省電力で小型のパソコン。パソコンとは言っても、CPUはARM系で通常のWindowsは動かない(ARM版Winは動かなくはないが非推奨)。
・ARM　省電力に強い。32/64bitあり。スマホタブレット等以外にもシングルボードコンピュータ(SBM)でも使われる。ARM用のLinux(Android含む)、M1以降のMacOS、WindowsのARM版が動作する。
・AMD64/x86　従来のWindowsPCやIntelMac、x86用Linux(Android含む)などが該当。主にWindowsを動かすものと考えましょう。サーバーでも使われる。x86が32bitアーキテクチャでAMD64はその64bit対応版、ざっくり言えばですが。

ラズパイで主に使われるのは、RaspberryPiOS（旧称Raspbian）というDebianベースのLinux。Linuxなのでディスプレイとキーボードマウス繋いでデスクトップとして活用も可能。ただ、低価格省電力がゆえに何もつながずサーバーとして使っている方の方が多いのでは...?　また、GPIOという端子を使い、電子工作として使っている方も多いと思われる。
詳しく知りたかったらググってくださいませ。

今回作成するものの機能
・Aquestalkpiとスピーカーを使い、ゆっくりボイスを流す
・aplayやcvlcなどを用いて音声ファイルを流す
・他の端末のラズパイ録画サーバーのAPIを実行する
・以上をcronを使って定時に実行する
・手持ちの音声ファイルの転送などのためsambaサーバー機能の設置

# ２．必要なものを集める、購入する

・<b>ラズパイ３以上</b>：モデルは特に問わない。そんなに性能要求しないし。
・<b>ケース</b>：なくてももちろん動かせるが、極力用意しましょう。ただし私は使っておらず網に括り付けていますがｗ 専用ケースはPi2や3用とは微妙に異なることに注意。
・<b>冷却ファン</b>：もちろんなくても普通に稼働する。CPU100%でぶん回すと確実に80℃行くが、この使い方ならそんなことは多分ない。
・<b>USB-TypeC(ラズパイ3はB)ケーブル＆USB電源</b>：普通に動くなら何でもいいでしょう。電源容量不足することもたぶんない。
・<b>MicroSD（8GB～32GB）</b>HDD/SSDブートでSDなしという手もあるが、この用途ではSDで全然問題ありません。

・<b>HDMIケーブル(4,5はmicro)&ディスプレイ(or TV)</b>：ディスプレイがなくてもネットワーク経由で他のマシンからSSH等で操作なので不要だが、あればトラブル対策しやすいか。3は普通のHDMIケーブル、4,5はMicroと普通のを持ったケーブルか普通のケーブルに変換でもよい。（一方、ラズパイゼロはMicroではなくmini。紛らわしい...）
・<b>作業用のパソコン</b>：OSをSDに書き込んだりSSH等でこちらから操作したり。インストール済みのSDを買ってPiにマウスキーボード付けるっていうなら不要だが、パソコンないのにPi買う人はほぼいないのでは。OSはW/M/LどれでもＯＫ。
・<b>LANケーブル</b>：有線でつなぐメリットは無線の設定が不要なこと(無線の設定は間違いなく行えば特に問題はない)程度しかなく、録画サーバーなどと違い通信の安定はまず必要ないので、基本無線推奨(つまりその場合LANケーブルは不要)。

・<b>スピーカー</b>：接続インターフェイス的に3種類ある。
　1.オーディオジャック。丸く長い挿すアレ。Pi5では廃止。ダイソーなんかでも売っていて手軽に手に入るが別途USB等で、電源が必要なのには注意。
　2.USBスピーカー。音声データと電力を一本で賄えるので扱いは楽かも。
　3.Bluetoothスピーカー。無線なので置く場所が自由。ただしラズパイ自体も自由でかつBluetoothの接続がなんらかの原因で切れると面倒なので実際はメリット薄そう。
(4.hdmiから音声分離。そういうハードはあるがPiよりも大きいしほぼメリットはない)

# ３．OSのインストールとセットアップ

ラズパイのOSは別のマシンで調達してMicroSDカードに書き込む必要がある。もちろんWinでもMacでもLinuxでも可能。公式のディストリビューションのRaspberry Pi OS（旧称Raspbian）は、３種あり、32bit(全ラズパイ),64bit(Pi3以降)があり、それぞれLite(CUI専用)、desktop(GUI搭載)、desktop and recommended software(いろいろ入ってるが選ぶ必要無し)がある。
わかんなければ64bitのdesktopを使っておけばいいと思います。ラズパイ３だとスペック上は64bitは不要ですが各種コマンド等対応を考えると64にした方がいい気がします。ヘッドレスで運用する場合でもVNCで接続してGUI操作を考えると私はdesktop派です。以後、64bitのdesktop前提で説明します。
これらの入手は、現在は公式ツール「Raspberry Pi Imager」使用がメインだと思います。ヘッドレスブート(ディスプレイなしでセットアップ、運用)のために事前に設定しておきましょう。OSの起動は、電源につなげば自動的に電源ONとなり起動します。

### Linux系OSの操作方法について

（知っている方はどうぞ飛ばしてください：まぁこれ読んでいる8割はそうでしょうけど）
Linux系のOSは、ソフトのインストールのみならず各種操作の多くをコマンドで実行する。一見難しく見えて難しいが、コピペだけなら何とかなるのでは。コマンドを実行するには、ターミナル（黒いウインドウのアレ）を開いて打つ（orペースト）する必要がある。さらに、システムに関連する命令は管理者権限が必要なので、コマンドの頭に"sudo "を加えて一時的に権限アップする必要がある。
GUI(ウインドウ操作)とCUI(コマンドのみ)。操作によっては（簡単なファイルコピー等）GUIの方がいいかもだが、自動化が必要とかパッケージのインストールなどはCUIの方が効率が良い。。なお、Linuxにおいては設定ファイルを書き換える必要が出てくる。そんな時は、コマンドを使ってテキストエディタ（何種類かある）をsudo付きで起動する必要がある。ここでは、テキストエディタはnanoを使う。もちろんviがいいとかemacsでないとという方はnanoの部分について適宜読み替えを。

### 他のマシンからのアクセス

ヘッドレスの時は特にだが、他のパソコンから操作するにはどうしたら？→まずはSSHで接続しましょう。VNCも便利だが、raspi-configで有効化するのにSSHが必要になりますし。操作側のマシンにはクライアントソフトが必要、Win10なら標準でPowershell(スタートメニューにあるぞ)から可能ではあるが、個人的にはteratermとかダウンロードして使う方が便利だと思います。

```SSHクライアントやPowershellを開いたうえで.

ラズパイのIPアドレスが192.168.1.11の場合
ssh pi@192.168.1.11
パスワードのデフォはraspberry

なお、キーが受け付けないときは
ラズパイのIPアドレスが192.168.1.11の場合
ssh-keygen -R 192.168.1.11
```

参考：「SSHホスト鍵が変わってるよ！」と怒られたときの対処
https://qiita.com/hnw/items/0eeee62ce403b8d6a23c

最初に一つ戸惑うのは、ラズパイのIPアドレスに何が振られているか。
・ルーターにアクセスして調べる
・192.168.1.2、192.168.1.3などと順に試してみる
・IPアドレスをスキャンするソフトを使う(WindowsならAdvanced IP Scannerなど)
・ラズパイが1台だけなら　ssh pi@raspberrypi.local　(ホスト名指定)でも大丈夫らしい
また、Bonjour Service（iTunes含む）が有効状態でLANケーブル直結で行う方法もあるとのこと。

### ログイン後の設定

```ターミナルなどを開いたうえで.

sudo raspi-config
```

SSHが無効になっていて有効にしたいならここでONにできる。

### IPアドレスの固定方法

デフォだとDHCPで勝手に振られてしまい使い勝手がよくないので固定したい。ヘッドレスブートで事前設定するにはExt4パーティーション内の書き換えが必要なので作業用マシンがLinuxの時のみ可能。Win/Macの場合はなんとかして最初に一度ログインしてから設定して固定した方がいい。

#### GUIで設定をする

タスクトレイのネットワークを右クリック、Wireless & Wired Network Settingsから設定する。有線はth0、無線はwlan0。ipv4address,router,dns
なおimagerで無線設定をしたまま有線でつなぐと2重にネットワークにつながってしまう。不具合等は無いのだが、無駄行為でもあるので無線を使わないなら無線を解除した方がいいかも。

#### CUIで設定をする(推奨)

慣れれば、意外とCUIの方が楽だし早い。
固定IPアドレスを設定するためのファイルを編集。

```ターミナルなどを開いたうえで.
エディタにnanoを使う場合
sudo nano /etc/dhcpcd.conf

nanoはCtrl+Oで上書き保存、Ctrl+xで閉じる。エディタ一番下のショートカットキー一覧も参照。

ファイルを開いたら、一番下までスクロールし、下記の項目を追加。
dhcpd.confの内容

無線の場合
interface wlan0
有線はeth0にする。両方繋ぐ必要は通常はない
interface eth0
ラズパイのIPを192.168.1.11にする場合
static ip_address=192.168.1.11/24
ルーターのIPが192.168.1.1の場合
static routers=192.168.1.1
ルーターのIPが192.168.1.1の場合
static domain_name_servers=192.168.1.1

"static ip_address"は固定IPアドレス。"/24"はサブネットマスク長。
"static routers"はデフォルトゲートウェイのIPアドレス。通常はルーターのIP。
"static domain_name_servers"はDNSサーバーのIPアドレス。通常はルーターのIP。
```

### チューンアップ

より快適な動作、無駄の削減を行う。
swap無効化関連。メモリ2GB↑なら推奨だがPi3ならやらない方がいいのかも。

```swap関連.
swap無効化
sudo swapoff --all
swapパッケージ削除.
sudo apt remove -y dphys-swapfile
swapファイルの削除.
sudo rm /var/swap

一行なら
sudo swapoff --all;sudo apt remove -y dphys-swapfile;sudo rm /var/swap
```

わざわざやらなくていいとは思うが、設定の最適化のためのツールchkconfigをインストールする選択肢もあり。

```chkconfigが必要なもの.
インストール
sudo apt-get install chkconfig
swap機能を無効化するには
sudo chkconfig dphys-swapfile off
きちんと削除されているかを確認するには
sudo chkconfig dphys-swapfile -list
```

通常はわざわざすることはないですが、wifiを無効化する方法（要再起動？）

```wifi無効化/有効化.
無効化
sudo iwconfig wlan0 txpower off
有効化
sudo iwconfig wlan0 txpower auto
```

究極の省電力をしたい方くらいか？HDMI出力をOffにする
```HDMI出力のOn/Off.
Offにする
/opt/vc/bin/tvservice --off
Onに戻す
/opt/vc/bin/tvservice -p
```

こちらは逐次実行が必要なので、常にOffにするには起動するたびにコマンドを打つか、cronに登録する必要がある（cronについては後編で書く予定）。

### アップデート等

Raspberry Pi OSをアップデート。これしておかないと入らないツールもあるので面倒でも必須。apt-getでもいいが、最近はaptを推奨？

```update.
sudo apt update
sudo apt upgrade -y
一行なら
sudo apt update;sudo apt upgrade -y
```

```ディストリビューションを最新にする.
（非推奨：どちらかといえば人柱向けなため）
sudo rpi-update
```

```ファームウェアのアップデート.
コマンドが未インストールだった時
sudo apt install rpi-eeprom-update
アップデートが可能かを確認
sudo rpi-eeprom-update
sudo apt full-upgrade
```

```再起動.
もちろんマウス使って再起動でも同じ.
sudo reboot
```

```ログの最少限化.
必要最少限のログ（auth , syslogとmessages）のみを記録。
sudo nano /etc/rsyslog.conf
```

あと、ここでは説明しないがtmpフォルダ の RAMディスク化というのもある。

### 診断について。

・SDのチェック→linux上でチェックディスクをかける
・HDD/SSDのチェック→チェックディスクとcrazydiskinfo？
・SSDのデフラグ(最適化)？
このあたりは正直私はまだわからないので、調べつつということで...

### サーバー管理方法

PC上からならSSH接続やVNCからでもなんとかなると思うが、スマホからだと、やるとわかるが実際いろいろ面倒。なのでブラウザ上から管理できるツールの導入を考えてみる。
・有名なのはWebminで、割となんでもできる。サーバーのCPU、ディスク使用率の表示はもちろんのこと、よく使うコマンドを設定してワンクリックで実行も可能。
・最低限の機能？なcockpitもある。こちらも、コマンドを打って実実行する機能はある。
・cronの設定は、crontab-uiというのがある。
・インストール方法は..とりあえず今はググってｗ
・行いたいこと：余計なプロセスがないかをチェック(無駄に熱くなるの防止)。チューナー診断コマンド。温度表示コマンド。hdmiの有効無効コマンドが候補か？

### 日本語入力のセットアップ

サーバー用途の場合はPi上で日本語入力は使う必要性は低いと思います。VNCで操作中にコピペで張り付ければいいし。ただしcronを設定する時とかあると便利に思うことは個人的にはたまにありますね。

```日本語入力IMEを導入.
sudo apt install ibus-anthy
IME ON/OFF 切り替えは Ctrl+j なぜか半角全角キー動かず

日本語フォントはある前提です。もしなかったら↓
sudo apt install fonts-vlgothic
```

# ４．合成音声でしゃべるようにする

OS周りの調整が済んだところで、肝心のしゃべるところに手を付けます。既存の通知音声や事前に録音したファイルを作るのではなく合成音声を使うことで、手軽に編集できしかもわかりやすい通知となります。合成音声はいくつかソフトがあると思いますが、ここでは「ゆっくりボイス」で知られているAquestalkの系統を入れます。

ゆっくり(aquestalkpi)のインストール
https://zenn.dev/noraworld/articles/aquestalk-pi-version-1-20-ubuntu20-arm64

```aquestalkインストーラー.
（ラズパイOSには標準搭載だがzcatがない場合は事前に入れておく）
wget -qO- https://raw.githubusercontent.com/noraworld/aquestalk-installer/master/bin/pi | sh
カレント(homeフォルダ)内のaquestalkpiフォルダにインストールされる。
しゃべらすためには、cd aquestalkpiで移動したのちに

./AquesTalkPi "漢字も読めます。" | aplay

というように、aplayへ渡すことで実行できる。
もちろん./aquestalkpi/AquesTalkPi というようにカレントを移動せずに実行もできます。
```

もしコマンド自体が成功してもなにもしゃべらない場合
・スピーカー自体の音量メモリが０になっている、またはスピーカー自体の電源がつながっていない電池がない
・出力先が間違っている(つながっていないhdmiの音声部分に出力されている、など)
などが考えられます。
前者は普通にチェックするとして、後者については（のちに修正予定、標準出力先を変える方法とコマンド自体で出力先を指定する方法がある）。

### cronによる定期実行

これらの真価を発揮するには、定期自動実行が必要。crontabコマンドについてはいくらでもいろんな人が解説しているがここでも一応説明する。なお定期実行等できればいいので、crontab以外の方法をご存知であればそちらを使っても構わない。
あとは、結構重要なのは、何をどのタイミングで喋るか、だ。人によって、家族構成によって内容は違うので、各々で構築してください。

```cronの設定。↓あくまで一例です。.
crontab -e
初回にエディタを問われると思います。好みがない、あるいはよくわからん場合はnanoにしておくのがいいかも。

・月曜から金曜日の朝7時台に10分間隔で時刻をしゃべらせる
10 7 * * 1-5 ./aquestalkpi/AquesTalkPi -b -s 60 "おはよう、朝7時10分だよ" | aplay
20 7 * * 1-5 ./aquestalkpi/AquesTalkPi -b -s 60 "朝7時20分だよ、顔洗った？" | aplay
30 7 * * 1-5 ./aquestalkpi/AquesTalkPi -b -s 60 "朝7時30分だよ、朝ごはん食べた？" | aplay
40 7 * * 1-5 ./aquestalkpi/AquesTalkPi -b -s 60 "朝7時40分だよ、支度はそろそろできたかな" | aplay
50 7 * * 1-5 ./aquestalkpi/AquesTalkPi -b -s 60 "朝7時50分だよ、いってらっしゃい" | aplay
・毎日、夜にお風呂入るのを促す
50 20 * * * ./aquestalkpi/AquesTalkPi -b -s 60 "そろそろお風呂に入りましょう" | aplay
30 21 * * * ./aquestalkpi/AquesTalkPi -b -s 60 "ちゃんとお風呂入りましたか？" | aplay
・毎日、食事等の時間をしゃべる
0 12 * * * ./aquestalkpi/AquesTalkPi -b -s 60 "朝7時50分だよ、いってらっしゃい" | aplay
0 15 * * * ./aquestalkpi/AquesTalkPi -b -s 60 "朝7時50分だよ、いってらっしゃい" | aplay
0 19 * * * ./aquestalkpi/AquesTalkPi -b -s 60 "朝7時50分だよ、いってらっしゃい" | aplay
・土曜日、題名のない音楽会が始まるのを告知する
59 6 * * 6 ./aquestalkpi/AquesTalkPi -b -s 60 "おはよう、題名のない音楽会始まるよ。そのあとはポケモンだよ" | aplay
・日曜日、ニチアサが始まる前に告知する
29 8 * * 0 ./aquestalkpi/AquesTalkPi -b -s 60 "朝8時29分だよ、まもなくプリキュア始まるよ" | aplay
```

この時報が便利な理由として、
・しゃべるタイミングと頻度を自由に決められる
・即時の合成音声なので録音し直しなどがないのである意味編集は楽
・定期的に行う予定を設定することで物事を忘れない
・スマホと違い持ち運びできないがそれゆえにマナーモード等を考える必要はない

また、後日追記しますが、音声ファイルを自動再生することにより、朝にラジオ体操をしたり、一日数回筋トレの音声を流したりといったこともできます。工夫次第ではラジオを自動再生も可能です。

# ５．sambaによるファイルサーバー(仮)
未実装、そのうち書きます。一般的なsambaサーバーを入れるだけなのでググってでも全然OKです。