スマートホームカメラスキルの作成



スマートホームカメラスキルの作成

クラウド対応カメラで機能するスマートホームスキルでは、「アレクサ、玄関のカメラを見せて」と話しかけると、ビデオストリーミングをサポートするAlexaが使えるデバイスに指定したカメラのビデオフィードが表示されます。

スマートホームスキルを作成するには、Amazon開発者ポータルでコンフィギュレーション情報を指定し、コードを追加します。このコードはAWS Lambda関数(アマゾンウェブサービスの提供サービスのひとつ)としてホストされます。スキルがAlexaから送られてくるディレクティブに応答して、カメラなどのコネクテッドデバイスと通信し、応答イベントをAlexaに返します。コネクテッドカメラ向けのスマートホームスキルを作成する場合は、次のことを理解しておく必要があります。

スマートホームスキルを作成したことがない場合は、このドキュメントを読み進める前に、関連するドキュメントを確認してください。スマートホームスキルの作成方法とLambda関数コードの記述方法を理解しておく必要があります。詳細については、次のページを参照してください。

既存のスマートホームスキルに言語サポートを追加したり、複数言語をサポートするスマートホームスキルを作成したりするには、所定の手順を踏む必要があります。詳細については、次のページを参照してください。

デバイスサポートと地域

クラウド対応カメラ向けのスキルは、メディアをストリーミングするためのURIを指定します。ユーザーのAlexaが使えるデバイスは、そのURIで見つかったコンテンツをストリーミングします。

カメラスキルがカメラフィードを表示できるデバイスの種類とロケールは次のとおりです。

言語(ロケール) サポートデバイス
英語(米国)、英語(英国)、ドイツ語 Echo Show、Echo Spot、全世代のFire TV、第2世代のFire TV Stick、Fire Tablets(第7世代以降)
英語(カナダ)、英語(オーストラリア)、英語(インド)、日本語 Echo Spot

技術要件とパフォーマンス要件

カメラは正しい形式でビデオフィードを送信する必要があります。また、セキュリティ要件とパフォーマンス要件も満たす必要があります。

カメラの技術要件とセキュリティ要件

カメラおよびビデオフィードの技術要件とセキュリティ要件は次のとおりです。

カテゴリー 要件
ストリーミングプロトコルRTSPおよびRTP
トランスポートプロトコルポート443のインターリーブされたTCP(RTPとRTSPのどちらも)
フィード暗号化TLS 1.2を用いたポート443でのTCPソケット暗号化
必須のRTSPコマンドサポートDESCRIBE、SETUP、PLAY、TEARDOWNの各コマンドは必須ですが、RFCに完全に準拠した実装が推奨されています
ビデオの形式H.264
オーディオの形式AACまたはG711
フィードの認証方法
  • 返されるカメラストリーム内でのHTTP Digest認証
RSTP URIの応答性応答はすべて、リクエストを受信してから6秒以内に発生しなければなりません

カメラスキルのパフォーマンス要件

最適なユーザーエクスペリエンスには待機時間が短いことが非常に重要です。Alexaからカメラストリームのリクエストが送信されたときのスキルの応答性と、いかに素早くカメラが応答してカメラストリームをレンダリングできるかが、待機時間にもっとも影響を及ぼします。

カテゴリー 要件 推奨事項
Lambdaスキルの応答性 応答はリクエストを受信してから6秒以内に発生する必要があります。ただし、最高のユーザーエクスペリエンスを提供するには、リクエストを受信してから1秒経過するまでに応答が発生することが望ましいです。 ストリーミングを開始するためにカメラを起動する等の操作は、バックグラウンドのタスクとして非同期的に実行することをお勧めします。
URIストリームの応答性 良好なネットワーク条件下では、TLSハンドシェイクが完了してから6秒後に最初のフレームがAlexaが使えるデバイスにレンダリングされることが望ましいです。 ストリームのキーフレームレートとバッファ時間を調節することで、起動の待機時間を最適化できます。

ローカルおよびリモート実行の推奨事項

Alexaが使えるデバイスと同じローカルネットワークにあるURIを返すべきか、インターネット接続があればどこからでもアクセスできるリモートURIを返すべきかということについて、特に要件はありません。各自のデバイス制御クラウドコンフィギュレーションに合うURIを返すようにします。どちらのURIを選んだ場合でも、TLS 1.2の使用も含め、すべての技術要件を満たしている必要があります。

