シスコの様々な製品には、 API があり、簡単に外部のプログラムから制御できるようになっています。ただ、「具体的にどのようなものができるのか?」といった疑問を持っている方が多いようです。今回は、シスコ製品が持つ API を利用したプログラム例として、東京と大阪で開催された 「Cloud Days 2018」のシスコ ブースで展示していた「インスタ映え度判定アプリ」を解説します。
「インスタ映え度判定アプリ」デモの概要
「インスタ映え度判定アプリ」は、顔写真を Cisco Spark へ投稿すると、Bot が写真を人工知能(AI)で解析して「インスタ映え度」を 100 点満点で採点するというものです。採点結果は「あなたのスコアは〇〇点です」と Cisco Spark のチャット画面にテキストで表示されます。より幸せそうに見える顔の判断のため、顔の表情や角度、写っている物などがスコアに反映されるようになっています。
Cloud Days 2018 の東京会場および大阪会場では、仮想化基盤として Cisco HyperFlex を利用して、アプリケーション用の Docker 基盤、 SwiftStack 、 Cassandra の環境を構築しました。
デモの手順
このデモは、会場のお客様に参加していただきます。その流れは次のとおりです。
- 会場にいらしたお客様の写真を撮り、その写真を Cisco Spark で投稿
- 事前に登録した宛先に、更新を Cisco Spark 側から通知(HTTP POST)
- Flask で構築した Web サーバ上で下記手順のプログラムが動作
- HTTP POST されたJSON から写真の URL(Cisco Spark クラウド)を取得
- URL から写真をダウンロード
- 写真データサイズを必要に応じて小さくする(Azure への投稿に制限があるため)
- 写真データをオブジェクト ストレージ(SwiftStack)に保存
- 写真データを AI クラウド サービス(Azure)へアップロード
- AI クラウド サービスから解析結果を得る
- 解析結果を使ってスコアを計算
- スコアを No SQL データベース(Cassandra)へ保存
- スコアを Cisco Spark へ投稿
Cisco Spark からの通知の処理
Cisco Spark からは、下記 フォーマットの JSON が HTTP POST されます。
{
"id": "Y2lzY29zcGFyazovL3VzL1dFQkhPT0svZjRlNjA1NjAtNjYwMi00ZmIwLWEyNWEtOTQ5ODgxNjA5NDk3",
"name": "New message in 'Project Unicorn' room",
"resource": "messages",
"event": "created",
"filter": "roomId=Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0",
"orgId": "OTZhYmMyYWEtM2RjYy0xMWU1LWExNTItZmUzNDgxOWNkYzlh",
"createdBy": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
"appId": "Y2lzY29zcGFyazovL3VzL0FQUExJQ0FUSU9OL0MyNzljYjMwYzAyOTE4MGJiNGJkYWViYjA2MWI3OTY1Y2RhMzliNjAyOTdjODUwM2YyNjZhYmY2NmM5OTllYzFm",
"ownedBy": "creator",
"status": "active",
"actorId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
"data":{
"id": "Y2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk",
"roomId": "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0",
"personId": "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
"personEmail": "matt@example.com",
"created": "2015-10-18T14:26:16.000Z"
}
}
このなかには、メッセージの情報は記載されていません。data 要素の箇所が今回通知されたメッセージに関する情報で、ここにメッセージの ID や roomID などが含まれています。この情報を元に、下記 URL に HTTP GET することで、 HTTPS によってメッセージを取得できるようになっています。
https://api.ciscospark.com/v1/messages/#{messageId}
{messageId} の場所に、先ほどの ID を入れることで該当メッセージを取得することが可能です。上記のメッセージの例だと、下記のようなURLになります。
https://api.ciscospark.com/v1/messages/
Y2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk
下にメッセージのサンプルを参考にしてください。メッセージのテキスト情報のほか、ファイルが添付されている場合にはその URL もここに含まれています。
{
"id" : "Y2lzY29zcGFyazovL3VzL01FU1NBR0UvOTJkYjNiZTAtNDNiZC0xMWU2LThhZTktZGQ1YjNkZmM1NjVk",
"roomId" : "Y2lzY29zcGFyazovL3VzL1JPT00vYmJjZWIxYWQtNDNmMS0zYjU4LTkxNDctZjE0YmIwYzRkMTU0",
"roomType" : "group",
"toPersonId" : "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mMDZkNzFhNS0wODMzLTRmYTUtYTcyYS1jYzg5YjI1ZWVlMmX",
"toPersonEmail" : "julie@example.com",
"text" : "PROJECT UPDATE - A new project plan has been published on Box: http://box.com/s/lf5vj. The PM for this project is Mike C. and the Engineering Manager is Jane W.",
"markdown" : "**PROJECT UPDATE** A new project plan has been published [on Box](http://box.com/s/lf5vj). The PM for this project is <@personEmail:mike@example.com> and the Engineering Manager is <@personEmail:jane@example.com>.",
"files" : [ "http://www.example.com/images/media.png" ],
"personId" : "Y2lzY29zcGFyazovL3VzL1BFT1BMRS9mNWIzNjE4Ny1jOGRkLTQ3MjctOGIyZi1mOWM0NDdmMjkwNDY",
"personEmail" : "matt@example.com",
"created" : "2015-10-18T14:26:16+00:00",
"mentionedPeople" : [ "Y2lzY29zcGFyazovL3VzL1BFT1BMRS8yNDlmNzRkOS1kYjhhLTQzY2EtODk2Yi04NzllZDI0MGFjNTM", "Y2lzY29zcGFyazovL3VzL1BFT1BMRS83YWYyZjcyYy0xZDk1LTQxZjAtYTcxNi00MjlmZmNmYmM0ZDg" ],
"mentionedGroups" : [ "all" ]
}
files 要素をみると、一緒にアップロードされたファイルの URL が配列で記載されています。この URL にアクセスすれば、ファイルを取得できます。
メッセージに添付されたファイルの取得の方法を簡単にご紹介しましたが、これ以外の API の使い方については、Cisco Spark for Developers の ドキュメントをご覧ください。
ハイブリッド構成
通常、このようなシステムを構築する際には、1 つのパブリッククラウドで構成されることが多いと思います。お気づきのように今回は、プライベート クラウドとパブリック クラウドを連携させたハイブリッド構成になっています。これにより、複数のクラウドのいいとこ取りができています。
また今回は Microsoft の Azure を使っていますが、AWS、IBM Watson、Google Cloud などでも同じように画像を解析するサービスを利用することができます。それぞれ、認識の精度や含まれる結果に違いが出たのは、興味深いことでした。その一方で、様々なパブリック クラウドを試しながら、パブリック クラウドにも簡単に切り替えることもでき、非常に便利だと感じました。
プライベート クラウドは、重要なデータを保管するための安全性がメリットです。今回利用したSwiftStack は、プライベートクラウド環境に AWS の S3 同等のサービスを提供するソリューションです。HTTP でファイル操作ができ、一時的な URL を生成できる点など、多くの便利な機能があります。
まとめ
今回は、Cisco Spark と他のクラウドサービスを連携させたシステムを紹介しました。このデモは、5月24日・25日に開催される Cloud Days 2018九州、6月13日・14日に開催される Cloud Days 2018 名古屋 も展示予定です。ぜひ、シスコ ブースで実体験してみてください。