今回は、
ラズパイに接続したスピーカーに喋った内容を、
Lineに送信していきます。
使い方として、
・子供が学校から帰って来た時の「ただいま」、を伝えることが出来る。
・用事があった時、喋って用事を伝えることが出来る。
スマホが使えなくても、気軽に、簡単にコミュニケーションが取れるようになるよ。
子供:「早く帰って来て」
子供:「宿題で分からないところがあるんだけど」
離れて暮らす両親:「今日、旅行に行ってきたよ」
あなたなら、どんな使い方をしてみます?
この記事で学べること
- ボタン制御
- マイク入力
- 音声認識
- WebAPI
- IoT
- マイコン
- Linux
- Python
やりたいこと
・ボタンを押している間、喋った内容を取得
・喋った内容を文字列に変換(音声認識)
・文字列をLineに送信
システム構成図
やることリスト
上記の「やりたいこと」をみて、
どんな作業が必要か、自分で項目を考えてみてください。
これを考えることで、「プログラミング的思考」が身に付いていきます。
番号 | 作業項目 | 備考 |
1 | やりたいこと・システム構成図の作成 | |
2 | やることリストの作成 | 処理項目の洗い出し |
3 | 部品の準備 | |
4 | ボタンが押されたことを判断する | |
5 | マイクに喋った内容を音声ファイルに保存 | |
6 | マイクに喋った内容を文字列に変換 | 音声認識 |
7 | 文字列をLineに送信 | |
8 | まとめ | 以上の機能をまとめて、 やりたいことを実現する! |
部品の準備
今回のシステムに必要な部品です。
不足している部品があれば購入下さい。
部品名 | 備考 |
Raspberry Pi | 別途、電源・SDカード・HDMIケーブルが必要です。 |
ブレッドボード(※1) | |
ジャンパー線(※1) | オスーメス:2本 |
ボタン(※1) | タクトスイッチ:1個 |
マイク | 「超小型 USBミニマイク」が値段的にお薦めです。 |
購入に必要な部品を、
Raspberry Pi 関連に記載しています。
※1)「電子工作キット」内に全て含まれています。
ラズパイは、電源を入れただけでは起動しません。
ラズパイの起動手順の記事を参照ください。
ボタンが押されたことを判断する
以下記事「ボタンが押されたことを判断する」の章を
参照ください。
回路・配線図・プログラムの情報を書いています。
マイクに喋った内容を音声ファイルに保存
以下記事「マイクに喋った内容を音声ファイルに保存」の章を
参照ください。
マイクに喋った内容を文字列に変換
以下記事「マイクに喋った内容を文字列に変換」の章を
参照ください。
文字列を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に送った内容をラズパイで喋らせる
を作っても楽しいですね。
以下記事では他にも色んな電子工作を作っています。
あなたが作りたいモノのヒントがあれば嬉しいです。
記事を更新するとTwitterでつぶやきます。
フォローしてもらうと、記事を書くモチベーションが上がります。
下のTwitterアイコンからフォローお願いします。
不明な点があればページTOPの「お問い合わせ」にてご連絡下さい。
もし一人で作るのが難しかったら、
一緒に作るサービスをしています。
お気軽に ページTOPの「お問い合わせ」にてご連絡下さい。