Raspberry Pi を使って、喋った内容を【Lineへ通知】

electric

今回は、
ラズパイに接続したスピーカーに喋った内容を、
Lineに送信していきます。

使い方として、
・子供が学校から帰って来た時の「ただいま」、を伝えることが出来る。
・用事があった時、喋って用事を伝えることが出来る。
スマホが使えなくても、気軽に、簡単にコミュニケーションが取れるようになるよ。
子供:「早く帰って来て」
子供:「宿題で分からないところがあるんだけど」
離れて暮らす両親:「今日、旅行に行ってきたよ」

あなたなら、どんな使い方をしてみます?

この記事で学べること

  • ボタン制御
  • マイク入力
  • 音声認識
  • WebAPI
  • IoT
  • マイコン
  • Linux
  • Python

やりたいこと

・ボタンを押している間、喋った内容を取得
・喋った内容を文字列に変換(音声認識)
・文字列をLineに送信

システム構成図

やることリスト

上記の「やりたいこと」をみて、
どんな作業が必要か、自分で項目を考えてみてください。
これを考えることで、「プログラミング的思考」が身に付いていきます。

番号作業項目備考
やりたいこと・システム構成図の作成
やることリストの作成処理項目の洗い出し
部品の準備
ボタンが押されたことを判断する
マイクに喋った内容を音声ファイルに保存
マイクに喋った内容を文字列に変換音声認識
7文字列をLineに送信
8まとめ以上の機能をまとめて、
やりたいことを実現する!

部品の準備

今回のシステムに必要な部品です。
不足している部品があれば購入下さい。

部品名備考
Raspberry Pi別途、電源・SDカード・HDMIケーブルが必要です。
ブレッドボード(※1)
ジャンパー線(※1)オスーメス:2本
ボタン(※1)タクトスイッチ:1個
マイク「超小型 USBミニマイク」が値段的にお薦めです。

購入に必要な部品を、
Raspberry Pi 関連に記載しています。
※1)「電子工作キット」内に全て含まれています。

ラズパイは、電源を入れただけでは起動しません。
ラズパイの起動手順の記事を参照ください。

ボタンが押されたことを判断する

以下記事「ボタンが押されたことを判断する」の章を
参照ください。
回路・配線図・プログラムの情報を書いています。

Raspberry Pi と Python を使って【天気予報】を喋らせる
今回は、ボタンを押したら、地元の天気予報を喋ってもらおうと思います。楽しそうだったら作ってみて♪この記事では以下が学べます。ボタン制御スピーカー出力PythonWebAPI(外部情報取得)音声合成(発話)やりた...

マイクに喋った内容を音声ファイルに保存

以下記事「マイクに喋った内容を音声ファイルに保存」の章を
参照ください。

Raspberry Pi と Python を使って【会話ロボット】を作ろう
今回は、雑談をする為の会話ロボットを作って行きます。楽しそうなら作ってみて♪この記事では以下が学べます。ボタン制御マイク入力スピーカー出力PythonWebAPI音声認識音声合成やりたいこと・話者がボタ...

マイクに喋った内容を文字列に変換

以下記事「マイクに喋った内容を文字列に変換」の章を
参照ください。

Raspberry Pi と Python を使って【会話ロボット】を作ろう
今回は、雑談をする為の会話ロボットを作って行きます。楽しそうなら作ってみて♪この記事では以下が学べます。ボタン制御マイク入力スピーカー出力PythonWebAPI音声認識音声合成やりたいこと・話者がボタ...

文字列をLineに送信

ラズパイからLineに文字列を送信するのは意外に簡単で、
Lineから Access Tokenを取得し、
LineのAPIに、 Access Token と通知したい文字列を設定すれば完了です。

LineからAccess Token取得

Lineの Access Token を取得するには、
以下、Line Notifyという連携サービスから取得します。
https://notify-bot.line.me/my/

■以下から、ご自身のLINEアカウントでログイン下さい。

■ 以下画面の「トークンを発行する」ボタンを押す。
Line のAPI仕様書を見たい場合は、「LINE Notify API Document」ボタンから参照ください。

■「トークン名」を入力、「1:1でLINE Notifyから通知を受け取る」を選択肢、
「発行する」ボタンを押します。

■ 「コピー」ボタンを押して、トークンをコピーします。
コピーしたトークンは、後でプログラムで使用するので、
別のテキストファイルに保存ください。

