恥ずかしがり屋さんの為のスマートスピーカーお助けガジェット


プロローグ

なんやかんや流行っていると噂のスマートスピーカー。
しかし、私のような恥ずかしがり屋さんは家ですらスマートスピーカーに喋りかけるのも恥ずかしい!
ってなわけで、そこらへんをどうにかこうにかしてくれる心強い味方を作る事に。

なお、私は電子工作素人なので、大間違いや意味わからん状態な部分があるかと思いますので、ご了承下さい。

イメージ

RaspberryPiにボタンとスピーカーを設置。
ボタンを押すと、スピーカーから「OK, Google. 今日の天気は?」みたいなのが流れる。
予定予定

モノ

今回は、以下を使用します。

  • RaspberryPi zero WH
  • ボタン
  • スライドスイッチ
  • スピーカー
  • その他諸々

もちろん、スマートスピーカーもです!

作業

RaspberryPiのセットアップ

OSのセットアップは他の方々が分かりやすく書かれた記事がたくさんあるので割愛します。

WiringPiのインストール

GPIO状態とか確認したい為、WiringPiをインストールします。
※参考ページ:Raspberry PiのGPIO制御方法を確認する(GPIO制御編その2)

インストール完了したら、状態を確認してみます。

pi@raspberrypi:~ $ gpio readall
 +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 1 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+

ふむふむ、よく分かりません。

ボタンの取り付け

とりあえずいけそうなので、ボタンを取り付けます。
なお、プルアップ設定というのが必要らしいですが、既にreadallで出力した表のVが1となっているところを使用します。
※プルアップ設定を全く理解していませんが、今回は作りを優先します。
※参考ページ:ラズパイでシャットダウンボタンを付ける(ついでに起動ボタン)

以下のような感じで、今回はGNDとGPIO15(BCMが15のところ)に取り付けます。

確認確認

# ボタン未押下時
pi@raspberrypi:~ $ gpio -g read 15
1
pi@raspberrypi:~ $ 

# ボタン押下時
pi@raspberrypi:~ $ gpio -g read 15
0
pi@raspberrypi:~ $ 

おー。

スライドスイッチの取り付け

スマートスピーカーによって、起動させる為の第一声が異なると思いますので、スライドスイッチで制御しようと思います。
ボタンの取り付けを参考に、適当に付けてみました。
※ボタンももう一つ追加してみました。

うーむ、見辛い配置。
スライドスイッチがちゃんと配置できたか確認してみます。

# スイッチを上に移動(内側、ボタン側)
pi@raspberrypi:~/smart $ gpio -g read 16
0
pi@raspberrypi:~/smart $ gpio -g read 20
1
pi@raspberrypi:~/smart $ 

# スイッチを下に移動(外側)
pi@raspberrypi:~/smart $ gpio -g read 16
1
pi@raspberrypi:~/smart $ gpio -g read 20
0
pi@raspberrypi:~/smart $ 

うまくいきました。

スピーカーの取り付け

さてさて、いよいよスピーカーです。
が、今回は家にあったBluetoothスピーカーを使用します。
参考ページまんまを実施します。
※参考ページ:Raspberry piでbluetoothスピーカーを鳴らす

本当はスピーカーもGPIOに取り付けて鳴らしたかったのですが、私の能力ではできませんでした…

プログラミング

取り付けが完了したので、制御の為のプログラミングを開始します。

まずは日本語の読み上げの設定を行います。
jtalkというモジュール?をインストールします。
※参考ページ:OpenJTalk + python で日本語テキストを発話

なお、今回はbluetoothスピーカーの関係上か、aplayが微妙らしいので、以下の様に修正しています。

変更前
aplay = ['aplay','-q','open_jtalk.wav']
wr = subprocess.Popen(aplay)
変更後
paplay = ['sudo','paplay','open_jtalk.wav']
wr = subprocess.Popen(paplay)

jtalkの設定が完了したら、一旦ボタン周りの確認の実装をしてみます。
実装の順番がグチャグチャですね…
※参考ページ:「ボタンの取り付け」時の参考ページと同一

#coding: utf-8
import time
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)

GPIO.setup(15,GPIO.IN,pull_up_down=GPIO.PUD_UP)

while True:
    if GPIO.input(15) == 0:
        print "Push"
    else:
        print "None"

    time.sleep(0.1)

実行してみます。
ボタン押下時は「Push」と表示されるはずです。

pi@raspberrypi:~/smart $ python button.py 
None
None
Push #ボタン押下中
Push #ボタン押下中
None
None

ほいでは、全体を書いていきます。

#coding: utf-8
import time
import RPi.GPIO as GPIO
import jtalk

GPIO.setmode(GPIO.BCM)

GPIO.setup(15,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(24,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(16,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(20,GPIO.IN,pull_up_down=GPIO.PUD_UP)

txt = '' 
pattern = ['今日の天気は?', '今日は何曜日?']

def checkSlide():
    if GPIO.input(16) == 0:
        return 'オーケーグーグル,' + txt
    elif GPIO.input(20) == 0:
        return 'アレクサ,' + txt
    else:
        return ''

while True:
    if GPIO.input(15) == 0:
        txt = checkSlide() + pattern[0]
        print txt
        jtalk.jtalk(txt)
        time.sleep(1)
    elif GPIO.input(24) == 0:
        txt = checkSlide() + pattern[1]
        print txt
        jtalk.jtalk(txt)
        time.sleep(1)

    time.sleep(0.1)
    txt = ''

こんな感じにしてみました。

では、動かしてみます!↓動画です。

IMAGE ALT TEXT HERE

やりました。

では、最後にスマートスピーカーがこれを認識してくれるかです!
が、ひとつ気がつきました。

私、スマートスピーカー持っていませんでした。
持っていませんでした。

うっかり八兵衛ですね。

まとめ

  • 初めてちゃんとした?記事で色々変な気がする。
  • 先輩方々の知識に頼りすぎ?
  • 電子工作だけでなく、プラグラミングも素人の様!
  • モニターも付けたい。持ち運びできるようにもしたい。