

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Comprendre les notifications pour le SDK Amazon Chime
<a name="va-notification-targets"></a>

L'analyse vocale envoie automatiquement des événements à une cible lorsque les tâches de recherche de locuteurs ou d'analyse de tonalité vocale commencent, pendant leur exécution et lorsqu'elles se terminent. Vous utilisez des cibles de notification pour recevoir ces événements. Nous vous recommandons d'utiliser plusieurs cibles de notification si votre flux de travail ou votre application nécessite une haute disponibilité.

Vous devez également utiliser un rôle IAM avec les politiques nécessaires pour accéder à vos cibles de notification. Pour de plus amples informations, veuillez consulter [Utilisation du rôle d'accès aux ressources d'analyse des appels pour le SDK Amazon Chime](call-analytics-resource-access-role.md).

**Note**  
Pour Amazon SQS et Amazon SNS, nous ne prenons pas en charge les files d'attente. first-in-first-out Par conséquent, les messages peuvent arriver dans le mauvais ordre. Nous vous recommandons de vérifier les horodatages pour classer les messages selon les besoins, et de conserver les messages dans un magasin de données tel qu'Amazon DynamoDB. Vous pouvez également utiliser le bouton Obtenir APIs décrit dans [Sondage des résultats des tâches pour le SDK Amazon Chime](va-task-result-poll.md) pour recevoir les derniers résultats.

Le tableau suivant répertorie les événements et les types de détails correspondants.


| Événement de notification | Type de détail | 
| --- | --- | 
| Métadonnées d'analyse vocale | `VoiceAnalyticsStatus` | 
| Recherche de haut-parleurs | `SpeakerSearchStatus` | 
| Analyse du ton des voix | `VoiceToneAnalysisStatus` | 

# Comprendre les politiques IAM relatives aux cibles de notification pour le SDK Amazon Chime
<a name="va-iam-target-policies"></a>

Dans le rôle IAM d'une configuration Call Analytics, vous devez utiliser des politiques qui autorisent l'accès à vos cibles de notification Amazon SQS, Amazon SNS, AWS Lambda ou Amazon KDS. Pour plus d’informations, consultez [Utilisation du rôle d'accès aux ressources d'analyse des appels pour le SDK Amazon Chime](call-analytics-resource-access-role.md) dans ce guide.

## Événements de recherche de conférenciers
<a name="va-speaker-search-events"></a>

Les événements de recherche de conférenciers sont de type `SpeakerSearchStatus` détaillé.

Les connecteurs vocaux du SDK Amazon Chime envoient les événements de recherche de haut-parleurs suivants :
+ Allumettes d'identification
+ Génération d'intégration vocale

Les événements peuvent avoir les statuts suivants :
+ `IdentificationSuccessful`— Identification réussie d'au moins un identifiant de profil vocal correspondant avec un score de confiance élevé dans le domaine de profil vocal donné.
+ `IdentificationFailure`— Impossible d'effectuer l'identification. Causes : l'appelant ne parle pas pendant au moins 10 secondes, qualité audio médiocre.
+ `IdentificationNoMatchesFound`— Impossible de trouver une correspondance avec un niveau de confiance élevé dans le domaine de profil vocal donné. L'appelant est peut-être nouveau ou sa voix a peut-être changé.
+ `VoiceprintGenerationSuccessful`— Le système a généré une intégration vocale en utilisant 20 secondes de son non silencieux.
+ `VoiceprintGenerationFailure`— Le système n'a pas réussi à générer d'intégration vocale. Causes : l'appelant ne parle pas pendant au moins 20 secondes, qualité audio médiocre.

### Allumettes d'identification
<a name="va-id-matches"></a>

Une fois que l'[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 est appelée pour une donnée`transactionId`, le service Voice Connector renvoie une notification de correspondance d'identification après 10 secondes de conversation silencieuse. Le service renvoie les 10 meilleures correspondances, ainsi qu'un identifiant de profil vocal et un score de confiance compris entre [0, 1]. Plus le score de confiance est élevé, plus il est probable que le locuteur de l'appel corresponde à l'identifiant du profil vocal. Si le modèle d'apprentissage automatique ne trouve aucune correspondance, le `detailStatus` champ de notification contient`IdentificationNoMatchesFound`.

L'exemple suivant montre une notification en cas de correspondance réussie.

```
{    
    "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
    }
}
```

### Génération d'intégration vocale
<a name="va-voice-print-generation"></a>

Après 10 secondes supplémentaires de parole non silencieuse, le connecteur vocal envoie une notification de génération d'intégration vocale aux cibles de notification. Vous pouvez inscrire de nouvelles intégrations vocales dans un profil vocal ou mettre à jour une impression déjà présente dans un profil vocal.

L'exemple suivant montre la notification d'une correspondance réussie, ce qui signifie que vous pouvez mettre à jour le profil vocal associé.

```
{
    "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
    }
}
```

## Événements d'analyse du ton vocal
<a name="va-tone-status"></a>

Les événements d'analyse de tonalité vocale sont de type `VoiceToneAnalysisStatus` détaillé. Les analyses peuvent renvoyer les statuts suivants :
+ `VoiceToneAnalysisSuccessful`— Analyse réussie des voix de l'appelant et de l'agent en fonction des probabilités de sentiment (positif, négatif ou neutre).
+ `VoiceToneAnalysisFailure`— Impossible d'effectuer l'analyse de tonalité. Cela peut se produire si l'appelant se bloque sans parler pendant 10 secondes ou si la qualité audio devient trop mauvaise.
+ `VoiceToneAnalysisCompleted`— Analyse réussie des voix de l'utilisateur et de l'agent en fonction des probabilités de sentiment pendant toute la durée de l'appel. Il s'agit du dernier événement, envoyé lorsque l'analyse de la tonalité vocale est terminée.

L'exemple suivant montre un événement typique d'analyse de tonalité 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"
}
```

## Récapitulatif des événements après l'appel
<a name="va-post-call-summary-events"></a>

Les événements récapitulatifs post-appel sont envoyés 5 minutes après la fin de l'appel. Ces résumés fournissent un aperçu des tâches de recherche de locuteurs effectuées tout au long de l'appel.

L'exemple suivant montre un résumé après un appel avec la meilleure correspondance au profil vocal, l'identité confirmée du locuteur et une liste des profils vocaux créés ou mis à jour par le biais des appels `CreateVoiceProfile` et de l'`UpdateVoiceProfile`API effectués pendant l'appel.

```
{
    "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",
                }
            ]
        }
    }
}
```

# Exemple de fonction Lambda d'analyse vocale pour le SDK Amazon Chime
<a name="va-sample-lambda"></a>

Le code Python de l'exemple suivant traite les notifications reçues d'un connecteur vocal. Vous pouvez ajouter le code à une fonction AWS Lambda. Vous pouvez également l'utiliser pour déclencher votre file d'attente Amazon SQS, votre rubrique Amazon SNS ou Amazon Kinesis Data Stream. Vous pouvez ensuite enregistrer les notifications dans un fichier `EventTable` pour un traitement futur. Pour connaître les formats de notification exacts, voir[Comprendre les notifications pour le 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
```

**Important**  
Vous devez obtenir le consentement avant d'appeler le bloc [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)opératoire [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. Nous vous recommandons de conserver les événements dans une zone d'attente, telle qu'Amazon DynamoDB, jusqu'à ce que vous obteniez votre consentement.