クライアントで通話レコーディングを管理する

重要

この記事で説明されている機能は、現在パブリック プレビュー段階にあります。 このプレビュー バージョンはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードに使用することは推奨されません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

通話レコーディングを使用すると、ユーザーが、Azure Communication Services で行った通話を記録することができます。 この記事では、クライアント側でレコーディングを管理する方法について説明します。 開始する前に、サーバー側でレコーディングを設定する必要があります。

前提条件

SDK のインストール

npm install コマンドを使用して、JavaScript 用の Azure Communication Services の Common SDK と Calling SDK をインストールします。

npm install @azure/communication-common --save
npm install @azure/communication-calling --save

必要なオブジェクトを初期化する

CallClient インスタンスは、ほとんどの通話操作に必要です。 ここでは、新しい CallClient インスタンスを作成します。 Logger インスタンスなどのカスタム オプションを使用してこれを構成できます。

CallClient インスタンスを用意したら、CallClient インスタンスで createCallAgent メソッドを呼び出すことで、CallAgent インスタンスを作成できます。 このメソッドでは、非同期的に CallAgent インスタンス オブジェクトが返されます。

createCallAgent メソッドでは、CommunicationTokenCredential が引数として使用されます。 これは、ユーザー アクセス トークンを受け取ります。

CallClient インスタンスで getDeviceManager メソッドを使用して、deviceManager にアクセスできます。

const { CallClient } = require('@azure/communication-calling');
const { AzureCommunicationTokenCredential} = require('@azure/communication-common');
const { AzureLogger, setLogLevel } = require("@azure/logger");

// Set the logger's log level
setLogLevel('verbose');

// Redirect log output to console, file, buffer, REST API, or whatever location you want
AzureLogger.log = (...args) => {
    console.log(...args); // Redirect log output to console
};

const userToken = '<USER_TOKEN>';
callClient = new CallClient(options);
const tokenCredential = new AzureCommunicationTokenCredential(userToken);
const callAgent = await callClient.createCallAgent(tokenCredential, {displayName: 'optional Azure Communication Services user name'});
const deviceManager = await callClient.getDeviceManager()

Note

この API は開発者向けのプレビューとして提供されており、お客様からのフィードバックに基づいて変更される場合があります。 この API は、運用環境では使用しないでください。 この API を使用するには、Azure Communication Services Calling Web SDK のベータ リリースを使用します。

クラウド レコーディング

通話レコーディングは、コアとなる通話 API の拡張機能です。 まず、Calling SDK から通話機能をインポートする必要があります。

import { Features} from "@azure/communication-calling";

その後、呼び出しインスタンスからレコーディング機能 API オブジェクトを取得することができます。

const callRecordingApi = call.feature(Features.Recording);

通話が記録されているかどうかを確認するには、callRecordingApiisRecordingActive プロパティを調べます。 Boolean を返します。

const isRecordingActive = callRecordingApi.isRecordingActive;

また、変更の記録をサブスクライブすることもできます。

const isRecordingActiveChangedHandler = () => {
    console.log(callRecordingApi.isRecordingActive);
};

callRecordingApi.on('isRecordingActiveChanged', isRecordingActiveChangedHandler);

レコーディング リストを取得するには、callRecordingApirecordings プロパティを使用します。 RecordingInfo[] が返されます。これにはクラウド レコーディングの現在の状態が示されています。

const recordings = callRecordingApi.recordings;

