Condividi tramite


Come controllare le azioni multimediali mid-call con l'automazione delle chiamate

L'automazione delle chiamate usa un'interfaccia API REST per ricevere richieste di azioni e fornire risposte per notificare se la richiesta è stata inviata o meno correttamente. A causa della natura asincrona della chiamata, la maggior parte delle azioni ha eventi corrispondenti che vengono attivati quando l'azione viene completata correttamente o ha esito negativo. Questa guida illustra le azioni disponibili per gli sviluppatori durante le chiamate, ad esempio Invia DTMF e Riconoscimento DTMF continuo. Le azioni sono accompagnate da un codice di esempio su come richiamare l'azione in corso.

L'automazione delle chiamate supporta varie altre azioni per gestire le chiamate e la registrazione che non sono incluse in questa guida.

Nota

L'automazione delle chiamate attualmente non interagisce con Microsoft Teams. Azioni come l'esecuzione, il reindirizzamento di una chiamata a un utente di Teams o la riproduzione di audio a un utente di Teams tramite Automazione chiamate non sono supportate.

Come prerequisito, è consigliabile leggere questi articoli per sfruttare al meglio questa guida:

  1. Guida concettuale relativa all'automazione delle chiamate che descrive il modello di programmazione degli eventi action-event e i callback degli eventi.
  2. Informazioni sugli identificatori utente come CommunicationUserIdentifier e PhoneNumberIdentifier usati in questa guida.
  3. Altre informazioni su come controllare e gestire le chiamate con Automazione chiamate, che illustra le nozioni di base relative alla gestione di una chiamata.

Per tutti gli esempi di codice, client è l'oggetto CallAutomationClient che può essere creato come illustrato e callConnection è l'oggetto CallConnection ottenuto dalla risposta Answer o CreateCall. È anche possibile ottenerlo dagli eventi di callback ricevuti dall'applicazione.

var callAutomationClient = new CallAutomationClient("<Azure Communication Services connection string>");

Inviare DTMF

È possibile inviare toni DTMF a un partecipante esterno, il che può essere utile quando si è già in una chiamata e si deve invitare un altro partecipante che ha un numero di interno o un menu IVR per spostarsi.

Nota

Questa opzione è supportata solo per i partecipanti PSTN esterni e supporta l'invio di un massimo di 18 toni alla volta.

Metodo SendDtmfAsync

Inviare un elenco di toni DTMF a un partecipante esterno.

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); 

Quando l'applicazione invia questi toni DTMF, si ricevono gli aggiornamenti degli eventi. È possibile usare gli eventi SendDtmfTonesCompleted e SendDtmfTonesFailed per creare logica di business nell'applicazione per determinare i passaggi successivi.

Esempio di evento SendDtmfTonesCompleted

if (acsEvent is SendDtmfTonesCompleted sendDtmfCompleted) 
{ 
    logger.LogInformation("Send DTMF succeeded, context={context}", sendDtmfCompleted.OperationContext); 
} 

Esempio di SendDtmfTonesFailed

if (acsEvent is SendDtmfTonesFailed sendDtmfFailed) 
{ 
    logger.LogInformation("Send dtmf failed: result={result}, context={context}", 
        sendDtmfFailed.ResultInformation?.Message, sendDtmfFailed.OperationContext); 
} 

Riconoscimento DTMF continuo

È possibile iscriversi per ricevere toni DTMF continui durante la chiamata. L'applicazione riceve toni DTMF quando il partecipante di destinazione preme un tasto sul tastierino. Tali toni vengono inviati all'applicazione uno alla volta, man mano che il partecipante li preme.

Metodo StartContinuousDtmfRecognitionAsync

Iniziare a rilevare i toni DTMF inviati da un partecipante.

await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .StartContinuousDtmfRecognitionAsync(new PhoneNumberIdentifier(c2Target), "dtmf-reco-on-c2"); 

Quando l'applicazione non vuole più ricevere toni DTMF dal partecipante, è possibile usare il metodo StopContinuousDtmfRecognitionAsync per informare Servizi di comunicazione di Azure di interrompere il rilevamento dei toni DTMF.

StopContinuousDtmfRecognitionAsync

Interrompere il rilevamento dei toni DTMF inviati dal partecipante.

var continuousDtmfRecognitionOptions = new ContinuousDtmfRecognitionOptions(new PhoneNumberIdentifier(callerPhonenumber)) 
{ 
    OperationContext = "dtmf-reco-on-c2" 
}; 

var startContinuousDtmfRecognitionAsyncResult = await callAutomationClient.GetCallConnection(callConnectionId) 
    .GetCallMedia() 
    .StartContinuousDtmfRecognitionAsync(continuousDtmfRecognitionOptions); 

