Instantly share code, notes, and snippets.

Embed
What would you like to do?
Chromecastデバイスに喋らせるPython スクリプト

このスクリプトの動作にはPython 3.6以降と以下のライブラリが必要

  • flask
  • gtts
  • pychromecast

pip install flask gtts pychromecast

スクリプトを走らせたら
http://<server_host>:<server_port>/say?text=これはテストです のようにGETリクエストを送るとChromecastデバイスで読み上げられます. text=this is test&lang=enなどのように言語を指定することもできます. (デフォルトは日本語です.)

Windowsユーザへ

pychromecastをインストールする際に Python 3.6以降ではnetifaces のビルドに失敗することがあります.
こちらにビルド済パッケージが配布されているので
pip install .\netifaces‑0.10.6‑cp36‑cp36m‑win_amd64.whl
で回避できます.

# encoding: utf-8
import os
import time
from threading import Thread
from datetime import datetime
import pychromecast
from flask import Flask, request, send_from_directory, jsonify
from gtts import gTTS
ip_address = "192.168.2.10" # ChromecastデバイスのIPアドレス
cache_dir = "cache" # キャッシュディレクトリ名
cache_wipe_interval = 60 * 5 # キャッシュを削除する間隔(秒)
server_host = "192.168.2.2" # このスクリプトを動かすサーバのホスト名
server_port = 8888 # このスクリプトを動かすサーバのポート番号
app = Flask(__name__)
device = next(x for x in pychromecast.get_chromecasts() if x.host == ip_address)
device.wait()
def play_tts(text: str, lang: str) -> None:
tts = gTTS(text=text, lang=lang)
filename = f"{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp3"
tts.save(f"cache/{filename}")
play_mp3(f"http://{server_host}:{server_port}/cache/{filename}")
def play_mp3(url: str) -> None:
print(f"MP3 URL is {url}.")
mc = device.media_controller
mc.play_media(url, "audio/mp3")
mc.block_until_active()
@app.route("/cache/<path:path>")
def send_cache(path):
return send_from_directory("cache", path)
@app.route("/say")
def say():
text = request.args.get("text")
if not text:
return jsonify({"status": "ERROR", "message": "text is required."})
lang = request.args.get("lang") or "ja"
print(f"ChromeCast device will speak \"{text}\" in {lang}.")
play_tts(text, lang)
return jsonify({"status": "OK", "text": text, "lang": lang})
def wipe_cache_task():
print(f"Cache wiping task started. Cache wiping interval is {cache_wipe_interval} seconds.")
while True:
for path in os.listdir(cache_dir):
os.remove(f"{cache_dir}/{path}")
time.sleep(cache_wipe_interval)
if __name__ == "__main__":
if not os.path.isdir(cache_dir):
os.makedirs(cache_dir)
print("ChromeCast device is ready.")
Thread(target=wipe_cache_task).start()
app.run(host=server_host, port=server_port)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment