Alexa.RTCSessionControllerインターフェース



Alexa.RTCSessionControllerインターフェース

Alexa.RTCSessionControllerインターフェースは、Alexaがリアルタイム通信(RTC)対応エンドポイントと対話するために使用するメッセージを記述します。RTCSessionControllerインターフェースをアプリケーションで使用すると、Alexaユーザーは、たとえば玄関にいる訪問者とリモートで通信を行うことができます。リモート通信には、FireTVのほか、Echo Dot、Echo Plus、Echo Show、Echo SpotといったすべてのEchoデバイスを使用できます。

RTCSessionControllerインターフェースは、単方向(半二重)または双方向(全二重)の通信に対応しています。玄関のインターホンに接続されたEcho Plusのような音声専用のシナリオの場合、通信は双方向であることが必要です。玄関のカメラに接続されたEcho Showのような音声とビデオのシナリオの場合、ビデオ通信は単方向のみ、音声通信は単方向と双方向に対応します。

RTCSessionControllerインターフェースがサポートされているロケールについては、機能インターフェースの一覧を参照してください。

発話

Alexa.RTCSessionControllerインターフェースを使用する場合、音声対話モデルは既にビルドされています。ユーザーは、手持ちのAlexa搭載デバイス(Echo ShowやFireTVなど)に話しかけるか、またはライブストリーミングモード中にマイクアイコンを使用することで、リアルタイム通信デバイスのそばにいる人物との通信を開始できます。

ユーザーは、次のような発話を用いて会話を開始できます。

アレクサ、玄関に応答して
アレクサ、玄関のカメラと話して
アレクサ、勝手口のカメラと話して
アレクサ、赤ちゃん部屋と話して
アレクサ、二階の部屋に電話して
アレクサ、二階に電話して
アレクサ、玄関のカメラに答えて
アレクサ、インターホンに話して
アレクサ、玄関の人に話して

Alexa, answer the front door.
Alexa, talk to the front door.
Alexa, talk to the backyard camera.
Alexa, talk to the baby monitor.
Alexa, get the call going with the front door.
Alexa, please call front door.
Alexa, respond to the front door.
Alexa, speak to the front door.
Alexa, talk to my front door camera.
Alexa, talk to the person at the main door.

ユーザーは、次のような発話を用いて会話を終了できます。

アレクサ、ホームに戻って
アレクサ、ストップ

Alexa, go home.
Alexa, stop.

ユーザーがこのような発話をしたら、Alexaがそれに対応するディレクティブをスキルに送信します。

概要

サポートされる通信タイプ

  • 単方向(半二重)通信の場合、ユーザーは2方向で通信できますが、同時に通信することはできません。例:
    • トランシーバー
    • ボタンを押して話す(プッシュトゥトーク)インターホン
  • 双方向(全二重)通信の場合、ユーザーは2方向で同時に通信できます。例:
    • 電話
    • 電話形式のインターホン

シグナリング図

以下のシグナリング図は、RTCSessionControllerの通信を示しています。

RTCSessionController通信でのディレクティブとイベントの順序を示す図

前提条件とSLA要件

