WebRTCと電話とのカンファレンス通話

Webアプリ上でWebRTCや電話網(PSTN)などの異なる通信タイプのユーザー同士が、1つのカンファレンスルームにて音声通話を実現するための実装手順を解説します。

目的

「Web アプリと電話ユーザーを接続した複数名での音声通話」や、「共通の電話番号への着信を複数オペレーターで応答する」といった機能を実装するには WebRTC と PSTN(電話網)間の複雑な連携が必要となりますが、NTTCPaaS がそれらをサポートすることで容易に実現可能です。

本記事では、NTTCPaaS の Voice チャネルを活用した「電話と WebRTC をつなぐカンファレンス通話」の実装手順を解説します。SDK の導入から通話の確立、イベント処理まで、WebRTC SDK による会議の作成や Calls API を用いた電話ユーザーの参加フローをステップバイステップで説明します。

事前準備

WebRTC 通話を開始する前に、ポータルサイトで以下の準備を完了させてください。
なお、本シナリオでは電話着信イベントを受信・処理するための Webhook 環境が別途必要となります。あらかじめ Webhook エンドポイントをご用意ください。

1.APIキーの発行

管理画面の [デベロッパーツール] > [APIキー] セクションから作成します。
APIキーを作成画面にて下記の通り設定します。

  • 名前:【任意のAPIキー名】
  • 有効期限:【任意の有効期限】
  • 許可されたIPアドレス(オプション):(必要に応じて設定)
  • APIスコープ:
    チャネル
    ・webrtc:identity:manage
    ・calls:traffic:send
    ・calls:traffic:receive
    ・calls:logs:read
    ※その他必要に応じて設定

2.電話番号の購入・準備

WebRTC と電話との発着信に使用する電話番号をマイページより購入します。

3.通話設定の作成

管理画面の [Channels と Numbers] > [チャネル] > [Voice および WebRTC] > [コールAPI]>[通話設定] セクションから、新しい通話設定を作成します。

「通話設定を作成」の画面から下記の設定にて作成します。

  • 通話設定ID:【任意のルート名】
  • 通話設定名:(必要に応じて設定)

4.通知プロファイルの作成

管理画面の [デベロッパーツール] > [サブスクリプション管理] >[通知プロファイル] セクションから、新しい通知プロファイルを作成します。

「通知プロファイルの作成」の画面から下記の設定にて作成します。

  • 通知プロファイル
    ・通知プロファイルの名前:【任意の通知プロファイル名】
    ・Webhook URL:【あらかじめ用意したWebhook URL】
  • セキュリティ設定(オプション):(必要に応じて設定)
  • 証明書(オプション):(必要に応じて設定)
  • 詳細設定(オプション):(必要に応じて設定)

5.サブスクリプションの作成

管理画面の [デベロッパーツール] > [サブスクリプション管理] >[配信登録] セクションから、新しいサブスクリプション(配信登録)を作成します。

「配信登録を作成」の画面から下記の設定にて作成します。

  • カテゴリー
    ・チャネル:VoiceおよびWebRTC
  • イベント
    ・通話受信
    ・通話失敗
  • フィルタリング
    ・ユーザー(オプション):(必要に応じて設定)
    ・エンティティ(オプション):(必要に応じて設定)
    ・アプリケーション(オプション):(必要に応じて設定)
    ・通話構成:【先ほど作成した通話設定】
    ・リソース(オプション):(必要に応じて設定)
  • 通知プロファイル
    ・通知プロファイル:【先ほど作成した通知プロファイル】
    ・セキュリティ設定(オプション):(必要に応じて設定)
    ・証明書(オプション):(必要に応じて設定)
    ・詳細設定(オプション):(必要に応じて設定)

6.通話ルーティングの設定

管理画面の [Channels と Numbers] > [番号] > [音声] セクションから、利用する電話番号のインバウンド構成を設定します。

電話番号のインバウンド構成を以下の通り設定します。

  • 転送アクション:サブスクリプションに転送
  • 通話設定:【先ほど作成した通話設定】

7.通話イベント確認

