TL;DR(まとめ)
- gTTS,pychromecastでGoogleHomeに任意の言葉を発話させた
- Node.jsのgoogle-home-notifierを使わず、Pythonのみで構築した
- 発話mp3ファイルを提供するために、flaskサーバをRaspberry Pi上に用意した
前提(環境)
機材
Google Homeが存在するものとします。(ipは192.168.1.3)※Google Homeアプリから把握しましょう。
Raspberry Pi3B+を開発環境、及びmp3提供元とします。(ipは192.168.1.7)
主要ソフトウェア
python 3.5
pychromecast 3.0.0
gTTS 2.0.3
flask 1.0.2
pipでインストールしてください。venvで別環境作るほうが私は好きですが。
構築内容
pychromecastを使えば、任意のmp3ファイルを再生できます。
ただ、mp3ファイルをGoogle Home内に配置できません。
そのため、mp3ファイルはRaspberry Pi内に用意して、それをWebサーバが提供する形にします。
任意の言葉をmp3ファイルにするためには、gTTS(google text to speech)を使います。
必要なところから読んでください。
構築手順
各種Pythonモジュールインストール
事前準備1/3
$ pip install pychromecast, gTTS, flask
発話させるmp3ファイルを作成
事前準備2/3
任意のディレクトリに移動して、以下を実行します。
これだけで音声ファイルが出来上がります。便利。
$ python
>>> from gtts import gTTS
>>> tts = gTTS(text='こんにちは', lang='ja')
>>> tts.save('greeting.mp3')
Flaskサーバの立ち上げ
事前準備3/3
mp3ファイルを配置した箇所と同じディレクトリに以下のmp3server.pyを作成しましょう。
FlaskでWebサーバを用意し、GETのリクエストに対応するmp3ファイルがあったらそれを返す形です。
hostを0.0.0.0にしておくことで、他のホストからアクセス可能にします。
import os
from flask import Flask, make_response
app = Flask(__name__)
@app.route("/mp3/<string:file_name>", methods=['GET'])
def getMP3File(file_name):
response = make_response()
if not os.path.exists(file_name):
return response
response.data = open(file_name, "rb").read()
response.headers['Content-Disposition'] = 'attachment; filename=' + file_name
response.mimetype = 'audio/mp3'
return response
if __name__ == '__main__':
app.run(debug=False, host='0.0.0.0', port=8080)
作成したらWebサーバとしてバックグラウンド実行しておきましょう。
$ nohup python mp3server.py > ~/out.log &
main
さていよいよmain部分です。以下main.pyファイルを作成したら
python main.pyで実行してください。「XXX」で囲まれている部分を環境に合わせて設定してください。
mp3ファイルが存在し、かつGoogleHomeの音量が適切に設定されていれば、「こんにちは」と話すでしょう。
import pychromecast
def send_to_chromecast(file_name, target_cast_ip, mp3server_ip_port):
# mp3 file path.(hosted on raspberry pi)
mp3_url = 'http://' + mp3server_ip_port + '/mp3/' + file_name
cc = pychromecast.Chromecast(target_cast_ip)
cc.wait()
mc = cc.media_controller
mc.play_media(mp3_url,'audio/mp3')
return
def main():
file_name = 'greeting.mp3'
send_to_chromecast(file_name = file_name, target_cast_ip='XXX192.168.1.3XXX', mp3server_ip_port='XXX192.168.1.7:8080XXX')
if __name__ == '__main__':
main()
main()関数の部分でsend_to_chromecast()関数を呼び出していますが、
呼び出し直前部分でgTTSによる音声ファイル作成のコードを入れると任意の言葉を発話しますね。
なお、Flask部分をわざわざ分割したのは再利用性を気にしたためです。
実際後でmain.pyの方をcron実行したかったのでね。それにこの方がソースの説明も簡単ですし。
参考になれば幸いです。