RTCSessionController APIを使用するには、以下が必要です。

  • 最低でも1分のタイムアウトが必要です。

  • スキルにどのようなオファーが送信されたとしても、6秒以内にアンサーを生成する必要があります。

  • デバイスまたはプラットフォームがWebRTCに準拠しているか、またはWebRTCによるプロトコル一式とWebRTCで使用されているすべての復元メカニズムに対応している必要があります。特に以下への対応が求められます。

    • Negative Acknowledgement(NACK
    • Picture Loss Indication(PLI
    • Full Intra Request(FIR
    • Receiver Estimated Maximum Bitrate(REMB
  • リソースに関する考慮事項として、bundlingrtcp-muxのサポートが必要です。バンドルを使用してオーディオとビデオを同じ接続で送信し、オープンソケットの数を減らしてください。

  • 双方向通信をサポートする場合は、デバイスにアコースティックエコーキャンセレーション(AEC)とノイズ抑制の効果的なアルゴリズムを導入する必要があります。

  • 単方向通信をサポートする場合は、標準的なライブビューシナリオでプッシュトゥトーク機能を使用できます。検出応答で、isFullDuplexAudioSupportedfalseと宣言してください。

  • ビデオをサポートするには、次のいずれかのビデオコーデックを使用する必要があります。

    • H264(ハイプロファイル、レベル4.1まで)
  • オーディオをサポートするには、次のいずれかのオーディオコーデックを使用する必要があります。

    • Opus(推奨コーデック)
    • PCMU/G.711
    • AAC-LC、HE-AAC
  • Interactive Connectivity Establishment(ICE)候補としてUDPまたはTCPを使用できますが、IPv4の使用が必須です。

プロパティ

Alexa.RTCSessionControllerインターフェースでは、レポート可能なプロパティを定義しません。

検出

Alexa.RTCSessionControllerをサポートするエンドポイントは、Alexa.Discoveryの標準検出メカニズムを使用して表します。また、Alexa.RTCSessionController機能のコンフィギュレーションで二重通信がサポートされているかどうかを判断します。

表示カテゴリーには、CAMERAまたはDOORBELLを使用します。表示カテゴリーの一覧については、表示カテゴリーを参照してください。

機能配列のRTCSessionControllerエントリには、通常の検出応答フィールドのほかに、次のプロパティを持つコンフィギュレーションフィールドを含めます。

フィールド 説明
isFullDuplexAudioSupported デバイスが双方向(全二重)通信をサポートしている場合はtrueです。デバイスが単方向(半二重)通信をサポートしている場合はfalseです。デフォルトはfalseです。 ブール値

検出応答の例

{
  "event": {
    "header": {
      "namespace":"Alexa.Discovery",
      "name":"Discover.Response",
      "payloadVersion": "3",
      "messageId": "<メッセージID>"
    },
    "payload":{
      "endpoints":[
        {
          "endpointId": "<エンドポイントの一意のID>",
          "manufacturerName": "<エンドポイントのメーカー名>",
          "description": "<Alexaアプリに表示される説明>",
          "friendlyName": "玄関のカメラ",
          "displayCategories": [ "CAMERA" ],
          "cookie": {},
          "capabilities": [
            {
              "type": "AlexaInterface",
              "interface": "Alexa.RTCSessionController",
              "version": "3",
              "configuration": {
                "isFullDuplexAudioSupported": true
              }
            },
            {
              "type": "AlexaInterface",
              "interface": "Alexa",
              "version": "3"
            }
          ]
        }
      ]
    }
  }
}

ディレクティブ

InitiateSessionWithOfferディレクティブ

InitiateSessionWithOfferディレクティブをサポートすると、ユーザーが玄関のデバイスとリアルタイム通信を開始できます。

以下は、ユーザーの発話の例です。

アレクサ、玄関のカメラと話して

Alexa, talk to my front door camera

InitiateSessionWithOfferディレクティブペイロードの詳細

フィールド 説明
sessionId 接続したいセッションのIDです。 バージョン4 UUID
offer SDPオファーです。 文字列

InitiateSessionWithOfferディレクティブの例

{
  "directive": {
    "header": {
      "namespace": "Alexa.RTCSessionController",
      "name": "InitiateSessionWithOffer",
      "messageId": "<メッセージID>",
      "correlationToken": "<opaque相関トークン>",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "<OAuth2ベアラートークン>"
      },
      "endpointId": "<エンドポイントID>",
      "cookie": {}
    },
    "payload": {
      "sessionId" : "<セッション識別子>",
      "offer": {
        "format" : "SDP",
        "value" : "<SDPオファー値>"
      }
    }
  }
}

InitiateSessionWithOffer応答イベント

InitiateSessionWithOfferディレクティブを正しく処理したら、AnswerGeneratedForSessionイベントを使用して応答します。応答は同期または非同期のどちらでも可能です。非同期で応答する場合、相関トークンと、認可トークンを含めたスコープを含めます。

AnswerGeneratedForSession応答イベントのペイロードの詳細

フィールド 説明
answer SDPアンサーです。 文字列

AnswerGeneratedForSession応答イベントの例

{
  "event": {
    "header": {
      "namespace": "Alexa.RTCSessionController",
      "name": "AnswerGeneratedForSession",
      "messageId": "<メッセージID>",
      "correlationToken": "<opaque相関トークン>",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "<OAuth2ベアラートークン>"
      },
      "endpointId": "<エンドポイントID>"
    },
    "payload": {
      "answer": {
        "format" : "SDP",
        "value" : "<SDPアンサー値>"
      }
    }
  }
}

InitiateSessionWithOfferディレクティブのエラー処理

InitiateSessionWithOfferディレクティブを正しく処理できなかった場合は、Alexa.ErrorResponseイベントを使用して応答します。

SessionConnectedディレクティブ

SessionConnectedディレクティブは、RTCセッションが接続されたことを通知します。

SessionConnectedディレクティブペイロードの詳細

フィールド 説明
sessionId 元のInitiateSessionWithOfferディレクティブからのセッションのIDです。 バージョン4 UUID

SessionConnectedディレクティブの例

{
  "directive": {
    "header": {
      "namespace": "Alexa.RTCSessionController",
      "name": "SessionConnected",
      "messageId": "<メッセージID>",
      "correlationToken": "<opaque相関トークン>",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "<OAuth2ベアラートークン>"
      },
      "endpointId": "<エンドポイントID>",
      "cookie": {}
    },
    "payload": {
      "sessionId" : "<セッション識別子>"
    }
  }
}

SessionConnected応答イベント

SessionConnectedディレクティブを正しく処理したら、SessionConnectedイベントを使用して応答します。応答は同期または非同期のどちらでも可能です。非同期で応答する場合、相関トークンと、認可トークンを含めたスコープを含めます。

SessionConnected応答イベントのペイロードの詳細

フィールド 説明
sessionId 元のInitiateSessionWithOfferディレクティブからのセッションのIDです。 バージョン4 UUID

SessionConnected応答イベントの例

{
  "event": {
    "header": {
      "namespace": "Alexa.RTCSessionController",
      "name": "SessionConnected",
      "messageId": "<メッセージID>",
      "correlationToken": "<opaque相関トークン>",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "<OAuth2ベアラートークン>"
      },
      "endpointId": "<エンドポイントID>"
    },
    "payload": {
      "sessionId" : "<セッション識別子>"
    }
  }
}