購入した電話番号に電話を発信し、Webhookに登録した通話イベントが通知されることを確認します。今回設定した「通話受信」「通話失敗」は以下のようなメッセージを取得します。

【通話受信(登録した電話番号への着信を検知)】

{
    "callId":"aj7l1046nhcs2p47e9cg3po5l1e0nilcibbs6qhefirk-3",
    "timestamp":"2025-11-30T14:19:17.465Z",
    "callsConfigurationId":"CALLS_CONFIGURATION_TEST",
    "platform":{
        "applicationId":"webrtc-test-app"
    },
    "properties":{
        "call":{
            "id":"aj7l1046nhcs2p47e9cg3po5l1e0nilcibbs6qhefirk-3",
            "endpoint":{
                "phoneNumber":"818011111111",
                "type":"PHONE"
            },
            "from":"818011111111",
            "to":"815022222222",
            "direction":"INBOUND",
            "state":"CALLING",
            "media":{
                "audio":{
                    "muted":false,
                    "userMuted":false,
                    "deaf":false
                },
                "video":{
                    "camera":false,
                    "screenShare":false,
                    "blind":false
                }
            },
            "startTime":"2025-11-30T14:19:17.482Z",
            "ringDuration":0,
            "callsConfigurationId":"CALLS_CONFIGURATION_TEST",
            "platform":{
                "applicationId":"webrtc-test-app"
            },
            "customData":{}
        },
        "apiBaseUrl":"https://ibapi.nttcpaas.com"
    },
    "type":"CALL_RECEIVED"
}

 

【通話失敗(電話ユーザーが発信を終了する等、通話の失敗を検知)】

{
  "callId": "bvmr1046nhcs2p47e9cg3po5l1e0nilcibbs6qher2r9100",
  "timestamp": "2025-12-03T01:18:39.623Z",
  "callsConfigurationId": "CALLS_CONFIGURATION_TEST",
  "platform": {
    "applicationId": "webrtc-test-app"
  },
  "properties": {
    "callLog": {
      "callId": "bvmr1046nhcs2p47e9cg3po5l1e0nilcibbs6qher2r9100",
      "endpoint": {
        "phoneNumber": "818011111111",
        "type": "PHONE"
      },
      "from": "818011111111",
      "to": "815022222222",
      "direction": "INBOUND",
      "state": "CANCELLED",
      "startTime": "2025-12-03T01:18:32.176Z",
      "endTime": "2025-12-03T01:18:39.623Z",
      "ringDuration": 0,
      "callsConfigurationIds": [],
      "platform": {
        "applicationId": "webrtc-test-app"
      },
      "conferenceIds": [],
      "duration": 0,
      "hasCameraVideo": false,
      "hasScreenshareVideo": false,
      "errorCode": {
        "id": 10202,
        "name": "CANCELLED",
        "description": "The user cancelled the call"
      },
      "customData": {},
      "hangupSource": "ENDPOINT"
    }
  },
  "type": "CALL_FAILED"
}

本記事ではイベント通知情報から、通話のCallIdを利用します。

WebRTC SDKを利用したカンファレンスルームの作成

電話ユーザーとWebRTCユーザーのカンファレンス通話を実現させるため、カンファレンスルームを作成します。本章ではWebRTC SDKを用いてカンファレンスルームを作成し、WebRTCユーザーを入室させる処理までを実装します。

1.SDKのインポート

JavaScript プロジェクトに SDK を組み込みます。
NPMの依存関係として追加したい場合は、以下のコマンドを実行してください。

npm install infobip-rtc --save

または、CDN から配布ファイルを JavaScript に直接含めることもできます。

<script src="//rtc.cdn.infobip.com/2.7.0/infobip.rtc.js"></script>

最新のタグも利用可能です。

<script src="//rtc.cdn.infobip.com/2/latest/infobip.rtc.js"></script>

2.WebRTC トークンの発行

NTTCPaaS WebRTC プラットフォームに WebRTC クライアントを接続させるため、トークン生成 API にて接続トークンを発行します。なお、API の実行にはベースURLとAPIキーが必要になります。NTT CPaaS のポータルサイトよりご確認ください。

