[アーティクル] 11/06/2024
3 人の共同作成者
フィードバック
この記事の内容
Call Automation は、REST API インターフェイスを使用してアクションの要求を受信し、要求が正常に送信されたかどうかを通知する応答を提供するものです。 通話の非同期性のため、ほとんどのアクションには、アクションが正常に完了または失敗したときにトリガーされる、対応するイベントがあります。 このガイドでは、DTMF 送信や継続的 DTMF 認識など、開発者が通話中に使用できるアクションについて説明します。 アクションには、そのアクションを呼び出す方法を示すサンプル コードが付属しています。
Call Automation では、このガイドに含まれていない通話と記録を管理するための他のさまざまなアクションがサポートされています。
Note
現在、Call Automation と Microsoft Teams の相互運用はできません。 Teams ユーザーに対する、Call Automation を使用した発信、リダイレクト、オーディオの再生などのアクションはサポートされていません。
このガイドを最大限に活用するには、前提条件として次の記事を参照することをお勧めします。
Call Automation の概念ガイド では、アクション イベント プログラミング モデルとイベント コールバックについて説明しています。
このガイドで使用している CommunicationUserIdentifier や PhoneNumberIdentifier などのユーザー識別子 についての説明。
Call Automation を使用して通話を制御および操作する方法 の詳細について説明します。ここでは、通話を処理する際の基本の扱いについて説明しています。
すべてのコード サンプルについて、client
は示されている方法で作成できる CallAutomationClient オブジェクトであり、callConnection
は、Answer または CreateCall 応答から取得される CallConnection オブジェクトです。 アプリケーションで受信するコールバック イベントから取得することもできます。
var callAutomationClient = new CallAutomationClient("<Azure Communication Services connection string>");
CallAutomationClient callAutomationClient = new CallAutomationClientBuilder()
.connectionString("<Azure Communication Services connection string>")
.buildClient();
callAutomationClient = new CallAutomationClient(("<Azure Communication Services connection string>");
call_automation_client = CallAutomationClient.from_connection_string((("<Azure Communication Services connection string>")
DTMF 送信
DTMF トーンを外部参加者に送信できます。これが便利なのは、すでに通話の準備ができていて、内線番号または IVR メニューを持つ別の参加者を招待して移動する必要がある場合です。
Note
これがサポートされているのは外部の PSTN 参加者のみであり、一度に最大で 18 トーンの送信がサポートされます。
SendDtmfAsync メソッド
DTMF トーンの一覧を外部参加者に送信します。
var tones = new DtmfTone[] { DtmfTone.One, DtmfTone.Two, DtmfTone.Three, DtmfTone.Pound };
var sendDtmfTonesOptions = new SendDtmfTonesOptions(tones, new PhoneNumberIdentifier(calleePhonenumber))
{
OperationContext = "dtmfs-to-ivr"
};
var sendDtmfAsyncResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.SendDtmfTonesAsync(sendDtmfTonesOptions);
List<DtmfTone> tones = Arrays.asList(DtmfTone.ONE, DtmfTone.TWO, DtmfTone.THREE, DtmfTone.POUND);
SendDtmfTonesOptions options = new SendDtmfTonesOptions(tones, new PhoneNumberIdentifier(c2Target));
options.setOperationContext("dtmfs-to-ivr");
callAutomationClient.getCallConnectionAsync(callConnectionId)
.getCallMediaAsync()
.sendDtmfTonesWithResponse(options)
.block();
const tones = [DtmfTone.One, DtmfTone.Two, DtmfTone.Three];
const sendDtmfTonesOptions: SendDtmfTonesOptions = {
operationContext: "dtmfs-to-ivr"
};
const result: SendDtmfTonesResult = await callAutomationClient.getCallConnection(callConnectionId)
.getCallMedia()
.sendDtmfTones(tones, {
phoneNumber: c2Target
}, sendDtmfTonesOptions);
console.log("sendDtmfTones, result=%s", result);
tones = [DtmfTone.ONE, DtmfTone.TWO, DtmfTone.THREE]
result = call_automation_client.get_call_connection(call_connection_id).send_dtmf_tones(
tones = tones,
target_participant = PhoneNumberIdentifier(c2_target),
operation_context = "dtmfs-to-ivr")
app.logger.info("Send dtmf, result=%s", result)
アプリケーションがこれらの DTMF トーンを送信すると、イベント更新が届きます。 SendDtmfTonesCompleted
および SendDtmfTonesFailed
のイベントを使用してビジネス ロジックをアプリケーション内に作成して、次のステップを決めることができます。
SendDtmfTonesCompleted イベントの例
if (acsEvent is SendDtmfTonesCompleted sendDtmfCompleted)
{
logger.LogInformation("Send DTMF succeeded, context={context}", sendDtmfCompleted.OperationContext);
}
if (acsEvent instanceof SendDtmfTonesCompleted) {
SendDtmfTonesCompleted event = (SendDtmfTonesCompleted) acsEvent;
log.info("Send dtmf succeeded: context=" + event.getOperationContext());
}
if (event.type === "Microsoft.Communication.SendDtmfTonesCompleted") {
console.log("Send dtmf succeeded: context=%s", eventData.operationContext);
}
if event.type == "Microsoft.Communication.SendDtmfTonesCompleted":
app.logger.info("Send dtmf succeeded: context=%s", event.data['operationContext']);
SendDtmfTonesFailed イベントの例
if (acsEvent is SendDtmfTonesFailed sendDtmfFailed)
{
logger.LogInformation("Send dtmf failed: result={result}, context={context}",
sendDtmfFailed.ResultInformation?.Message, sendDtmfFailed.OperationContext);
}
if (acsEvent instanceof SendDtmfTonesFailed) {
SendDtmfTonesFailed event = (SendDtmfTonesFailed) acsEvent;
log.info("Send dtmf failed: result=" + event.getResultInformation().getMessage() + ", context="
+ event.getOperationContext());
}
if (event.type === "Microsoft.Communication.SendDtmfTonesFailed") {
console.log("sendDtmfTones failed: result=%s, context=%s",
eventData.resultInformation.message,
eventData.operationContext);
}
if event.type == "Microsoft.Communication.SendDtmfTonesFailed":
app.logger.info("Send dtmf failed: result=%s, context=%s", event.data['resultInformation']['message'], event.data['operationContext'])
継続的 DTMF 認識
継続的 DTMF トーンを通話全体で受け取るためのサブスクライブができます。 対象となる参加者がキーパッドのキーを押すと、アプリケーションが DTMF トーンを受信します。 これらのトーンは、参加者がキーを押していると、アプリケーションにひとつずつ送信されます。
StartContinuousDtmfRecognitionAsync メソッド
参加者によって送信された DTMF トーンの検出を開始します。
await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartContinuousDtmfRecognitionAsync(new PhoneNumberIdentifier(c2Target), "dtmf-reco-on-c2");
ContinuousDtmfRecognitionOptions options = new ContinuousDtmfRecognitionOptions(new PhoneNumberIdentifier(c2Target));
options.setOperationContext("dtmf-reco-on-c2");
callAutomationClient.getCallConnectionAsync(callConnectionId)
.getCallMediaAsync()
.startContinuousDtmfRecognitionWithResponse(options)
.block();
const continuousDtmfRecognitionOptions: ContinuousDtmfRecognitionOptions = {
operationContext: "dtmf-reco-on-c2"
};
await callAutomationclient.getCallConnection(callConnectionId)
.getCallMedia()
.startContinuousDtmfRecognition({
phoneNumber: c2Target
}, continuousDtmfRecognitionOptions);
call_automation_client.get_call_connection(
call_connection_id
).start_continuous_dtmf_recognition(
target_participant=PhoneNumberIdentifier(c2_target),
operation_context="dtmf-reco-on-c2",
)
app.logger.info("Started continuous DTMF recognition")
アプリケーションで参加者から DTMF トーンをこれ以上受信したくない場合は、StopContinuousDtmfRecognitionAsync
メソッドを使用して Azure Communication Services に DTMF トーンの検出を停止するよう知らせることができます。
StopContinuousDtmfRecognitionAsync
参加者によって送信された DTMF トーンの検出を停止します。
var continuousDtmfRecognitionOptions = new ContinuousDtmfRecognitionOptions(new PhoneNumberIdentifier(callerPhonenumber))
{
OperationContext = "dtmf-reco-on-c2"
};
var startContinuousDtmfRecognitionAsyncResult = await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia()
.StartContinuousDtmfRecognitionAsync(continuousDtmfRecognitionOptions);
ContinuousDtmfRecognitionOptions options = new ContinuousDtmfRecognitionOptions(new PhoneNumberIdentifier(c2Target));
options.setOperationContext("dtmf-reco-on-c2");
callAutomationClient.getCallConnectionAsync(callConnectionId)
.getCallMediaAsync()
.stopContinuousDtmfRecognitionWithResponse(options)
.block();
const continuousDtmfRecognitionOptions: ContinuousDtmfRecognitionOptions = {
operationContext: "dtmf-reco-on-c2"
};
await callAutomationclient.getCallConnection(callConnectionId)
.getCallMedia()
.stopContinuousDtmfRecognition({
phoneNumber: c2Target
}, continuousDtmfRecognitionOptions);
call_automation_client.get_call_connection(call_connection_id).stop_continuous_dtmf_recognition(
target_participant=PhoneNumberIdentifier(c2_target),
operation_context="dtmf-reco-on-c2")
app.logger.info("Stopped continuous DTMF recognition")
アプリケーションがイベント更新を受信するのは、これらのアクションが成功したか失敗したときです。 これらのイベントを使用してカスタム ビジネス ロジックを構築して、これらのイベント更新を受け取ったときアプリケーションがとるべき次のステップ を構成できます。
ContinuousDtmfRecognitionToneReceived イベント
正常に検出された DTMF トーンをどう処理するかの例。
if (acsEvent is ContinuousDtmfRecognitionToneReceived continuousDtmfRecognitionToneReceived)
{
logger.LogInformation("Tone detected: sequenceId={sequenceId}, tone={tone}",
continuousDtmfRecognitionToneReceived.SequenceId,
continuousDtmfRecognitionToneReceived.Tone);
}
if (acsEvent instanceof ContinuousDtmfRecognitionToneReceived) {
ContinuousDtmfRecognitionToneReceived event = (ContinuousDtmfRecognitionToneReceived) acsEvent;
log.info("Tone detected: sequenceId=" + event.getSequenceId()
+ ", tone=" + event.getTone().convertToString()
+ ", context=" + event.getOperationContext());
}
if (event.type === "Microsoft.Communication.ContinuousDtmfRecognitionToneReceived") {
console.log("Tone detected: sequenceId=%s, tone=%s, context=%s",
eventData.sequenceId,
eventData.tone,
eventData.operationContext);
}
if event.type == "Microsoft.Communication.ContinuousDtmfRecognitionToneReceived":
app.logger.info("Tone detected: sequenceId=%s, tone=%s, context=%s",
event.data['sequenceId'],
event.data['tone'],
event.data['operationContext'])
Azure Communication Services から ContinuousDtmfRecognitionToneReceived
イベントの一部として SequenceId
が提供され、アプリケーションはこれを使用して参加者が DTMF トーンを入力した順序を再構築できます。
ContinuousDtmfRecognitionFailed イベント
DTMF トーン検出が失敗したときどのように処理するかの例。
if (acsEvent is ContinuousDtmfRecognitionToneFailed continuousDtmfRecognitionToneFailed)
{
logger.LogInformation("Start continuous DTMF recognition failed, result={result}, context={context}",
continuousDtmfRecognitionToneFailed.ResultInformation?.Message,
continuousDtmfRecognitionToneFailed.OperationContext);
}
if (acsEvent instanceof ContinuousDtmfRecognitionToneFailed) {
ContinuousDtmfRecognitionToneFailed event = (ContinuousDtmfRecognitionToneFailed) acsEvent;
log.info("Tone failed: result="+ event.getResultInformation().getMessage()
+ ", context=" + event.getOperationContext());
}
if (event.type === "Microsoft.Communication.ContinuousDtmfRecognitionToneFailed") {
console.log("Tone failed: result=%s, context=%s", eventData.resultInformation.message, eventData.operationContext);
}
if event.type == "Microsoft.Communication.ContinuousDtmfRecognitionToneFailed":
app.logger.info(
"Tone failed: result=%s, context=%s",
event.data["resultInformation"]["message"],
event.data["operationContext"],
)
ContinuousDtmfRecogntionStopped イベント
継続的 DTMF 認識が停止したときどう処理するかの例。停止の理由は、アプリケーションが StopContinuousDtmfRecognitionAsync
イベントを呼び出したか、あるいは呼び出しが終了したことが考えられます。
if (acsEvent is ContinuousDtmfRecognitionStopped continuousDtmfRecognitionStopped)
{
logger.LogInformation("Continuous DTMF recognition stopped, context={context}", continuousDtmfRecognitionStopped.OperationContext);
}
if (acsEvent instanceof ContinuousDtmfRecognitionStopped) {
ContinuousDtmfRecognitionStopped event = (ContinuousDtmfRecognitionStopped) acsEvent;
log.info("Tone stopped, context=" + event.getOperationContext());
}
if (event.type === "Microsoft.Communication.ContinuousDtmfRecognitionStopped") {
console.log("Tone stopped: context=%s", eventData.operationContext);
}
if event.type == "Microsoft.Communication.ContinuousDtmfRecognitionStopped":
app.logger.info("Tone stoped: context=%s", event.data["operationContext"])
Hold
保留アクションを使用すると、開発者は参加者とシステムまたはエージェント間の会話を一時停止できます。 これは、参加者を別のエージェントまたは部署に転送する必要があるシナリオで、またはエージェントが会話を続ける前にバックグラウンドでスーパーバイザーと相談する必要がある場合に役立ちます。 この間、保留中の参加者に音声が聞こえるようにすることを選択できます。
// Option 1: Hold without additional options
await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia().HoldAsync(c2Target);
/*
// Option 2: Hold with play source
PlaySource playSource = /* initialize playSource */;
await callAutomationClient.GetCallConnection(callConnectionId)
.GetCallMedia().HoldAsync(c2Target, playSource);
// Option 3: Hold with options
var holdOptions = new HoldOptions(target)
{
OperationCallbackUri = new Uri(""),
OperationContext = "holdcontext"
};
await callMedia.HoldAsync(holdOptions);
*/
// Option 1: Hold with options
PlaySource playSource = /* initialize playSource */;
HoldOptions holdOptions = new HoldOptions(target)
.setOperationCallbackUrl(appConfig.getBasecallbackuri())
.setPlaySource(playSource)
.setOperationContext("holdPstnParticipant");
client.getCallConnection(callConnectionId).getCallMedia().holdWithResponse(holdOptions, Context.NONE);
/*
// Option 2: Hold without additional options
client.getCallConnection(callConnectionId).getCallMedia().hold(target);
*/
// Option 1: Hold with options
const options = {
playSource: playSource,
operationContext: "holdUserContext",
operationCallbackUrl: "URL" // replace with actual callback URL
};
await callMedia.hold(targetuser, options);
/*
// Option 2: Hold without additional options
await callMedia.hold(targetuser);
*/
# Option 1: Hold without additional options
call_connection_client.hold(target_participant=PhoneNumberIdentifier(TARGET_PHONE_NUMBER))
'''
# Option 2: Hold with options
call_connection_client.hold(
target_participant=PhoneNumberIdentifier(TARGET_PHONE_NUMBER),
play_source=play_source,
operation_context="holdUserContext",
operation_callback_url="URL" # replace with actual callback URL
)
'''
保留解除
保留アクションを使用すると、開発者は以前に一時停止した、参加者とシステムまたはエージェント間の会話を再開できます。 参加者の保留が解除されると、システムまたはエージェントの音声が再び聞こえるようになります。
var unHoldOptions = new UnholdOptions(target)
{
OperationContext = "UnHoldPstnParticipant"
};
// Option 1
var UnHoldParticipant = await callMedia.UnholdAsync(unHoldOptions);
/*
// Option 2
var UnHoldParticipant = await callMedia.UnholdAsync(target);
*/
// Option 1
client.getCallConnection(callConnectionId).getCallMedia().unholdWithResponse(target, "unholdPstnParticipant", Context.NONE);
/*
// Option 2
client.getCallConnection(callConnectionId).getCallMedia().unhold(target);
*/
const unholdOptions = {
operationContext: "unholdUserContext"
};
// Option 1
await callMedia.unhold(target);
/*
// Option 2
await callMedia.unhold(target, unholdOptions);
*/
# Option 1
call_connection_client.unhold(target_participant=PhoneNumberIdentifier(TARGET_PHONE_NUMBER))
'''
# Option 2
call_connection_client.unhold(target_participant=PhoneNumberIdentifier(TARGET_PHONE_NUMBER), operation_context="holdUserContext")
'''
オーディオ ストリーミング (パブリック プレビュー)
オーディオ ストリーミングを使用すると、進行中の通話からリアルタイムのオーディオ ストリームをサブスクライブできます。 オーディオ ストリーミングの使用を開始する方法の詳細なガイダンスと、オーディオ ストリーミング コールバック イベントに関する情報については、このページ を参照してください。
リアルタイム文字起こし (パブリック プレビュー)
リアルタイム文字起こしを使用すると、進行中の通話の音声のライブ文字起こしにアクセスできます。 リアルタイム文字起こしの使用を開始する方法の詳細なガイダンスと、リアルタイム文字起こしコールバック イベントに関する情報については、このページ を参照してください。
次の表は、直前の操作がまだ実行中またはキューに入っている場合に実行/キューに入れることが許可されているメディア アクションを示しています。
既存の操作
通話レッグ
許可
不許可
PlayToAll
メイン
PlayToAll、Recognize(Non-Group Call)、PlayTo、Recognize(Group Call)、SendDTMF、StartContinuousDtmfRecognition
なし
Recognize(Non-Group Call)
メイン
PlayToAll、Recognize(Non-Group Call)、PlayTo、Recognize(Group Call)、SendDTMF、StartContinuousDtmfRecognition
なし
PlayTo
Sub
PlayToAll、Recognize(Non-Group Call)
PlayTo、Recognize(Group Call)、SendDTMF、StartContinuousDtmfRecognition
Recognize(Group Call)
Sub
PlayToAll、Recognize(Non-Group Call)
PlayTo、Recognize(Group Call)、SendDTMF、StartContinuousDtmfRecognition
SendDTMF
Sub
PlayToAll、Recognize(Non-Group Call)
PlayTo、Recognize(Group Call)、SendDTMF、StartContinuousDtmfRecognition
StartContinuousDtmfRecognition
Sub
PlayToAll、Recognize(Non-Group Call)、PlayTo、Recognize(Group Call)、SendDTMF、StartContinuousDtmfRecognition
なし