Androidのメモとか

ポキオの日記です。今日も遅延してない。

Raspberry Pi + Speaker pHat で京急の運行情報を喋らせてみる

OK、京急

Raspberry Pi Speaker pHat

ノリで買ったSpeaker pHat

ちょっと前にこれを買いました。

Pimoroni Speaker pHAT - スピーカー pHAT キット

Pimoroni Speaker pHAT - スピーカー pHAT キット

  • メディア: エレクトロニクス

Lチカ、電子ペーパー、と来たら、次は音。とりあえずスピーカーをチョッパヤで鳴らしてみたかったのでこれを購入。Raspberry Piにスピーカーが付けば、音を鳴らせることもできるし、喋れるし、なんでもできそうです。

とりあえず環境構築

github.com

とりあえず、GPIOで接続したSpeaker pHatから音が出るようにしなければなりません。上記の公式レポジトリの情報をもとに、以下のスクリプトを実行。

curl -sS https://get.pimoroni.com/speakerphat | bash

簡単ですね。この状態で、英語を喋らせるだけなら、espeakコマンドを叩けばいいだけで、

espeak shithole

とか、汚い言葉を喋らせることも可能です。ただ、日本語のText-To-Speechには対応していません。そこで、gTTSというPythonパッケージをインストールしてみることに。

sudo pip install gTTS

これで完了。mp3ファイルとしてアウトプットされるので、これをコマンドラインから簡単に再生するために、mpg321もインストールしました。

sudo apt install mpg321

aptpipも楽チンで最高ですね。

早速実装

gTTSを使う関係上、メインのコードはPythonで書いていきます。

unkou.keikyu.co.jp

上記サイトの運行情報の文字列だけパースして、gTTSでmp3ファイルを生成、それをmpg321で再生するコードを書いてみました。

# coding=utf-8

import urllib2
import os
from gtts import gTTS
from HTMLParser import HTMLParser


class KeikyuUnkoParser(HTMLParser):

    def __init__(self):
        HTMLParser.__init__(self)
        self.flag = False
        self.unko = ""

    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        if tag == "div" and "class" in attrs and attrs["class"] == "unko-panel":
            self.flag = True

    def handle_data(self, data):
        if self.flag:
            self.unko = self.unko + data

    def handle_endtag(self, tag):
        self.flag = False

    def get_unko(self):
        return self.unko.replace("\n", "").replace("\r", "").decode("utf-8")


if __name__ == "__main__":

    url = "http://unkou.keikyu.co.jp/"

    response = urllib2.urlopen(url)

    parser = KeikyuUnkoParser()
    parser.feed(response.read())

    parser.close()
    response.close()

    tts = gTTS(text=parser.get_unko(), lang='ja')
    tts.save("unko.mp3")
    os.system("mpg321 unko.mp3")

unkoとは運行のことです、念のため。

どんな感じで喋るの?

京急運行情報を #speakerphat を使って#raspberrypi に喋らせてみた

A post shared by pokio (@pokiiiiio) on

たまたま、日ノ出町駅で人身事故が起こった後だったので、淡々と運行情報を喋ります。ちょっとぎこちない感じも否めなくはないですが、ちょっと鈍臭くて、逆に可愛いですね。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。