Python から GoogleHome を喋らせようと調べたところ、こちらの記事が見つかりました。
Pythonを使って、Google Homeに喋らせてみる
しかし使用する gTTS
は指定したテキストを mp3 ファイルとして download するライブラリであるため、
それを bottle
や Flask
などのWebフレームワークを使って URL としてアクセスできる状態にして
GoogleHome に渡す、という形になっています。
もちろんそれでも喋りますが、RaspberryPi の場合に SDカードへの書き込みを増やしたくなかったので、
gTTS のコードを参考に mp3 を download する前の URL を直接 GoogleHome に渡すコードを書いてみました。
必要なライブラリ
- pychromecast
- gTTS_token
gtts_token は gTTS からも使っているライブラリで、google翻訳用のトークンを生成してくれます。
実行用コード
import pychromecast
from gtts_token import gtts_token
import urllib.parse
googlehome_name = "MyDevice"
chromecasts = pychromecast.get_chromecasts()
cast = next(cc for cc in chromecasts if cc.device.friendly_name == googlehome_name)
def play_tts(text, lang='ja'):
token = gtts_token.Token()
tk = token.calculate_token(text)
payload = {
'ie' : 'UTF-8',
'q' : text,
'tl' : lang,
'total' : 1,
'idx' : 0,
'textlen' : len(text),
'tk' : tk,
'client' : 't',
'ttsspeed' : 1.0
}
params = urllib.parse.urlencode(payload, quote_via=urllib.parse.quote)
url = 'https://translate.google.com/translate_tts?{}'.format(params)
cast.wait()
mc = cast.media_controller
mc.play_media(url, 'audio/mp3')
使い方
説明するまでもないですが、googlehome_name
に喋らせたい GoogleHome の名前を入れた上で
play_tts() を呼び出せばそのとおりに喋ります。
google翻訳の制約か何かで gTTS は 100文字ずつに分解してリクエストしてファイルに書き出すことを
繰り返していますが、このコードはそんなことはしていませんので、適切な長さの文章を都度渡して
喋らせる必要があります。