重要
APIキーをフロントエンドにハードコードすると流出リスクがあります。トークン発行処理はバックエンドサーバー側で行い、クライアントへトークンのみを返却する構成を推奨します。

エンドポイント:POST /webrtc/1/token

curlサンプル:

curl -L -g -X POST 'https://{baseUrl}/webrtc/1/token' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
  "identity": "Alice",
  "displayName": "Alice in Wonderland",
  "timeToLive": 43200
}'


APIパラメーター:

項目 型 必須 概要
baseUrl String 〇 NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。
(例)XXXXXX.ibapi.nttcpaas.com
authorization String 〇 NTT CPaaS の API を利用する際の認証キー。
Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。
(例)Authorization: App YOUR_API_KEY_HERE
identity String 〇 NTTCPaaS WebRTC プラットフォーム上でWebRTCクライアントを表示するために使用される ID。一意である必要があります。「-」、「_」、「.」を含む Unicode 文字を 3 文字以上 64 文字以下で構成する必要があります。
displayName String   WebRTCクライアントに紐づく人間が読みやすい名称。一意である必要はありません。設定すると、識別されたユーザーと通信する他のすべてのユーザーに、IDとともに表示されます。5文字以上50文字以下である必要があります。
timeToLive Int64   トークンの有効期限が切れるまでの秒数。設定しない場合、トークンの有効期間は8時間です。最大値は24時間です。


成功すると下記のようなレスポンスが来ます。

  • token:SDK で利用する WebRTC プラットフォーム接続のためのトークン
  • expirationTime:トークンの有効期限
{
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZGVudGl0eSI6IkFsaWNlIiwibmFtZSI6IkFsaWNlIGluIFdvbmRlcmxhbmQiLCJleHAiOjE1NzkyOTA2MzgsImNhcHMiOlsyXX0.QyCMqjH8DsftChibW2Rw4EByH-eEviUp3-kHVKuJpKg",
  "expirationTime": "2020-01-17T19:50:38.488589Z"
}

3.WebRTC プラットフォームへの接続

先ほど取得したトークンを利用して InfobipRTC インスタンスを作成し、connect() により WebRTC プラットフォームに接続します。

let infobipRTC = createInfobipRtc(token);
infobipRTC.connect();

もし WebRTC プラットフォームから切断する場合は、disconnect() を利用します。

infobipRTC.disconnect();

4.カンファレンスルームの作成および入退室

WebRTCユーザーをConferenceルームへ入室させるには、joinRoom() を利用します。入室する場合はルーム名を指定します。下記ではルーム名を ”test_room” として利用しています。指定のルーム名を持つカンファレンスルームが存在しない場合、新しくカンファレンスルームが作成されます。

let infobipRTC = createInfobipRtc(token);
infobipRTC.connect();

let roomCall = infobipRTC.joinRoom('test_room', RoomCallOptions.builder().build());

カンファレンスルームから退出する場合は、leave() を利用します。

roomCall.leave();

5.通話イベントの設定

カンファレンス通話ではいくつかのイベントが用意されています。今回は自身のルーム入室時(ROOM_JOINED)とルーム退出時(ROOM_LEFT)、他の参加者のルーム入室時(PARTICIPANT_JOINED)とルーム退出時(PARTICIPANT_LEFT)のイベントを解説します。

  • ROOM_JOINED

    自身がルームに入室すると発火するイベントです。通話における受信音声メディアを表す MediaStream オブジェクトがイベントオブジェクトに受信されます。この MediaStream を HTML の audio 要素に紐づけることで通話先の音声を再生できます。その他のidとnameはそれぞれカンファレンスルームのIDとルーム名となります。

    event = { id: string, name: string, participants: Participant[], stream: MediaStream }
  • ROOM_LEFT

    自身がルームから退出すると発火するイベントです。受信したイベントオブジェクトには、通話が切断された理由の詳細を示す ErrorCode オブジェクトと、通話の音声統計の包括的な概要を提供する TotalMediaStats オブジェクトが含まれています。

    event = { errorCode: ErrorCode, totalMediaStats: TotalMediaStats }
  • PARTICIPANT_JOINED

    他の参加者がルームに入室すると発火するイベントです。participantには入室した参加者の情報が含まれています。

    event = { participant: Participant }
  • PARTICIPANT_LEFT

    他の参加者がルームから退出すると発火するイベントです。participantには退出した参加者の情報が含まれています。

    event = { participant: Participant }