recordings.forEach(r => {
    console.log("State: ${r.state}");

また、recordingsUpdated をサブスクライブして、更新されたレコーディングのコレクションを取得することもできます。 このイベントは、レコーディングの更新が発生するたびにトリガーされます。

const cloudRecordingsUpdatedHandler = (args: { added: SDK.RecordingInfo[], removed: SDK.RecordingInfo[]}) => {
                        console.log('Recording started by: ');
                        args.added?.forEach(a => {
                            console.log('State: ${a.state}');
                        });

                        console.log('Recording stopped by: ');
                        args.removed?.forEach(r => {
                            console.log('State: ${r.state}');
                        });
                    };
callRecordingApi.on('recordingsUpdated', cloudRecordingsUpdatedHandler );

SDK のインストール

プロジェクトレベルの build.gradle ファイルを見つけて、buildscriptallprojects の下にあるリポジトリの一覧に「mavenCentral()」を追加します。

buildscript {
    repositories {
    ...
        mavenCentral()
    ...
    }
}
allprojects {
    repositories {
    ...
        mavenCentral()
    ...
    }
}

次に、モジュール レベルの build.gradle ファイル内で、次の行を dependencies セクションに追加します。

dependencies {
    ...
    implementation 'com.azure.android:azure-communication-calling:1.0.0'
    ...
}

必要なオブジェクトを初期化する

CallAgent インスタンスを作成するには、CallClient インスタンス上で createCallAgent メソッドを呼び出す必要があります。 この呼び出しは、CallAgent インスタンス オブジェクトを非同期に返します。

createCallAgent メソッドは、アクセス トークンをカプセル化する CommunicationUserCredential を引数として受け取ります。

DeviceManager にアクセスするには、まず callAgent インスタンスを作成する必要があります。 それから、CallClient.getDeviceManager メソッドを使用して DeviceManager を取得することができます。

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential).get();
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();

呼び出し元の表示名を設定するには、この代替メソッドを使用します。

String userToken = '<user token>';
CallClient callClient = new CallClient();
CommunicationTokenCredential tokenCredential = new CommunicationTokenCredential(userToken);
android.content.Context appContext = this.getApplicationContext(); // From within an activity, for instance
CallAgentOptions callAgentOptions = new CallAgentOptions();
callAgentOptions.setDisplayName("Alice Bob");
DeviceManager deviceManager = callClient.getDeviceManager(appContext).get();
CallAgent callAgent = callClient.createCallAgent(appContext, tokenCredential, callAgentOptions).get();

通話を記録する

Note

この API は開発者向けのプレビューとして提供されており、お客様からのフィードバックに基づいて変更される場合があります。 この API は、運用環境では使用しないでください。 この API を使用するには、Azure Communication Services Calling Android SDK のベータ リリースを使用します。

通話記録は、コア Call オブジェクトの拡張機能です。

警告

Azure Communication Services Calling Android SDK のバージョン 1.1.0 およびベータ リリース バージョン 1.1.0-beta.1 までは、isRecordingActive および addOnIsRecordingActiveChangedListenerCall オブジェクトの一部でした。 新しいベータ リリースでは、これらの API は、Call の拡張機能として移動されました。

まず、レコーディング機能オブジェクトを取得する必要があります。

RecordingCallFeature callRecordingFeature = call.feature(Features.RECORDING);

次に、通話が記録されているかどうかを確認するために、callRecordingFeatureisRecordingActive プロパティを調べます。 boolean を返します。

boolean isRecordingActive = callRecordingFeature.isRecordingActive();

また、変更の記録をサブスクライブすることもできます。

private void handleCallOnIsRecordingChanged(PropertyChangedEvent args) {
  boolean isRecordingActive = callRecordingFeature.isRecordingActive();
}

callRecordingFeature.addOnIsRecordingActiveChangedListener(handleCallOnIsRecordingChanged);

アプリケーションから記録を開始する場合は、まず「通話録音の概要」に従って、通話レコーディングを設定する手順を実行します。

サーバーで通話レコーディングを設定したら、Android アプリケーションで通話から ServerCallId 値を取得し、それをサーバーに送信して、レコーディング プロセスを開始する必要があります。 ServerCallId 値を見つけるには、CallInfo クラスの getServerCallId() を使用します。 クラス オブジェクト内で CallInfo クラスを見つけるには、getInfo() を使用します。

try {
    String serverCallId = call.getInfo().getServerCallId().get();
    // Send serverCallId to your recording server to start the call recording.
} catch (ExecutionException | InterruptedException e) {

} catch (UnsupportedOperationException unsupportedOperationException) {

}

サーバーからレコーディングを開始すると、イベント handleCallOnIsRecordingChanged がトリガーされ、callRecordingFeature.isRecordingActive() の値は true になります。

通話レコーディングを停止する場合は、通話レコーディングを開始するのと同じように、ServerCallId を取得し、それをレコーディング サーバーに送信して、そのサーバーがレコーディングを停止できるようにする必要があります。

try {
    String serverCallId = call.getInfo().getServerCallId().get();
    // Send serverCallId to your recording server to stop the call recording.
} catch (ExecutionException | InterruptedException e) {

} catch (UnsupportedOperationException unsupportedOperationException) {

}

サーバーからレコーディングを停止すると、イベント handleCallOnIsRecordingChanged がトリガーされ、callRecordingFeature.isRecordingActive() の値は false になります。

システムを設定する

Xcode プロジェクトを作成する

Xcode で、新しい iOS プロジェクトを作成し、[単一ビュー アプリ] テンプレートを選択します。 このクイックスタートでは SwiftUI フレームワークを使用します。そのため、[Language]Swift に、[Interface]SwiftUI に設定する必要があります。

このクイックスタートでは、テストは作成しません。 [Include Tests] チェック ボックスはオフにしてもかまいません。

Screenshot that shows the window for creating a project within Xcode.

CocoaPods を使用してパッケージと依存関係をインストールする

  1. この例のように、アプリケーション用の Podfile を作成します。

    platform :ios, '13.0'
    use_frameworks!
    target 'AzureCommunicationCallingSample' do
        pod 'AzureCommunicationCalling', '~> 1.0.0'
    end
    
  2. pod install を実行します。

  3. Xcode を使用して .xcworkspace を開きます。

マイクへのアクセスを要求する

デバイスのマイクにアクセスするには、NSMicrophoneUsageDescription を使用してアプリの情報プロパティ一覧を更新する必要があります。 関連付けられた値を文字列に設定します。これは、システムがユーザーにアクセスを要求するために使用するダイアログ内に含まれます。

プロジェクト ツリーの [Info.plist] エントリを右クリックし、[Open As]>[Source Code] を選択します。 最上位の <dict> セクションに以下の行を追加してから、ファイルを保存します。

<key>NSMicrophoneUsageDescription</key>
<string>Need microphone access for VOIP calling.</string>

アプリのフレームワークを設定する

プロジェクトの ContentView.swift ファイルを開きます。 ファイルの先頭に import 宣言を追加して、AzureCommunicationCalling ライブラリをインポートします。 さらに、AVFoundation をインポートします。 これは、コード内のオーディオ アクセス許可要求に必要になります。

import AzureCommunicationCalling
import AVFoundation

CallAgent を初期化する

CallClient から CallAgent インスタンスを作成するには、初期化された後に CallAgent オブジェクトを非同期に返す callClient.createCallAgent メソッドを使用する必要があります。

通話クライアントを作成するには、CommunicationTokenCredential オブジェクトを渡します。

import AzureCommunication

let tokenString = "token_string"
var userCredential: CommunicationTokenCredential?
do {
    let options = CommunicationTokenRefreshOptions(initialToken: token, refreshProactively: true, tokenRefresher: self.fetchTokenSync)
    userCredential = try CommunicationTokenCredential(withOptions: options)
} catch {
    updates("Couldn't created Credential object", false)
    initializationDispatchGroup!.leave()
    return
}

// tokenProvider needs to be implemented by Contoso, which fetches a new token
public func fetchTokenSync(then onCompletion: TokenRefreshOnCompletion) {
    let newToken = self.tokenProvider!.fetchNewToken()
    onCompletion(newToken, nil)
}

作成した CommunicationTokenCredential オブジェクトを CallClient に渡し、表示名を設定します。

self.callClient = CallClient()
let callAgentOptions = CallAgentOptions()
options.displayName = " iOS Azure Communication Services User"

self.callClient!.createCallAgent(userCredential: userCredential!,
    options: callAgentOptions) { (callAgent, error) in
        if error == nil {
            print("Create agent succeeded")
            self.callAgent = callAgent
        } else {
            print("Create agent failed")
        }
})