はい、以上で Access Token の取得は完了です。
簡単でしたね。

プログラム

以下ディレクトリ通り、ディレクトリとファイルを作成する。
この章では、以下赤字のファイルを修正する。

/home/pi/work/speech_line/
└line.py

line.py

以下、
“Your Access Token” の箇所に、上記で取得した Access Token の文字列を設定下さい。

# -*- coding: utf-8 -*-
import requests


def line(message: str):
    url = "https://notify-api.line.me/api/notify"
    token = "Your Access Token"
    headers = {"Authorization": "Bearer " + token}

    params = {"message":  message}
    r = requests.post(url, headers=headers, params=params)
    print(r.text)


if __name__ == '__main__':
    line("\nラズパイから送信")

実行

以下コマンドでプログラムを実行します。

python3 line.py

結果として、
Lineに「ラズパイから送信」の文字列が通知されれば成功です!

まとめ

以上の機能をまとめて、
やりたいことを実現していきます。

プログラム

以下の通り、ディレクトリとファイルを作成します。
この章では、以下赤字のファイルを修正します。
赤色以外のファイルは、上記の章で出てきた内容と同じです。

/home/pi/work/speech_line/
├line.py
├record.py
├speech2text.py
└app.py

app.py

# -*- coding: utf-8 -*-
from speech2text import speech2text
import RPi.GPIO as GPIO
import time
import sys
import record
import line

# LED_GPIO 変数に 24をセット
SW_GPIO = 24

# GPIO.BCMを設定することで、GPIO番号で制御出来るようになります。
GPIO.setmode(GPIO.BCM)

# GPIO.INを設定することで、入力モードになります。
# pull_up_down=GPIO.PUD_DOWNにすることで、内部プルダウンになります。
GPIO.setup(SW_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

if __name__ == '__main__':
    # Audioインスタンスの作成
    audio = record.Audio()
    while True:
        try:
            # ボタン押し
            if GPIO.input(SW_GPIO) == 1:
                # マイクに喋った内容を音声ファイルに保存
                print('start record')
                audio.start_record()
                while GPIO.input(SW_GPIO) == 1:
                    time.sleep(1)  # 1秒間待つ
                audio.stop_record()
                print('stop record')

                # 音声ファイルをテキスト変換
                text = speech2text()
                # 出力
                utterance = ''
                for result in text.results:
                    print("Transcript: {}".format(result.alternatives[0].transcript))
                    utterance = result.alternatives[0].transcript
                    break

                # 喋った内容をLineに通知する。
                if utterance:
                    line.line(utterance)

                time.sleep(1)   # 1秒間待つ

        # Ctrl+Cキーを押すと処理を停止
        except KeyboardInterrupt:
            audio.stop_record()
            # ピンの設定を初期化
            # この処理をしないと、次回 プログラムを実行した時に「ピンが使用中」のエラーになります。
            GPIO.cleanup()
            sys.exit()

実行

コマンドラインから、先程作成した app.py のディレクトリに移動し、
以下コマンドでプログラムを実行します。

python3 app.py

以下の通り、ボタンを押している間に喋った内容が
Lineに通知されたら成功です。

最後に

如何だったでしょうか?

・ボタンが押されたことを検知出来た時、
・喋った内容が文字列として変換出来た時、
・喋った内容が、Lineに通知された時、
感動しましたよね♪
この感動を一人でも多くの人に味わってもらいたいな。

自分で作ったものが動くって楽しいですよね♪

この記事に関連し、
・Lineに送った内容をラズパイで喋らせる
を作っても楽しいですね。

以下記事では他にも色んな電子工作を作っています。
あなたが作りたいモノのヒントがあれば嬉しいです。

電子工作(Raspberry Pi でできること)
このサイトは、「モノづくりの楽しさをあなたに伝えたい」との思いで作っています。「難易度:☆☆☆」の章に、Raspberry Pi(マイコン) と Python(プログラミング言語)を使ったおもちゃの作り方を書いています。あ...

記事を更新するとTwitterでつぶやきます。
フォローしてもらうと、記事を書くモチベーションが上がります。
下のTwitterアイコンからフォローお願いします。

不明な点があればページTOPの「お問い合わせ」にてご連絡下さい。

もし一人で作るのが難しかったら、
一緒に作るサービスをしています。
お気軽に ページTOPの「お問い合わせ」にてご連絡下さい。

タイトルとURLをコピーしました