実装サンプルは以下の通りです。
なお、HTML 上には id に”callAudio”を持つ audio 要素が含まれる前提となります。

let roomCall = infobipRTC.joinRoom('test_room', RoomCallOptions.builder().build());

roomCall.on(CallsApiEvent.ROOM_JOINED, (event) => {
    $('#callAudio').srcObject = event.stream;
});

roomCall.on(CallsApiEvent.ROOM_LEFT, (event) => {
    console.log(`Call finished. Status: ${event.errorCode.name}`);
    $('#callAudio').srcObject = null;
});

roomCall.on(CallsApiEvent.PARTICIPANT_JOINED, function (event) {
    console.log(`${event.participant.endpoint.identifier} joined the room call.`);
});

roomCall.on(CallsApiEvent.PARTICIPANT_LEFT, function (event) {
    console.log(`${event.participant.endpoint.identifier} left the room call.`);
});

次章では作成したカンファレンスルームに電話ユーザーを入室させることで、WebRTCユーザーと電話ユーザーとの通話を実現させます。

電話から発信してカンファレンスルームに参加させる(インバウンド)

電話から特定の電話番号へ発信し、特定のカンファレンスルームへ入室させるためのフローです。電話をカンファレンスルームに入室させるために、下記の3つのCalls APIを利用します。

  1. 電話端末に発信音を再生させる
  2. 電話からの着信に応答する
  3. 電話をカンファレンスルームに入室させる

電話ユーザーが登録した電話番号へ発信することで、Webhook で通話受信イベント情報(事前準備「1.7 通話イベント確認」を参照)が通知されます。この情報のうち、通話者の識別IDとなる callId を利用します。

1.電話に発信音を再生させる

電話をかけただけでは電話端末側で無音状態となっているため、電話の発信音を再生させます。

エンドポイント:POST /calls/1/calls/{callId}/send-ringing

curlサンプル:

curl -L -g -X POST 'https://{baseUrl}/calls/1/calls/{callId}/send-ringing' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' 


APIパラメーター:

項目 型 必須 概要
baseUrl String 〇 NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。
(例)XXXXXX.ibapi.nttcpaas.com
authorization String 〇 NTT CPaaS の API を利用する際の認証キー。
Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。
(例)Authorization: App YOUR_API_KEY_HERE
callId String 〇 通話者の識別ID。


成功すると下記のようなレスポンスが来ます。

{
  "status": "PENDING"
}

参考:https://docs.nttcpaas.com/api/voice.html#tag/calls-operations/POST/calls/1/calls/{callId}/send-ringing

2.電話からの着信に応答する

電話からの着信に応答します。これにより電話側では発信状態から通話状態に移行します。ただし、この時点ではカンファレンスルームに入室していないため、通話相手の音声が聞こえることはありません。

エンドポイント:POST /calls/1/calls/{callId}/answer

curlサンプル:

curl -L -g -X POST 'https://{baseUrl}/calls/1/calls/{callId}/answer' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
}'


APIパラメーター:

項目 型 必須 概要
baseUrl String 〇 NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。
(例)XXXXXX.ibapi.nttcpaas.com
authorization String 〇 NTT CPaaS の API を利用する際の認証キー。
Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。
(例)Authorization: App YOUR_API_KEY_HERE
callId String 〇 通話者の識別ID。


成功すると下記のようなレスポンスが来ます。

{
  "status": "PENDING"
}

参考:https://docs.nttcpaas.com/api/voice.html#tag/calls-operations/POST/calls/1/calls/{callId}/answer

3.電話をカンファレンスルームに入室させる