L'applicazione riceve gli aggiornamenti degli eventi quando queste azioni hanno esito positivo o negativo. È possibile usare questi eventi per compilare logica di business personalizzata per configurare il passaggio successivo che l'applicazione deve eseguire quando riceve questi aggiornamenti degli eventi.

ContinuousDtmfRecognitionToneReceived

Esempio di come è possibile gestire correttamente un tono DTMF rilevato correttamente.

if (acsEvent is ContinuousDtmfRecognitionToneReceived continuousDtmfRecognitionToneReceived) 
{ 
	logger.LogInformation("Tone detected: sequenceId={sequenceId}, tone={tone}", 
	continuousDtmfRecognitionToneReceived.SequenceId, 
        continuousDtmfRecognitionToneReceived.Tone); 
} 

Servizi di comunicazione di Azure fornisce SequenceId quale parte dell'evento ContinuousDtmfRecognitionToneReceived, che l'applicazione può usare per ricostruire l'ordine in cui il partecipante ha immesso i toni DTMF.

Evento ContinuousDtmfRecognitionFailed

Esempio di come è possibile eseguire la gestione quando il rilevamento del tono DTMF ha esito negativo.

if (acsEvent is ContinuousDtmfRecognitionToneFailed continuousDtmfRecognitionToneFailed) 
{ 
    logger.LogInformation("Start continuous DTMF recognition failed, result={result}, context={context}", 
        continuousDtmfRecognitionToneFailed.ResultInformation?.Message, 
        continuousDtmfRecognitionToneFailed.OperationContext); 
} 

Evento ContinuousDtmfRecogntionStopped

Esempio di come effettuare la gestione quando il riconoscimento DTMF continuo è stato arrestato, ciò potrebbe essere dovuto al fatto che l'applicazione ha richiamato l'evento StopContinuousDtmfRecognitionAsync o che la chiamata è terminata.

if (acsEvent is ContinuousDtmfRecognitionStopped continuousDtmfRecognitionStopped) 
{ 
    logger.LogInformation("Continuous DTMF recognition stopped, context={context}", continuousDtmfRecognitionStopped.OperationContext); 
} 

Pausa

L'azione di messa in attesa consente agli sviluppatori di sospendere temporaneamente una conversazione tra un partecipante e un sistema o un agente. Ciò può essere utile negli scenari in cui il partecipante deve essere trasferito a un altro agente o reparto o quando l'agente deve consultare un supervisore in background prima di continuare la conversazione. Durante questo periodo è possibile scegliere di riprodurre l'audio al partecipante che è in attesa.

// 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);
*/

Riprendere chiamata

L'azione di annullamento della messa in attesa consente agli sviluppatori di riprendere una conversazione tra un partecipante e un sistema o un agente sospesa in precedenza. Quando per il partecipante viene annullata la messa in attesa, lo stesso sarà in grado di ascoltare di nuovo il sistema o l'agente.

var unHoldOptions = new UnholdOptions(target) 
{ 
    OperationContext = "UnHoldPstnParticipant" 
}; 

// Option 1
var UnHoldParticipant = await callMedia.UnholdAsync(unHoldOptions);

/* 
// Option 2
var UnHoldParticipant = await callMedia.UnholdAsync(target);
*/

Streaming audio (anteprima pubblica)

Lo streaming audio consente di sottoscrivere flussi audio in tempo reale da una chiamata in corso. Per indicazioni più dettagliate su come iniziare a usare lo streaming audio e informazioni sugli eventi di callback di streaming audio, vedere questa pagina.

Trascrizione in tempo reale (anteprima pubblica)

La trascrizione in tempo reale consente di accedere alle trascrizioni in tempo reale per l'audio di una chiamata in corso. Per indicazioni più dettagliate su come iniziare a usare la trascrizione in tempo reale e informazioni sugli eventi di callback della trascrizione in tempo reale, vedere questa pagina.

Tabella di compatibilità delle azioni multimediali

Nella tabella seguente vengono illustrate le operazioni multimediali consentite per l'esecuzione o la coda se un'operazione precedente è ancora in esecuzione o in coda.

Operazione esistente Call Leg Consentito Non consentito
PlayToAll Principale PlayToAll, Recognize(Non-Group Call), PlayTo, Recognize(Group Call), SendDTMF, StartContinuousDtmfRecognition None
Recognize(Chiamata non di gruppo) Principale PlayToAll, Recognize(Non-Group Call), PlayTo, Recognize(Group Call), SendDTMF, StartContinuousDtmfRecognition None
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 Nessuno