通話を記録する

Note

この API は開発者向けのプレビューとして提供されており、お客様からのフィードバックに基づいて変更される場合があります。 この API は、運用環境では使用しないでください。 この API を使用するには、Azure Communication Services Calling iOS SDK のベータ リリースを使用します。

通話記録は、コア Call オブジェクトの拡張機能です。

警告

Azure Communication Services Calling iOS SDK のバージョン 1.1.0 およびベータ リリース バージョン 1.1.0-beta.1 までは、isRecordingActiveCall オブジェクトの一部、didChangeRecordingStateCallDelegate デリゲートの一部でした。 新しいベータ リリースでは、これらの API は、Call の拡張機能として移動されました。

まず、レコーディング機能オブジェクトを取得する必要があります。

let callRecordingFeature = call.feature(Features.recording)

次に、通話が記録されているかどうかを確認するために、callRecordingFeatureisRecordingActive プロパティを調べます。 Bool を返します。

let isRecordingActive = callRecordingFeature.isRecordingActive;

イベント didChangeRecordingState を使用してクラスに RecordingCallFeatureDelegate デリゲートを実装することにより、レコーディングの変更をサブスクライブすることもできます。

callRecordingFeature.delegate = self

// didChangeRecordingState is a member of RecordingCallFeatureDelegate
public func recordingCallFeature(_ recordingCallFeature: RecordingCallFeature, didChangeRecordingState args: PropertyChangedEventArgs) {
    let isRecordingActive = recordingFeature.isRecordingActive
}

