0
どのような問題がありますか?

投稿日

Google Homeを喋らせたい人のメモ

Google Homeとおしゃべりするための調査

どうやら、pychromecastというものを使えば、PythonでGoogleHomeが制御できるらしい。

pychromecast

Chromecastとの通信をしてくれるライブラリ.

Check out Home Assistant for a ready-made solution using PyChromecast for controlling and automating your Chromecast or Cast-enabled device like Google Home.

とREADMEにあるとおり、Google HomeはGoogleCast仕様に基づくらしく、このライブラリでそのまま拾うことができます。

Google Home のIPを調べる方法

同じWifiネットワーク上になくて見つからない。

スマホのGoogle Homeアプリ → デバイスを選択(うちのは"リビングルーム"という名前だった) → 右上歯車 → デバイス情報 → WiFiやIPアドレスなどの情報が分かる。

どうやら、PCが5GHz、GoogleHomeが2.4GHzに繋がっていたので、一旦PCを2.4GHzに設定して試してみる。

再び、pychromecast

いろんなQiita記事があったが、最新情報が記載されているGitHubが一番参考になった。
https://github.com/home-assistant-libs/pychromecast

import pychromecast

# 名前が"リビングルーム"のデバイスを探す
chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=["リビングルーム"])
print(chromecasts)
[Chromecast(
    'unknown',
    port=8009,
    cast_info=CastInfo(
        services={ServiceInfo(
            type='mdns', 
            data='Google-Home-Mini-dcXXXXXXXXXXXXXXXXXXXXXXXX._googlecast._tcp.local.')
            }, 
        uuid=UUID('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'), 
        model_name='Google Home Mini', 
        friendly_name='リビングルーム', 
        host='192.168.XX.XX', 
        port=XXXX, 
        cast_type='audio', 
        manufacturer='Google Inc.')
    )
]

検索したChromeCastを"cast"として、自分の名前を出力する。

cast = chromecasts[0]
# Start worker thread and wait for cast device to be ready
cast.wait()
print(cast.name)

'リビングルーム'

状態を表示する

print(cast.status)
CastStatus(
    is_active_input=None, 
    is_stand_by=None, 
    volume_level=0.30000001192092896, 
    volume_muted=False, 
    app_id=None, 
    display_name=None, 
    namespaces=[], 
    session_id=None, 
    transport_id=None, 
    status_text='', 
    icon_url=None, 
    volume_control_type='master')

音を鳴らしてみる

適当なサンプルのmp3鳴らしてみる。

mc = cast.media_controller
cast.wait()
mc.play_media('https://samplelib.com/lib/preview/mp3/sample-3s.mp3','audio/mp3')
print(mc.status)

gTTSで任意の言葉の音声を作成

Google Text-to-speech。テキストをmp3に変換してくれる。

from gtts import gTTS
tts = gTTS(text='ハローワールド', lang='ja')
tts.save('./hello_world_ja.mp3')

「ハローワールド」と日本語音声になってる!

Python初心者向けBottleの使い方

Bottleを使ってみる。Flaskみたいなモノらしい。

こちらの記事を参照:https://blog.codecamp.jp/programming-python-bottle
Python製の Webフレームワークで、 「Python で Webサイト」、 「Python で Webアプリ」 といえば最初に登場するもの。

ということで、
Pythonを使って、Google Homeに喋らせてみる
を心からリスペクトして、必要な部分のみ変更。

# -*- coding: utf-8 -*-
import os
from pathlib import Path
from bottle import Bottle, request, template, static_file
from gtts import gTTS
import pychromecast

BASE_DIR = Path(__file__).parent
TALK_DIR = BASE_DIR / 'var'
app = Bottle()

@app.route('/talks/<file_path:path>')
def post_talk(file_path):
    return static_file(file_path, root=TALK_DIR)

@app.route("/")
def hello():
    return "Hello World"
    # [/index]へアクセスがあった場合に「html.index」を返す

@app.route('/form', method='GET')
def get_talk_form():
    content = BASE_DIR / 'template.html'
    text = request.forms.text or ''
    lang = request.forms.lang or 'ja'
    return template(content.open().read(), lang=lang, text=text)


@app.route('/form', method='POST')
def post_talk_form():
    text = request.forms.text
    lang = 'ja'
    text_token = generate_talk(text, lang)
    url = f"http://{app.host}:{app.port}/talks/{text_token}"
    # 名前が"リビングルーム"のデバイスを探す
    chromecasts, browser = pychromecast.get_listed_chromecasts(friendly_names=["リビングルーム"])
    cast = chromecasts[0]
    mc = cast.media_controller
    print(url)
    cast.wait()
    mc.play_media(url, 'audio/mp3')
    return get_talk_form()

def generate_talk(text_form, lang='ja'):
    # text_token = hashlib.sha256((lang + text).encode()).hexdigest()
    text_token = 'test.mp3'
    talk_path = TALK_DIR / text_token
    print(text_form + ',' + lang)
    tts = gTTS(text=str(text_form), lang=lang)
    # tts = gTTS(text='こんにちは', lang='ja')
    tts.save(talk_path)
    return text_token

if __name__ == '__main__':
    if not TALK_DIR.exists():
        TALK_DIR.mkdir()
    app.host = os.environ.get('SERVER_HOST', '192.168.XX.XX')
    app.port = os.environ.get('SERVER_PORT', '8080')
    app.run(host=app.host, port=app.port, reloader=True)
<h1>Google Home notifier</h1>
<hr />
<form method="POST">
    <p>
        Text:
        <textarea name="text">{{text}}</textarea>
    </p>
    <p>
        <button>Speak</button>
    </p>
</form>

image.png

しゃべった!

このあとやりたいことメモ

  • 誰か帰ってきたらしゃべる
  • センサと連動してしゃべる
  • リマインド・通知機能として使ってみる
  • 妻に日頃の感謝を伝える

どんな使い方が便利かあまりイメージがつかなくなってきた…。

新規登録して、もっと便利にQiitaを使ってみよう

  1. あなたにマッチした記事をお届けします
  2. 便利な情報をあとで効率的に読み返せます
ログインすると使える機能について
kiwsdiv
社畜の割には自由です

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
0
どのような問題がありますか?
新規登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
新規登録ログイン
ストックするカテゴリー