Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What is going on with this article?
@sousoumt

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

More than 1 year has passed since last update.

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に喋らせてみる

10
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
sousoumt
Node.js/Python/Actions On Google/Dialogflow/Firebase/Arduino/Raspberry Pi/Redis/Lambda/SORACOM

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
10
Help us understand the problem. What is going on with this article?