通話状態の電話を特定のカンファレンスルームへ入室させます。これには通話者の識別IDである Call IDに加え、入室させたいカンファレンスルームの Conference ID も必要になります。

エンドポイント:PUT /calls/1/conferences/{conferenceId}/call/{callId}

curlサンプル:

curl -L -g -X PUT 'https://{baseUrl}/calls/1/conferences/{conferenceId}/call' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'  


APIパラメーター:

項目 型 必須 概要
baseUrl String 〇 NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。
(例)XXXXXX.ibapi.nttcpaas.com
authorization String 〇 NTT CPaaS の API を利用する際の認証キー。
Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。
(例)Authorization: App YOUR_API_KEY_HERE
conferenceId String 〇 カンファレンスルームの識別ID
callId String 〇 通話者の識別ID。

成功すると下記のようなレスポンスが来ます。

{
  "id": "034e622a-cc7e-456d-8a10-0ba43b11aa5e",
  "name": "test_room",
  "participants": [
    {
      "callId": "string",
      "endpoint": {
        "phoneNumber": "818011111111",
        "type": "PHONE"
      },
      "state": "JOINING",
      "joinTime": "2019-08-24T14:15:22Z",
      "leaveTime": "2019-08-24T14:15:22Z",
      "media": {
        "audio": {
          "muted": true,
          "userMuted": true,
          "deaf": true
        },
        "video": {
          "camera": true,
          "screenShare": true,
          "blind": true
        }
      },
      "role": {
        "type": "DEFAULT"
      }
    }
  ],
  "callsConfigurationId": "dc5942707c704551a00cd2ea",
  "platform": {
    "entityId": "string",
    "applicationId": "string"
  }
}

参考:https://docs.nttcpaas.com/api/voice.html#tag/conference-management/PUT/calls/1/conferences/{conferenceId}/call/{callId}

電話へ発信してカンファレンスルームに参加させる(アウトバウンド)

Calls API を用いて電話ユーザーの電話番号へ発信し、特定のカンファレンスルームへ入室させるためのフローです。電話をカンファレンスルームに入室させるために、下記のCalls APIを利用します。

1.電話をカンファレンスルームに入室させる

通話状態の電話を特定のカンファレンスルームへ入室させます。これには通話者の識別IDである Call IDに加え、入室させたいカンファレンスルームの Conference ID も必要になります。

エンドポイント:POST /calls/1/conferences/{conferenceId}/call

curlサンプル:

curl -L -g -X POST 'https://{baseUrl}/calls/1/conferences/{conferenceId}/call' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
    'callRequest': {
        'endpoint': {
            'type': 'PHONE',
            'phoneNumber': '{phoneNumber}'
        },
        'from': '{fromNumber}'
    }
}'


APIパラメーター:

項目 型 必須 概要
baseUrl String 〇 NTT CPaaS のテナントごとに割り当てられた固有のサブドメイン。
(例)XXXXXX.ibapi.nttcpaas.com
authorization String 〇 NTT CPaaS の API を利用する際の認証キー。
Authorization ヘッダーに付与し、下記のようにAPIキーを含む文字列を設定する必要があります。
(例)Authorization: App YOUR_API_KEY_HERE
conferenceId String 〇 カンファレンスルームの識別ID
phoneNumber String 〇 電話をかける宛先の電話番号。E.164形式で取り扱う必要があります。
(例)080-1111-1111の場合、818011111111
※先頭の「0」を「81(日本の国番号)」に変換する
fromNumber String 電話ユーザーに通知する発信元電話番号。E.164形式で取り扱う必要があります。
NTTCPaaSに登録した電話番号を設定することで、発信先の電話端末の画面上に設定した電話番号が表示されます。
設定しない場合、電話端末上で非通知設定として表示されます。

成功すると下記のようなレスポンスが来ます。

