

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Comprendere le notifiche per l'SDK Amazon Chime
<a name="va-notification-targets"></a>

L'analisi vocale invia automaticamente gli eventi a un bersaglio all'inizio delle attività di ricerca degli altoparlanti o di analisi del tono vocale, mentre sono in esecuzione e al termine. Gli obiettivi di notifica vengono utilizzati per ricevere tali eventi. Ti consigliamo di utilizzare più obiettivi di notifica se il flusso di lavoro o l'applicazione richiedono un'elevata disponibilità.

Inoltre, devi utilizzare un ruolo IAM con le policy necessarie per accedere ai tuoi obiettivi di notifica. Per ulteriori informazioni, consulta [Utilizzo del ruolo di accesso alle risorse di analisi delle chiamate per l'SDK Amazon Chime](call-analytics-resource-access-role.md).

**Nota**  
Per Amazon SQS e Amazon SNS, non supportiamo le code. first-in-first-out Di conseguenza, i messaggi potrebbero arrivare fuori servizio. Ti consigliamo di controllare i timestamp per ordinare i messaggi in base alle esigenze e di rendere persistenti i messaggi in un data store come Amazon DynamoDB. Puoi anche utilizzare il comando Get APIs descritto in [Sondaggio dei risultati delle attività per l'SDK Amazon Chime](va-task-result-poll.md) per ricevere i risultati più recenti.

La tabella seguente elenca gli eventi e i tipi di dettaglio corrispondenti.


| Evento di notifica | Tipo di dettaglio | 
| --- | --- | 
| Metadati di analisi vocale | `VoiceAnalyticsStatus` | 
| Ricerca di altoparlanti | `SpeakerSearchStatus` | 
| Analisi del tono vocale | `VoiceToneAnalysisStatus` | 

# Comprensione delle policy IAM per gli obiettivi di notifica per l'SDK Amazon Chime
<a name="va-iam-target-policies"></a>

È necessario utilizzare le policy nel ruolo IAM in una configurazione di Call Analytics che consenta l'accesso ai target di notifica di Amazon SQS, Amazon SNS, AWS Lambda o Amazon KDS. Per ulteriori informazioni sul tagging, consulta [Utilizzo del ruolo di accesso alle risorse di analisi delle chiamate per l'SDK Amazon Chime](call-analytics-resource-access-role.md)in questa guida.

## Eventi di ricerca dei relatori
<a name="va-speaker-search-events"></a>

Gli eventi di ricerca degli altoparlanti hanno il tipo di `SpeakerSearchStatus` dettaglio.

I connettori vocali di Amazon Chime SDK inviano i seguenti eventi di ricerca degli altoparlanti:
+ L'identificazione corrisponde
+ Generazione di incorporamento vocale

Gli eventi possono avere i seguenti stati:
+ `IdentificationSuccessful`— Identificato con successo almeno un ID del profilo vocale corrispondente con un punteggio di affidabilità elevato nel dominio del profilo vocale specificato.
+ `IdentificationFailure`— Impossibile eseguire l'identificazione. Cause: il chiamante non parla per almeno 10 secondi, qualità audio scadente.
+ `IdentificationNoMatchesFound`— Impossibile trovare una corrispondenza ad alta confidenza nel dominio del profilo vocale specificato. Il chiamante potrebbe essere nuovo o la sua voce potrebbe essere cambiata.
+ `VoiceprintGenerationSuccessful`— Il sistema ha generato un incorporamento vocale utilizzando 20 secondi di audio non silenzioso.
+ `VoiceprintGenerationFailure`— Il sistema non è riuscito a generare un incorporamento vocale. Cause: il chiamante non parla per almeno 20 secondi, qualità audio scadente.

### L'identificazione corrisponde
<a name="va-id-matches"></a>

Dopo una determinata chiamata all'[https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartSpeakerSearchTask](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartSpeakerSearchTask)API`transactionId`, il servizio Voice Connector restituisce una notifica di corrispondenza dell'identificazione dopo 10 secondi di conversazione non silenziosa. Il servizio restituisce le prime 10 corrispondenze, insieme a un ID del profilo vocale e a un punteggio di affidabilità compreso tra [0, 1]. Più alto è il punteggio di confidenza, più è probabile che l'oratore della chiamata corrisponda all'ID del profilo vocale. Se il modello di machine learning non trova alcuna corrispondenza, il `detailStatus` campo della notifica contiene`IdentificationNoMatchesFound`.

L'esempio seguente mostra la notifica di un abbinamento riuscito.

```
{    
    "version": "0",
    "id": "12345678-1234-1234-1234-111122223333",
    "detail-type": "SpeakerSearchStatus",
    "service-type": "VoiceAnalytics",
    "source": "aws.chime",
    "account": "111122223333",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "taskId": "uuid",
        "detailStatus": "IdentificationSuccessful",
        "speakerSearchDetails" : {
            "results": [
                {
                    "voiceProfileId": "vp-505e0992-82da-49eb-9d4a-4b34772b96b6",
                    "confidenceScore": "0.94567856",
                },
                {
                    "voiceProfileId": "vp-fba9cbfa-4b8d-4f10-9e41-9dfdd66545ab",
                    "confidenceScore": "0.82783350",
                },
                {
                    "voiceProfileId": "vp-746995fd-16dc-45b9-8965-89569d1cf787",
                    "confidenceScore": "0.77136436",
                }
            ]
        },
        "mediaInsightsPipelineId": "87654321-33ca-4dc6-9cdf-abcde6612345",
        "sourceArn": "arn:aws:chime:us-east-1:111122223333:media-pipeline/87654321-33ca-4dc6-9cdf-abcde6612345",
        "streamArn": "arn:aws:kinesisvideo:us-east-1:111122223333:stream/my-stream/0123456789012",
        "channelId": 0
    }
}
```

### Generazione di incorporamento vocale
<a name="va-voice-print-generation"></a>

Dopo altri 10 secondi di conversazione non silenziosa, Voice Connector invia una notifica di generazione di incorporamento vocale ai destinatari della notifica. È possibile registrare nuovi incorporamenti vocali in un profilo vocale o aggiornare una stampa già presente in un profilo vocale.

L'esempio seguente mostra la notifica di un abbinamento riuscito, il che significa che puoi aggiornare il profilo vocale associato.

```
{
    "version": "0",
    "id": "12345678-1234-1234-1234-111122223333",
    "detail-type": "SpeakerSearchStatus",
    "service-type": "VoiceAnalytics",
    "source": "aws.chime",
    "account": "111122223333",
    "time": "yyyy-mm-ddThh:mm:ssZ",
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "taskId": "guid",
        "detailStatus": "VoiceprintGenerationSuccess",
        "mediaInsightsPipelineId": "87654321-33ca-4dc6-9cdf-abcde6612345",
        "sourceArn": "arn:aws:chime:us-east-1:111122223333:media-pipeline/87654321-33ca-4dc6-9cdf-abcde6612345",
        "streamArn": "arn:aws:kinesisvideo:us-east-1:111122223333:stream/my-stream/0123456789012",
        "channelId": 0
    }
}
```

## Eventi di analisi del tono vocale
<a name="va-tone-status"></a>

Gli eventi di analisi del tono vocale hanno il tipo di `VoiceToneAnalysisStatus` dettaglio. Le analisi possono restituire questi stati:
+ `VoiceToneAnalysisSuccessful`— Ha analizzato con successo le voci del chiamante e dell'agente in base alle probabilità di sentimento: positivo, negativo o neutro.
+ `VoiceToneAnalysisFailure`— Impossibile eseguire l'analisi del tono. Ciò può accadere se il chiamante si blocca senza parlare per 10 secondi o se la qualità dell'audio diventa troppo scarsa.
+ `VoiceToneAnalysisCompleted`— Ha analizzato con successo le voci degli utenti e degli agenti in base alle probabilità di sentimento per l'intera chiamata. Questo è l'evento finale, inviato al termine dell'analisi del tono vocale.

L'esempio seguente mostra un tipico evento di analisi del tono vocale.

```
{
  "detail-type": "VoiceToneAnalysisStatus",
  "service-type": "VoiceAnalytics",
  "source": "aws.chime",
  "account": "216539279014",
  "time": "2022-08-26T17:55:15.563441Z",
  "region": "us-east-1",
  "detail": {
    "taskId": "uuid",
    "detailStatus": "VoiceToneAnalysisSuccessful",
    "voiceToneAnalysisDetails": {
      "currentAverageVoiceTone": {
          "startTime": "2022-08-26T17:55:15.563Z",
          "endTime": "2022-08-26T17:55:45.720Z",
          "voiceToneLabel": "neutral",
          "voiceToneScore": {    
            "neutral": "0.83",    
            "positive": "0.13",    
            "negative": "0.04"
          }
      },
      "overallAverageVoiceTone": {
          "startTime": "2022-08-26T16:23:13.344Z",
          "endTime": "2022-08-26T17:55:45.720Z",
          "voiceToneLabel": "positive",
          "voiceToneScore": {    
            "neutral": "0.25",    
            "positive": "0.65",    
            "negative": "0.1"
          }
      }
    },
        "startFragmentNumber": "01234567890123456789",
        "mediaInsightsPipelineId": "87654321-33ca-4dc6-9cdf-abcde6612345",
        "sourceArn": "arn:aws:chime:us-east-1:111122223333:media-pipeline/87654321-33ca-4dc6-9cdf-abcde6612345",
        "streamArn": "arn:aws:kinesisvideo:us-east-1:111122223333:stream/my-stream/0123456789012",
        "channelId": 0
  },
  "version": "0",
  "id": "Id-f928dfe3-f44b-4965-8a17-612f9fb92d59"
}
```

## Eventi di riepilogo post-chiamata
<a name="va-post-call-summary-events"></a>

Gli eventi di riepilogo successivi alla chiamata vengono inviati 5 minuti dopo la fine della chiamata. Questi riepiloghi forniscono una panoramica delle attività di ricerca degli interlocutori che si sono svolte durante la chiamata.

L'esempio seguente mostra un riepilogo dopo la chiamata con la migliore corrispondenza del profilo vocale, l'identità confermata dell'oratore e un elenco dei profili vocali creati o aggiornati tramite le chiamate `UpdateVoiceProfile` API `CreateVoiceProfile` e effettuate durante la chiamata.

```
{
    "version": "0",
    "id": "12345678-1234-1234-1234-111122223333",
    "detail-type": "VoiceAnalyticsStatus",
    "service-type": "VoiceAnalytics",
    "source": "aws.chime",
    "account": "111122223333",
    "time": "yyyy-mm-ddThh:mm:ssZ",    
    "region": "us-east-1",
    "resources": [],
    "detail": {
        "detailStatus": "PostCallVoiceAnalytics",
        "callId": "22e8dee8-bbd7-4f94-927b-2d0ebaeddc1c",
        "transactionId": "daaeb6bf-2fe2-4e51-984e-d0fbf2f09436",
        "voiceConnectorId": "abcdef1ghij2klmno3pqr4",
        "isCaller": true | false,
        "speakerSearchResults": {
            "bestMatchedVoiceProfileId": "vp-04c25ba1-a059-4fd3-8495-4ac91b55e2bf",
            "customerValidatedCallerIdentity": "vp-04c25ba1-a059-4fd3-8495-4ac91b55e2bf",
            "createVoiceProfileTransactions": [
                {
                    "voiceProfileId": "vp-04c25ba1-a059-4fd3-8495-4ac91b55e2bf",
                    "requestTimestamp": "2022-12-14T18:38:38.796Z"
                },
                {
                    "voiceProfileId": "vp-04c25ba1-a059-4fd3-8495-4ac91b55e2bf",
                    "requestTimestamp": "2022-12-14T18:38:38.796Z",
                }
            ],
            "updateVoiceProfileTransactions": [
                {
                    "voiceProfileId": "vp-04c25ba1-a059-4fd3-8495-4ac91b55e2bf",
                    "requestTimestamp": "2022-12-14T18:38:38.796Z",
                },
                {
                    "voiceProfileId": "vp-04c25ba1-a059-4fd3-8495-4ac91b55e2bf",
                    "requestTimestamp": "2022-12-14T18:38:38.796Z",
                }
            ]
        }
    }
}
```

# Esempio di analisi vocale: funzione Lambda per l'SDK Amazon Chime
<a name="va-sample-lambda"></a>

Il codice Python nell'esempio seguente elabora le notifiche ricevute da un Voice Connector. È possibile aggiungere il codice a una funzione AWS Lambda. Puoi anche usarlo per attivare la coda Amazon SQS, l'argomento Amazon SNS o Amazon Kinesis Data Stream. È quindi possibile archiviare le notifiche in un file `EventTable` per elaborazioni future. Per i formati di notifica esatti, vedi[Comprendere le notifiche per l'SDK Amazon Chime](va-notification-targets.md).

```
import base64
import boto3
import json
import logging
import time

from datetime import datetime
from enum import Enum

log = logging.getLogger()
log.setLevel(logging.INFO)

dynamo = boto3.client("dynamodb")

EVENT_TABLE_NAME = "EventTable"

class EventType(Enum):
    """
    This example code uses a single Lambda processor to handle either
    triggers from SQS, SNS, Lambda, or Kinesis. You can adapt it to fit your
    desired infrastructure depending on what you prefer. To distinguish
    where we get events from, we use an EventType enum as an
    example to show the different ways of parsing the notifications.
    """
    SQS = "SQS"
    SNS = "SNS"
    LAMBDA = "LAMBDA"
    KINESIS = "KINESIS"


class AnalyticsType(Enum):
    """
    Define the various analytics event types that this Lambda will
    handle.
    """
    SPEAKER_SEARCH = "SpeakerSearch"
    VOICE_TONE_ANALYSIS = "VoiceToneAnalysis"
    ANALYTICS_READY = "AnalyticsReady"
    UNKNOWN = "UNKNOWN"
 
   
class DetailType(Enum):
    """
    Define the  various detail types that Voice Connector's voice
    analytics feature can return.
    """
    SPEAKER_SEARCH_TYPE = "SpeakerSearchStatus"
    VOICE_TONE_ANALYSIS_TYPE = "VoiceToneAnalysisStatus"
    ANALYTICS_READY = "VoiceAnalyticsStatus"
 

def handle(event, context):
    """
    Example of how to handle incoming Voice Analytics notification messages
    from Voice Connector.
    """
    logging.info(f"Received event of type {type(event)} with payload {event}")
    is_lambda = True
    
    # Handle triggers from SQS, SNS, and KDS. Use the below code if you would like
    # to use this Lambda as a trigger for an existing SQS queue, SNS topic or Kinesis
    # stream.
    if "Records" in event:
        logging.info("Handling event from SQS or SNS since Records exists")
        is_lambda = False
        for record in event.get("Records", []):
            _process_record(record)
    
    # If you would prefer to have your Lambda invoked directly, use the
    # below code to have the Voice Connector directly invoke your Lambda.
    # In this scenario, there are no "Records" passed.
    if is_lambda:
        logging.info(f"Handling event from Lambda")
        event_type = EventType.LAMBDA
        _process_notification_event(event_type, event)


def _process_record(record):
    # SQS and Kinesis use eventSource.
    event_source = record.get("eventSource")
    
    # SNS uses EventSource.
    if not event_source:
        event_source = record.get("EventSource")

    # Assign the event type explicitly based on the event source value.
    event_type = None
    if event_source == "aws:sqs":
        event = record["body"]
        event_type = EventType.SQS
    elif event_source == "aws:sns":
        event = record["Sns"]["Message"]
        event_type = EventType.SNS
    elif event_source == "aws:kinesis":
        raw_data = record["kinesis"]["data"]
        raw_message = base64.b64decode(raw_data).decode('utf-8')
        event = json.loads(raw_message)
        event_type = EventType.KINESIS
    else:
        raise Exception(f"Event source {event_source} is not supported")

    _process_notification_event(event_type, event)


def _process_notification_event(
    event_type: EventType,
    event: dict
):
    """
    Extract the attributes from the Voice Analytics notification message
    and store it as a DynamoDB item to process later.
    """
    message_id = event.get("id")
    analytics_type = _get_analytics_type(event.get("detail-type"))
    pk = None
    if analytics_type == AnalyticsType.ANALYTICS_READY.value or analytics_type == AnalyticsType.UNKNOWN.value:
        transaction_id = event.get("detail").get("transactionId")
        pk = f"transactionId#{transaction_id}#notificationType#{event_type.value}#analyticsType#{analytics_type}"
    else:
        task_id = event.get("detail").get("taskId")
        pk = f"taskId#{task_id}#notificationType#{event_type.value}#analyticsType#{analytics_type}"
    logging.info(f"Generated PK {pk}")
    _create_request_record(pk, message_id, json.dumps(event))


def _create_request_record(pk: str, sk: str, body: str):
    """
    Record this notification message into the Dynamo db table
    """
    try:
        # Use consistent ISO8601 date format.
        # 2019-08-01T23:09:35.369156 -> 2019-08-01T23:09:35.369Z
        time_now = (
            datetime.utcnow().isoformat()[:-3] + "Z"
        )
        response = dynamo.put_item(
            Item={
                "PK": {"S": pk},
                "SK": {"S": sk},
                "body": {"S": body},
                "createdOn": {"S": time_now},
            },
            TableName=EVENT_TABLE_NAME,
        )
        logging.info(f"Added record in table {EVENT_TABLE_NAME}, response : {response}")
    except Exception as e:
        logging.error(f"Error in adding record: {e}")


def _get_analytics_type(detail_type: str):
    """
    Get analytics type based on message detail type value.
    """
    if detail_type == DetailType.SPEAKER_SEARCH_TYPE.value:
        return AnalyticsType.SPEAKER_SEARCH.value
    elif detail_type == DetailType.VOICE_TONE_ANALYSIS_TYPE.value:
        return AnalyticsType.VOICE_TONE_ANALYSIS.value
    elif detail_type == DetailType.ANALYTICS_READY.value:
        return AnalyticsType.ANALYTICS_READY.value
    else:
        return AnalyticsType.UNKNOWN.value
```

**Importante**  
È necessario ricevere il consenso prima di chiamare il servizio [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartSpeakerSearchTask](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartSpeakerSearchTask)o [https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartVoiceToneAnalysis.html](https://docs.aws.amazon.com/chime-sdk/latest/APIReference/API_voice-chime_StartVoiceToneAnalysis.html) APIs. Ti consigliamo di mantenere gli eventi in un'area di attesa, come Amazon DynamoDB, fino a quando non ricevi il consenso.