自己紹介
初めまして!石巻IoTLTのオーガナイザーの大学4年ジョグと申します.
IoTLTアドベンドカレンダー14日目の記事を担当させていただきます!
残念ながら,まだまだ東北にはIoTの情報が流れていない状況です.もし東北で何かLTしたいという方がいればなんとかご連絡していただければ幸いです
今回のネタもいずれ東京とかどこかでもLTしたいと思います!
あと,仙台は猛烈に寒くなり今日の朝起きた時の雪景色には膝から崩れ落ちました(2017/12/12)
皆さんも風邪を引かないようにお気をつけください
当初やろうとしていたもの
簡単に今回作ろうとしたものの説明をさせてもらいます.
下の図がそのシステム図です.
おおよそこの図からわかるように,みんな大好きなTwitter Streaming APIを使って,みんな大好きRaspberry Piで音声を出力して,みんな大好きなスマートスピーカーに命令を出して操作しようというものです.
「声出さずスマートスピーカーいじれるなんてIoTじゃん!!」と一人ガッテンしていました
僕はくだらないものが大好きなのでご了承ください
発生した問題
しかし,ある問題が発生してしまいました.それはお金がない問題です.これは非常に深刻でした.
Udemyのブラックフライデーセールに舞い上がり,今年の出来事の記憶をなくす行事(忘年会)が積み重なりお財布の中身も雪景色になってしまいました(2017/12月初頭)
なので,急遽作る物を少し変更したものが下の図です.
あまり中身は変わらないですね.Raspberry Piをパソコンに,スマートスピーカーを携帯に変更しました.自分はiphoneなので,Siriを起動させた状態で行いました.
詳細な技術紹介
Twitter Streaming API
これはIoTLTではおなじみの技術ですね.リアルタイムでツイートを読み込み,該当したツイートがあった場合にはレスポンスがあるというものです.下の記事を参考にさせていただきました.
PythonでTwitter Streaming APIを叩いた話
これのすごいところは,dataというパラメーターによって得たい情報を決めるできるというところです.「特定の人がツイートした時」「特定の場所でツイートされた時」「特定の単語がツイートされた時」にツイートをゲットすることができます.
Tip:気をつけたいのが,「ある単語を含んだツイート」を取得するのは現状だとできないようです(「昨日IoTLTに行ってきたよ!」みたいなもの).必ず単語の前後に半角スペースが必要みたいです.#を含んでも大丈夫なようなので,ハッシュタグには反応します.おそらく英語で前提なのでこの仕様だと思います.
今回は#IoTLTと含んだツイートなので,requestを送るところを下のように変えました.
r = requests.post(url, auth=auth, stream=True, data={"track":"IoTLT"})
一点気をつけて欲しいのは,Streaming APIを動かし続けていると途中でJSONDecodeErrorを投げてきます.なので,例外処理する必要が出てくるのでここだけお気をつけください.
Open JTalk
これを作ろうとした時に初めて知ったのですが,音声合成をおこなってくれるオープンソフトにOpen Jtalkというものがありました.実は音声合成にものすごく手こずりました.他にもIBM社のText to Speachやespeak,rospeexなどがありましたが,いろいろ検討した結果Open JTalkがよかったです.他の言語とのマッシュアップになってしまったり,提供が終了してしまったものがありました.
Open JTalkとは,テキストから音声データに変換するオープンソフトウェアで,日本語にも対応しています.こんなにすごいものなのに,あまり詳しい情報がありません涙
名古屋工業大学の研究チームが作成したそうですが,もっと押し出してくれた方が嬉しいのに...
こちらの記事を参考にさせていただきました.
Mac; OS X MavericsにOpenJTalkを導入する
macでコードから音声を喋らせる (eSpeak, OpenJTalk)
IoTLTのほとんどの方がMacだと思うのですが,homebrewで一発でインストールできます!
素晴らしい
2番目の記事を参考にしていただければなのですが,話すスピードも調整できます.少し遅くするといい感じになりました.
で,この二つをマッシュアップして完成!!
結果発表!!!
問題は動いたかどうか,ということでやってみたいと思います!!
明日はきっといいひになる #IoTLT
— 元ねりまの子 (@jogjooog) 2017年12月12日
できたーーー!結構テストしましたがなんとかできました涙
(ちなみにこのツイッターはAPI用で作ったようなものなので,ツイート自体あまりしません)
実際にやってみて反省点は
- パソコンの出力だとうまくいかないのでスピーカー使った方がいい
- 動かしているのを忘れて,急に他の人のツイートを拾った時はマジで怖い
- スマホを使ってるので,写真撮れない
やっぱりスマートスピーカー欲しいですね涙
Twitter Streaming APIやOpenJTalkとても楽しいのでぜひよろしければ他のネタに使う際にも挑戦してみてください!