{
    "conference": {
        "id": "0c38b792-8949-4dd9-9a33-ce02014f7bd3",
        "name": "test_room",
        "participants": [
            {
                "callId": "2fbf5875-362d-4936-8a1b-11845384299d",
                "endpoint": {
                    "type": "WEBRTC",
                    "identity": "webrtc-caller",
                    "displayName": "webrtc-user"
                },
                "state": "JOINED",
                "joinTime": "2026-07-27T19:47:05.342+0000",
                "media": {
                    "audio": {
                        "muted": false,
                        "userMuted": false,
                        "deaf": false
                    },
                    "video": {
                        "camera": false,
                        "screenShare": false,
                        "blind": false
                    }
                },
                "role": {
                    "type": "DEFAULT"
                }
            },
            {
                "callId": "b2cae37b-2833-48d8-aafc-c0ecc0decba7",
                "endpoint": {
                    "type": "PHONE",
                    "phoneNumber": "818011111111"
                },
                "state": "JOINING",
                "media": {
                    "audio": {
                        "muted": false,
                        "userMuted": false,
                        "deaf": false
                    },
                    "video": {
                        "camera": false,
                        "screenShare": false,
                        "blind": false
                    }
                },
                "role": {
                    "type": "DEFAULT"
                }
            }
        ],
        "callsConfigurationId": "WEBRTC"
    },
    "call": {
        "id": "b2cae37b-2833-48d8-aafc-c0ecc0decba7",
        "endpoint": {
            "type": "PHONE",
            "phoneNumber": "818011111111"
        },
        "from": "815022222222",
        "to": "818011111111",
        "direction": "OUTBOUND",
        "state": "CALLING",
        "media": {
            "audio": {
                "muted": false,
                "userMuted": false,
                "deaf": false
            },
            "video": {
                "camera": false,
                "screenShare": false,
                "blind": false
            }
        },
        "startTime": "2026-07-27T19:47:29.325+0000",
        "ringDuration": 0,
        "callsConfigurationId": "WEBRTC"
    }
}

参考:https://docs.nttcpaas.com/api/voice.html#tag/conference-management/POST/calls/1/conferences/{conferenceId}/call

【付録】通話アプリのサンプルプログラム

【ご利用方法】
 index.html と app.js を同じディレクトリに入れてご利用ください。また、本記事にて解説したCalls APIは下記のサンプルプログラムには含まれておりません。必要に応じてアプリに追加してください。

【動作確認環境】
 ・Windows 11
 ・Chrome:149.0.7827.197
 ・JavaScript SDK:2.7.36

JavaScript SDKの仕様の詳細はこちらをご参照ください。

index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>NTTCPaaS WebRTC</title>
    <script src="//rtc.cdn.infobip.com/2.7.36/infobip.rtc.js"></script>
</head>
<body>
    <div id="connect-field">
        <p>WebRTCトークン</p>
        <input type="text" id="token-input" placeholder="WebRTCトークンを入力" style="width: 300px;">
        <button onclick="connectRTC()">接続</button>
    </div>
    <div id="call-field" style="display: none;">
        <p>ルーム名</p>
        <input type="text" id="room-name-input" placeholder="ルーム名を入力" style="width: 300px;">
        <button id="start-call-btn" onclick="startCall()">発信</button>
        <button id="end-call-btn" onclick="endCall()">通話終了</button>
        <button id="end-call-btn" onclick="deleteLog()">ログ削除</button>
        <div id="call-event-area"></div>
    </div>
    <audio id="audio-elm" playsinline autoplay loop muted></audio>
    <script src="./app.js"></script>
</body>
</html>

app.js

let infobipRTC = null;
let activeCall = null;

const connectField = document.getElementById('connect-field');
const callField = document.getElementById('call-field');
const startCallBtn = document.getElementById('start-call-btn');
const endCallBtn = document.getElementById('end-call-btn');
const roomNameInput = document.getElementById("room-name-input");
const callEventArea = document.getElementById('call-event-area');
const audioElm = document.getElementById("audio-elm");

// アプリの初期化
async function connectRTC(){

    // マイク権限取得
    try {
        await navigator.mediaDevices.getUserMedia({ audio: true });
    } catch (e) {
        return;
    }

    audioElm.muted = false;

    // SDKの初期化と接続
    const token = document.getElementById('token-input').value;
    if (!token) return;

    infobipRTC = createInfobipRtc(token);
    infobipRTC.connect();

    infobipRTC.on('connected', (e) => {
        connectField.querySelectorAll('input, button').forEach(element => {
            element.disabled = true;
        });
        callField.style.display = "block";
    });
}