アプリケーションから記録を開始する場合は、まず「通話録音の概要」に従って、通話レコーディングを設定する手順を実行します。

サーバーで通話レコーディングを設定したら、iOS アプリケーションで通話から ServerCallId 値を取得し、それをサーバーに送信して、レコーディング プロセスを開始する必要があります。 ServerCallId 値を見つけるには、CallInfo クラスの getServerCallId() を使用します。 クラス オブジェクト内で CallInfo クラスを見つけるには、getInfo() を使用します。

// Send serverCallId to your recording server to start the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }

サーバーからレコーディングを開始すると、イベント didChangeRecordingState がトリガーされ、recordingFeature.isRecordingActive の値は true になります。

通話レコーディングを停止する場合は、通話レコーディングを開始するのと同じように、ServerCallId を取得し、それをレコーディング サーバーに送信して、そのサーバーがレコーディングを停止できるようにする必要があります。

// Send serverCallId to your recording server to stop the call recording.
let serverCallId = call.info.getServerCallId(){ (serverId, error) in }

サーバーからレコーディングを停止すると、イベント didChangeRecordingState がトリガーされ、recordingFeature.isRecordingActive の値は false になります。

システムを設定する

Visual Studio プロジェクトの作成

UWP アプリの場合、Visual Studio 2022 で、新しい空のアプリ (ユニバーサル Windows) プロジェクトを作成します。 プロジェクト名を入力した後、10.0.17763.0 より後の Windows SDK を自由に選択できます。

WinUI 3 アプリの場合、Blank App, Packaged (WinUI 3 in Desktop) テンプレートで新しいプロジェクトを作成し、シングルページの WinUI 3 アプリを設定します。 Windows App SDK バージョン 1.3 以降が必要です。

NuGet パッケージ マネージャーを使用してパッケージと依存関係をインストールする

Calling SDK の API とライブラリは、NuGet パッケージにより一般公開されています。

次の手順では、Calling SDK NuGet パッケージを検索、ダウンロード、インストールする方法の例を示します。

  1. [ツール]>[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理] を選んで、NuGet パッケージ マネージャーを開きます。
  2. [参照] を選び、検索ボックスに「Azure.Communication.Calling.WindowsClient」と入力します。
  3. [プレリリースを含める] チェック ボックスがオンになっていることを確認します。
  4. Azure.Communication.Calling.WindowsClient パッケージを選んでから、Azure.Communication.Calling.WindowsClient1.4.0-beta.1 以降のバージョンを選びます。
  5. 右側のタブで、Communication Services プロジェクトに対応するチェック ボックスをオンにします。
  6. [インストール] ボタンを選択します。

通話を記録する

通話記録は、コア Call オブジェクトの拡張機能です。 まず、レコーディング機能オブジェクトを取得する必要があります。

RecordingCallFeature recordingFeature = call.Features.Recording;

次に、通話が記録されているかどうかを確認するために、recordingFeatureIsRecordingActive プロパティを調べます。 boolean を返します。

boolean isRecordingActive = recordingFeature.IsRecordingActive;

また、変更の記録をサブスクライブすることもできます。

private async void Call__OnIsRecordingActiveChanged(object sender, PropertyChangedEventArgs args)
  boolean isRecordingActive = recordingFeature.IsRecordingActive;
}

recordingFeature.IsRecordingActiveChanged += Call__OnIsRecordingActiveChanged;

コンプライアンス レコーディング

コンプライアンス レコーディングは、Microsoft Teams ポリシーに基づくレコーディングです。 これを有効にするには、通話用 Teams ポリシーベースのレコーディングの概要チュートリアルを使用します。

ポリシーベースのレコーディングは、ポリシーを持つユーザーが通話に参加すると自動的に開始されます。 レコーディングに関する通知を Azure Communication Services から取得するには、次のコードを使用します。

const callRecordingApi = call.feature(Features.Recording);

const isComplianceRecordingActive = callRecordingApi.isRecordingActive;

const isComplianceRecordingActiveChangedHandler = () => {
    console.log(callRecordingApi.isRecordingActive);
};

callRecordingApi.on('isRecordingActiveChanged', isComplianceRecordingActiveChangedHandler);

カスタム レコーディング ボットを使用してコンプライアンス レコーディングを実装することもできます。 GitHub の例を参照してください。

次のステップ