
Pepperで天気APIを使用してみた
こんにちは。
AI coordinatorの清水秀樹です。
Pepper入門用として、天気APIを使用したPepperアプリを作成しました。

興味がある方は、以下からプロジェクトファイルをダウンロードして使ってみてください。
ダウンロードはこちら
仕様の説明
バーチャルペッパーでも、Pepper実機でも動作確認しています。
実装にあたっては特に難しいことはしていません。
有した機能は以下の3つです。
- ペッパーが人の声を聴きとれるように、JSONファイルで都道府県と市区町村を読み込ませます。
- livedoorお天気情報APIから、お天気情報を取得できるようにしています。
- 音声入力がないと終了します。
以上です。
都道府県と市区町村のJSONファイルは、東京・神奈川県・茨城県のみ作成しました。
他の都道府県の追加はご自由にどうぞ。
[{"pref": "茨城県", "city1": "水戸", "city1-cd": "080010", "city2": "土浦", "city2-cd": "080020", "city3": "", "city3-cd": ""},
{"pref": "神奈川県", "city1": "横浜", "city1-cd": "140010", "city2": "小田原", "city2-cd": "140020", "city3": "", "city3-cd": ""},
{"pref": "東京", "city1": "東京", "city1-cd": "130010", "city2": "大島", "city2-cd": "130020", "city3": "八丈島", "city3-cd": "130030"}]
livedoorのAPI仕様は以下を参考にしてください。
プロジェクトファイルの説明
簡単にどんなフローなのか説明します。
weatherボックスの仕様

上記のフローは以下の順で処理します。
- 「ファイル読込」ボックスからJSONファイルを読み込み、各都道府県と市区町村とAPIに投入する地区コードを取得します。
- 「天気地域取得」ボックスでJSONファイルの都道府県と市区町村データを分離し、それぞれを次の「県取得」ボックスと「市取得」ボックスに受け渡します。
都道府県と市区町村データを分離する理由は、Pepperが音声で都道府県を聞き取った後に、その都道府県に該当する市区町村を聞き取れるようにするためです。
県取得ボックスの仕様

上記フローの仕組みを紹介します。
- Speech Recoボックスに先ほど分離した都道府県を入力し、Pepperが音声を聞き取れるようにします。
- SayボックスではPepperが「どの県の天気ですか?」と質問するように設計しています。
- Waitボックスでは、音声が一定時間取得できないような場合を想定して作成しており、音声入力が取得できない場合には、Say(1)ボックスで「返事がない。ただのしかばねのようだ。」とPepperにしゃべらせて、処理を終了するようにしています。
市取得ボックスの仕様

上記フローは少し複雑そうに見えますが、大したことしていません。
- 1次細分区名ボックスでは、前項の県取得ボックスで聞き取った都道府県に該当する市区町村をJoinボックスに受け渡し、次のSpeech Reco.(1)で受け渡してもらった市区町村を聞き取れるようにします。
- セリフ作成ボックスと次のAnimeated Say Textボックスで、市区町村を含めた質問を投げかけるように実装しています。
- 市区町村を聞き取ったら、いよいよWeatherボックスに制御が渡り、天気APIから天気情報を取得します。(以下サンプルソース)
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
#put initialization code here
pass
def onUnload(self):
#put clean-up code here
pass
def onInput_on_weather_cd(self, p):
self.data = p
def onInput_onStart(self,p):
#self.onStopped() #activate the output of the box
import urllib2, sys
import json
for elem in self.data:
if elem[1] == p:
citycode = elem[2]
elif elem[3] == p:
citycode = elem[4]
else:
if elem[5] == p:
citycode = elem[6]
resp = urllib2.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read()
resp = json.loads(resp)
for forecast in resp['forecasts']:
if (forecast['dateLabel'].encode('utf8')) == "今日":
s= p.decode('utf8') +'の'.decode('utf8') + forecast['dateLabel'] + \
'の天気は'.decode('utf8') + forecast['telop'] + 'です'.decode('utf8')
break
self.onStopped(s.encode('utf8'))
def onInput_onStop(self):
self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
self.onStopped() #activate the output of the box
最後はダイアログで締めくくる
一通りの処理を終えPepperが天気情報を答えたら、その後はダイアログにて処理を継続するのか終了するのか質問するように設計しています。

ダイアログは以下のように作成しています。
topic: ~Exit_conditions()
language: jpj
concept:(yes) [はい お願いします おねがい よろしく]
concept:(Prefecture)[茨城県 東京 神奈川県]
concept:(no) [いや いいえ いいです またこんど]
u: (e:onStart) 他の県もききますか?
u1: (~yes)
$onLoop=1
u1: (~Prefecture)
$onPrefecture= $Dialog/LastInput
u1: (~no) そうですかあ。それではまた。
$onStopped=1
u1:(e:Dialog/NotSpeaking10) 返事がない。ただのしかばねのようだ
$onStopped=1
会話の分岐を作成する上で、ダイアログは大変便利ですね。
以上で処理の大まかな説明は終わりです。
Pepper単体でのフローになれたら、APIを使ってみましょう
デフォルトで準備してあるボックスライブラリだけでは、かなり限定的なアプリしか作成できません。
しかしながら、外部サービスのAPIと連携することでPepperは飛躍的にできること増えます。
Pepperの動かしかたになれたら、是非APIを活用したアプリの作成にチャレンジしてみてください。
設計の幅を大きく広げることができるようになりますよ。
それではまた。
LEAVE A REPLY