SessionConnectedディレクティブのエラー処理

SessionConnectedディレクティブを正しく処理できなかった場合は、Alexa.ErrorResponseイベントを使用して応答します。

SessionDisconnectedディレクティブ

SessionDisconnectedディレクティブは、RTCセッションが切断されたことを通知します。

SessionDisconnectedディレクティブペイロードの詳細

フィールド 説明
sessionId 元のInitiateSessionWithOfferディレクティブからのセッションのIDです。 バージョン4 UUID

SessionDisconnectedディレクティブの例

{
  "directive": {
    "header": {
      "namespace": "Alexa.RTCSessionController",
      "name": "SessionDisconnected",
      "messageId": "<メッセージID>",
      "correlationToken": "<opaque相関トークン>",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "<OAuth2ベアラートークン>"
      },
      "endpointId": "<エンドポイントID>",
      "cookie": {}
    },
    "payload": {
      "sessionId" : "<セッション識別子>"
    }
  }
}

SessionDisconnected応答イベント

SessionDisconnectedディレクティブを正しく処理したら、SessionDisconnectedイベントを使用して応答します。応答は同期または非同期のどちらでも可能です。非同期で応答する場合、相関トークンと、認可トークンを含めたスコープを含めます。

SessionDisconnected応答イベントのペイロードの詳細

