[Raspberry Pi 3]自分を慰めるボタンを作ってみた(音声出力+Line連携)

#■はじめに
心が疲れることはありませんか？（私はあります）
そんなときこそ誰かがそばにいてほしいと思いませんか？（私にはいません）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/85ba07c4-1b16-bd5e-a46b-b5a19ea7a7dc.png)

手元にあるのはラズパイ3とスマホ・・・
これを使って荒んだ心を慰めてみたいと思います。


#■イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/db7d36c1-9653-ea9b-96e6-1749e1a84162.png)

#■準備したもの
|部品|個数|
|:-----------------|------------------:|
|Raspberry Pi 3 Model B+|1個|
|ブレッドボード|1個|
|ジャンプワイヤ(オス-オス)|2本|
|ジャンプワイヤ(オス-メス)|2本|
|押しボタンスイッチ|1個|
|Lineが入っているスマホ|1個|

#■押しボタン側の構成
押しボタン側はRaspberryPiのGPIOピンによる電気回路を利用します。
（といっても、LEDや抵抗器は使わず、オームの法則すら考えません）

Raspberry GPIOの3.3V電圧源ピンを出力とし、26Pinを入力とします。その間に押しボタンスイッチを設け、「押していない=遮断されている=26Pin入力値0」「押している=導通している=26Pin入力値1」、として入力判断します。

・Raspberry PI3 GPIOピン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/f7315665-e448-6ef2-ca5e-7b25dcea129f.png)
https://www.raspberrypi.org/documentation/usage/gpio/README.md

・回路
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/c7fca0e3-4b5d-bc24-32e6-c634fe42b511.png)

・実物
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/69899c34-a2da-9346-b3ff-9eb3bcca49ec.png)

＃適当なスイッチが無かったので、導線とスイッチをテープで繋いでいます。

#■GPIO側の構成
Bashにて、gpioピンの状態は簡単に確認できます。

・gpio 26ピンを入力として利用
`gpio -g mode 26 in`

・gpio 26ピンの状態を確認　→　結果が0だと遮断、1だと導通
`gpio -g read 26`

```bash:導通時
pi@raspberrypi:~test $ bash gpio -g read 26
1
pi@raspberrypi:
```


#■音声出力の構成
Open JTalkとaplayを利用し、文字列を読み上げてもらいます。

①日本語文字列がある
②JTalkが文字列を音声ファイル化
③aplayが音声ファイルを再生
④スピーカーから音が聞こえる

