6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonでGoogle Homeに任意の言葉を発話させる(flask版)

Last updated at Posted at 2019-03-31
Qiita投稿用_key.png

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にしておくことで、他のホストからアクセス可能にします。

mp3server.py
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の音量が適切に設定されていれば、「こんにちは」と話すでしょう。

main.py
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実行したかったのでね。それにこの方がソースの説明も簡単ですし。

参考になれば幸いです。

参考

Pythonを使って、Google Homeに喋らせてみる

6
10
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
6
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?