LoginSignup
9
8

More than 5 years have passed since last update.

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

Posted at

■はじめに

心が疲れることはありませんか?(私はあります)
そんなときこそ誰かがそばにいてほしいと思いませんか?(私にはいません)
image.png

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

■イメージ

image.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://www.raspberrypi.org/documentation/usage/gpio/README.md

・回路
image.png

・実物
image.png

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

■GPIO側の構成

Bashにて、gpioピンの状態は簡単に確認できます。

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

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

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

■音声出力の構成

Open JTalkとaplayを利用し、文字列を読み上げてもらいます。

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

詳細は以下記事にて。
Raspberry Pi3に日本語で喋ってもらうまで
JTalkの音声変換と音声出力をシェルで一気にやる(ラズパイ用)

■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人だけのグループトークの使い道と作り方
[超簡単]LINE notify を使ってみる
LINE Notify 簡単なシェルスクリプトで試してみた

■シェルスクリプト本体

image.png

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

voice_text.txt
どうしたの?大丈夫?
つらかったね。大変だったね
今まで、がんばってきたんだね
大丈夫だよ。心配ないさ
いつもそばにいるよ
いつでも話聞くよ
大切なことの相談相手に選んでくれてありがとう
明日はきっとよくなるよ

大切な人を励ますシンプルな8つの言葉

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で停止しています。

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の音声変換と音声出力をシェルで一気にやる(ラズパイ用)

■結果

ラズパイ >> タイセツナコトノ ソウダンアイテニ エランデクレテ アリガトウ(野太い男性声)

ティロン♪
image.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

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8