>詳細は以下記事にて。
・[Raspberry Pi3に日本語で喋ってもらうまで](https://qiita.com/Higemal/items/6dde8637a680bfe200ca)
・[JTalkの音声変換と音声出力をシェルで一気にやる(ラズパイ用)](https://qiita.com/Higemal/items/aacaa30588ebd2fceb1f)


#■Line notifyの構成
Line notifyを利用します。
1ライナーでLine通知が出来るので非常に便利だなと思いました(小並感)。

①Lineに自分だけのグループを作成する
②Line notify登録　※アクセストークンを入手
③自分だけのグループにLine notify(Line公式アカウント)を招待&自動参加
④bashから適当なメッセージをPOST
`curl -X POST -H "Authorization: Bearer ACCESS_TOKEN" -F "message=MESSAGE" https://notify-api.line.me/api/notify`

>以下記事を参考。
・[【LINE】知ってる？ 自分1人だけのグループトークの使い道と作り方](https://appllio.com/line-lonely-group)
・[[超簡単]LINE notify を使ってみる](https://qiita.com/iitenkida7/items/576a8226ba6584864d95)
・[LINE Notify 簡単なシェルスクリプトで試してみた](https://qiita.com/tbuchi888/items/f014f809a7e9f649d270)

#■シェルスクリプト本体
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/b58667e2-6fdf-c58e-bec7-1c330ac5cee9.png)

①RaspberryPiのGPIO入力を検知
②音声用文字列を取得
③音声用文字列から音声を出力
④LineにメッセージをPOST

```:voice_text.txt
どうしたの？大丈夫？
つらかったね。大変だったね
今まで、がんばってきたんだね
大丈夫だよ。心配ないさ
いつもそばにいるよ
いつでも話聞くよ
大切なことの相談相手に選んでくれてありがとう
明日はきっとよくなるよ
```
[大切な人を励ますシンプルな8つの言葉](https://shigotonomirai.com/cheer-up-words)
<br>

```bash:comfort_loop.sh
#!/bin/bash

lp=10                           #ループ変数
row=0                           #音声用テキストファイル行数
wordfile=./voice_text.txt       #音声用テキストファイル
gpstat=0                        #gpio入力状態

#gpio 26pinを入力インターフェース化
gpio -g mode 26 in

#無限ループ
for((i=0;i<$lp;i));do

    #gpio 26pinを入力の入力状態確認(導通=1,遮断=0)
    gpstat=`gpio -g read 26`

    if [ $gpstat = 1 ]; then
        #音声テキストファイルの行数を取得し、行番号をランダムで選択
        row=`cat voice_text.txt| wc -l`
        rand=$(($RANDOM % "$row" + 1))

        #音声テキストファイルの行番号の内容を音声化
        /usr/jtalk/JtalkFromArg.sh `sed -n "$rand"p $wordfile`
        
        #Line notify連携
        ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        MSG='大丈夫？無理しないで。　https://www.inochinodenwa.org/'
        curl -sS -X POST -H "Authorization: Bearer $ACCESS_TOKEN" -F "message=$MSG" https://notify-api.line.me/api/notify

        sleep 0.9   
    fi

    sleep 0.1 

done
```
＃無限ループのため、終了時は`ctrl + c`で停止しています。
<br>



```bash:JtalkFromArg.sh
root@raspberrypi:/usr/jtalk# cat ./JtalkFromArg.sh 
#!/bin/sh

### Making WAV File from Command Line Argument
###  and speaking with aplay command

#TempWAVFile
TMP=/tmp/jtalkTmp.wav

if [ $# -ne 1 ]; then
echo "Error: argument not exist"
exit 1
fi

echo "$1" | open_jtalk \
-m /usr/share/hts-voice/nitech-jp-atr503-m001/nitech_jp_atr503_m001.htsvoice \
-x /var/lib/mecab/dic/open-jtalk/naist-jdic/ \
-ow  $TMP \

chmod 777 $TMP
aplay --quiet $TMP

exit 0
#EOF
```

>JtalkFromArg.sh の詳細は以下で。
[JTalkの音声変換と音声出力をシェルで一気にやる(ラズパイ用)](https://qiita.com/Higemal/items/aacaa30588ebd2fceb1f)




#■結果
ラズパイ >> ﾀｲｾﾂﾅｺﾄﾉ ｿｳﾀﾞﾝｱｲﾃﾆ ｴﾗﾝﾃﾞｸﾚﾃ ｱﾘｶﾞﾄｳ(野太い男性声)

ティロン♪
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201787/65f23935-6eab-679b-3503-9817ba8291b6.png)

***精神的負荷がやっべぇ***
***二度と押さねぇ***


#■出典/参考
[Raspberry]GPIO
https://www.raspberrypi.org/documentation/usage/gpio/README.md

fritzing
http://fritzing.org/download/

「Raspberry Pi3 Model B」で遊んでみよう！Part2
https://pc.watch.impress.co.jp/docs/column/nishikawa/1006048.html



Raspberry Pi3に日本語で喋ってもらうまで
https://qiita.com/Higemal/items/6dde8637a680bfe200ca

JTalkの音声変換と音声出力をシェルで一気にやる(ラズパイ用)
https://qiita.com/Higemal/items/aacaa30588ebd2fceb1f

【LINE】知ってる？ 自分1人だけのグループトークの使い道と作り方
https://appllio.com/line-lonely-group



[超簡単]LINE notify を使ってみる
https://qiita.com/iitenkida7/items/576a8226ba6584864d95

LINE Notify 簡単なシェルスクリプトで試してみた
https://qiita.com/tbuchi888/items/f014f809a7e9f649d270

大切な人を励ますシンプルな8つの言葉
https://shigotonomirai.com/cheer-up-words