フィールド 説明
sessionId 元のInitiateSessionWithOfferディレクティブからのセッションのIDです。 バージョン4 UUID

SessionDisconnected応答イベントの例

{
  "event": {
    "header": {
      "namespace": "Alexa.RTCSessionController",
      "name": "SessionDisconnected",
      "messageId": "<メッセージID>",
      "correlationToken": "<opaque相関トークン>",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "<OAuth2ベアラートークン>"
      },
      "endpointId": "<エンドポイントID>"
    },
    "payload": {
      "sessionId" : "<セッション識別子>"
    }
  }
}

SessionDisconnectedディレクティブのエラー処理

SessionDisconnectedディレクティブを正しく処理できなかった場合は、Alexa.ErrorResponseイベントを使用して応答します。

セッション記述プロトコルのオファー/アンサー形式

RTCSessionControllerインターフェースは、セッション記述プロトコル(SDP)を使用します。詳細については、Session Description Protocol(SDP)を参照してください。

オファー/アンサー交換の例

v=0
o=- 3747690900 3747690900 IN IP4 0.0.0.0
s=a 2 z
c=IN IP4 0.0.0.0
t=0 0
a=group:BUNDLE audio0 video0
m=audio 1 RTP/SAVPF 96 0
a=candidate:1 1 UDP 2013266430 xxx.xxx.xxx.xxx 8620 typ host
a=candidate:2 1 TCP 1010827775 xxx.xxx.xxx.xxx 45351 typ host tcptype passive
a=candidate:3 2 UDP 2013266429 xxx.xxx.xxx.xxx 50066 typ host
a=candidate:4 2 TCP 1010827774 xxx.xxx.xxx.xxx 65157 typ host tcptype passive
a=candidate:5 2 TCP 1015022078 xxx.xxx.xxx.xxx 9 typ host tcptype active
a=candidate:6 1 TCP 1015022079 xxx.xxx.xxx.xxx 9 typ host tcptype active
a=setup:actpass
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:96 opus/48000/2
a=rtcp:9 IN IP4 0.0.0.0
a=rtcp-mux
a=sendrecv
a=mid:audio0
a=ssrc:118039096 cname:user2571875795@host-433aaf59
a=ice-ufrag:AGVf
a=ice-pwd:h3JAYGhIaQ/Nvyaz9dLoz9
a=fingerprint:sha-256 34:D4:54:17:0C:95:2A:79:FF:72:10:21:E9:6E:F3:77:86:2F:8D:6C:33:45:BA:14:1D:43:01:D7:CD:0A:1A:84
m=video 1 RTP/SAVPF 99
a=candidate:4 1 UDP 2013266430 xxx.xxx.xxx.xxx 8620 typ host
a=candidate:5 1 TCP 1015022079 xxx.xxx.xxx.xxx 9 typ host tcptype active
a=candidate:4 2 UDP 2013266429 xxx.xxx.xxx.xxx 50066 typ host
a=candidate:6 1 TCP 1010827775 xxx.xxx.xxx.xxx 45351 typ host tcptype passive
a=candidate:5 2 TCP 1015022078 xxx.xxx.xxx.xxx 9 typ host tcptype active
a=candidate:6 2 TCP 1010827774 xxx.xxx.xxx.xxx 65157 typ host tcptype passive
b=AS:500
a=setup:actpass
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:99 H264/90000
a=rtcp:9 IN IP4 0.0.0.0
a=rtcp-mux
a=sendrecv
a=mid:video0
a=rtcp-fb:99 nack
a=rtcp-fb:99 nack pli
a=rtcp-fb:99 ccm fir
a=ssrc:3643559644 cname:user2571875795@host-433aaf59
a=ice-ufrag:AGVf
a=ice-pwd:h3JAYGhIaQ/Nvyaz9dLoz9
a=fingerprint:sha-256 34:D4:54:17:0C:95:2A:79:FF:72:10:21:E9:6E:F3:77:86:2F:8D:6C:33:45:BA:14:1D:43:01:D7:CD:0A:1A:84