一般的に、デフォルトでは、URIにはローカルでもリモートでもアクセスできません。ローカルおよびリモートでURIにアクセスできるようにするには、ドメインを購入するかポートを転送します。しかしこれらの解決策は技術的にも難しいため、ユーザーがローカルとリモートの両方でURIにアクセスする必要がある場合にのみ、実行するようにします。

カメラスキルの実装

スキルは、Alexaから送信されるディレクティブを処理できる必要があります。また、セキュリティ要件を満たしている必要もあります。スキルコードの動作は次のとおりです。

  • Alexaから送信される検出リクエストやカメラストリームURIリクエストといったカメラ関連のディレクティブを、CameraStreamControllerインターフェースで定義された内容にしたがって処理します
  • 指定のトークンを使用してデバイス制御クラウド(この場合はカメラ)と通信します
  • 応答イベントやエラーイベントをAlexaに返します

ユーザー認可

スマートホームスキルAPIは、OAuth2.0の仕様に準拠しています。スマートホームスキルAPIからスマートホームスキルに送信されるリクエストにはすべて、OAuthアクセストークンが含まれています。これにより、ユーザーのデバイス制御クラウドにアクセスできるようになります。デバイス制御クラウドはAuthorization Code Grantのフロータイプをサポートしている必要があります。スキル認証とユーザーのアカウントリンクの詳細については、スマートホームなどのドメインのアカウントリンクを参照してください。

メッセージの構造

カメラを対象としたスマートホームスキルのメッセージの構造は、ほかのデバイス向けのメッセージと大きな違いはありません。ただし、検出リクエストやカメラフィードを初期化するリクエストを受信する場合は、cameraStreamオブジェクトを使用して各カメラエンドポイントの詳細を指定する必要があります。

cameraStreamのプロパティの一覧を次の表に示します。

プロパティ 説明 必須
cameraStream.protocol ストリームのプロトコル(RTSPなど)です。 文字列
cameraStream.resolution ストリームの解像度を指定する解像度オブジェクトです。widthおよびheightプロパティが含まれます。 オブジェクト
cameraStream.resolution.width ビデオストリームの幅を指定します。 整数
cameraStream.resolution.height ビデオストリームの高さを指定します。 整数
cameraStream.authorizationType 認可タイプを指定します。使用できる値は「BASIC」、「DIGEST」、「NONE」です。 文字列
cameraStream.videoCodec ストリームのビデオコーデックです。使用できる値は「H264」、「MPEG2」、「MJPEG」、「JPG」です。 文字列
cameraStream.audioCodec ストリームのオーディオコーデックです。使用できる値は「G711」、「AAC」、「NONE」です。 文字列

この情報を検出応答イベントに含める方法の詳細については、CameraStreamControllerを参照してください。

エラーメッセージ


認証やユーザーエラー、ハードウェアなどの問題でスキルがディレクティブに応答できない場合、適切なエラーメッセージを使って応答する必要があります。適切なエラータイプを示すErrorResponseを返します。各シナリオと送信すべきエラータイプを次の表に示します。

シナリオ 適切なエラーメッセージタイプ
対象のカメラエンドポイントは検出されるが、ユーザーによって構成されていません。 NOT_SUPPORTED_IN_CURRENT_MODE、NOT_PROVISIONEDの値は「currentDeviceMode」です
対象のカメラのバッテリー残量が少なく、コンテンツをストリーミングできません。 ENDPOINT_LOW_POWER
tokenが有効でない、取り消されている、またはリクエストに含まれていません。 INVALID_AUTHORIZATION_CREDENTIAL
tokenの有効期限が切れています。 INVALID_AUTHORIZATION_CREDENTIAL
エンドポイントがオフラインになっているなどの理由でスキルが対象のカメラに接続できませんでした。 ENDPOINT_UNREACHABLE
対象のカメラエンドポイントが一時的に利用できません。 NOT_SUPPORTED_IN_CURRENT_MODE
対象のカメラエンドポイントが見つかりません。 NO_SUCH_ENDPOINT
ランタイムエラーでスキルが失敗しました。可能であれば、より具体的なエラーを返すことをお勧めします。 INTERNAL_ERROR

その他のリソース