// 電話に発信
function startCall() {
    if(activeCall || !roomNameInput.value) return;

    activeCall = infobipRTC.joinRoom(roomNameInput.value, RoomCallOptions.builder().build());

    setupCall(activeCall);
}

// 通話を終了
function endCall() {
    if (!activeCall) return;

    activeCall.leave();
    resetCallState();
}

// 通話開始時の共通処理
function setupCall(call) {
    // UIを「通話中」の状態にする(ボタンや入力を無効化)
    startCallBtn.disabled = true;
    roomNameInput.disabled = true;

    // ルーム入室時のイベント
    call.on(CallsApiEvent.ROOM_JOINED, (e) => {
        console.log(call);
        audioElm.srcObject = e.stream;
        logCallEvent(`ルーム「${roomNameInput.value}」に参加しました。`);
        logCallEvent(`ConferenceID: ${e.id}`);
    });

    // ルーム退出時のイベント
    call.on(CallsApiEvent.ROOM_LEFT, (e) => {
        resetCallState();
        logCallEvent(`ルーム「${roomNameInput.value}」を退出しました。`);
    });

    // 他の参加者のルーム入室時のイベント
    call.on(CallsApiEvent.PARTICIPANT_JOINED, (e) => {
        const endpoint = e.participant.endpoint;
        const endpointName = endpoint.identifier || endpoint.phoneNumber || '匿名ユーザー';
        logCallEvent(`${endpointName} が参加しました。`);
    });

    // 他の参加者のルーム退出時のイベント
    call.on(CallsApiEvent.PARTICIPANT_LEFT, (e) => {
        const endpoint = e.participant.endpoint;
        const endpointName = endpoint.identifier || endpoint.phoneNumber || '匿名ユーザー';
        logCallEvent(`${endpointName} が退出しました。`);
    });
}

// 通話終了時の状態リセット処理
function resetCallState() {
    activeCall = null;
    startCallBtn.disabled = false;
    roomNameInput.disabled = false;
    audioElm.srcObject = null;
}

// 通話ログを記録
function logCallEvent(message) {
    if (!callEventArea) return;
    
    const timestamp = new Date().toLocaleTimeString();
    const p = document.createElement('p');
    p.style.margin = '4px 0';
    p.textContent = `[${timestamp}] ${message}`;
    callEventArea.appendChild(p);
}

// 通話ログをリセット
function deleteLog(){
    if (!callEventArea) return;
    callEventArea.innerHTML = '';
}

NTT CPaaSを、
60日間無料でお試しください

・SMS・Voice・メールを本番同様に無料で検証
・全API機能に即日アクセス / 有料プランと同一環境
・国内開発者向けに最適化された日本語ガイド

無料トライアル

目次
  1. 目的
  2. 事前準備
    1. 1.APIキーの発行
    2. 2.電話番号の購入・準備
    3. 3.通話設定の作成
    4. 4.通知プロファイルの作成
    5. 5.サブスクリプションの作成
    6. 6.通話ルーティングの設定
    7. 7.通話イベント確認
  3. WebRTC SDKを利用したカンファレンスルームの作成
    1. 1.SDKのインポート
    2. 2.WebRTC トークンの発行
    3. 3.WebRTC プラットフォームへの接続
    4. 4.カンファレンスルームの作成および入退室
    5. 5.通話イベントの設定
  4. 電話から発信してカンファレンスルームに参加させる(インバウンド)
    1. 1.電話に発信音を再生させる
    2. 2.電話からの着信に応答する
    3. 3.電話をカンファレンスルームに入室させる
  5. 電話へ発信してカンファレンスルームに参加させる(アウトバウンド)
    1. 1.電話をカンファレンスルームに入室させる
  6. 【付録】通話アプリのサンプルプログラム

2026.08.31