LoginSignup
3
2

More than 5 years have passed since last update.

mp3をdownloadせずにPythonからGoogleHomeを喋らせる

Last updated at Posted at 2018-05-20

Python から GoogleHome を喋らせようと調べたところ、こちらの記事が見つかりました。
 Pythonを使って、Google Homeに喋らせてみる
しかし使用する gTTS は指定したテキストを mp3 ファイルとして download するライブラリであるため、
それを bottleFlask などの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文字ずつに分解してリクエストしてファイルに書き出すことを
繰り返していますが、このコードはそんなことはしていませんので、適切な長さの文章を都度渡して
喋らせる必要があります。

3
2
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
3
2