

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Descripción de las notificaciones de Amazon Chime SDK
<a name="va-notification-targets"></a>

El análisis de voz envía automáticamente los eventos a un objetivo cuando se inician las tareas de búsqueda de interlocutores o análisis del tono de voz, mientras se ejecutan y cuando terminan. Los objetivos de notificación se utilizan para recibir esos eventos. Recomendamos utilizar varios objetivos de notificación si su flujo de trabajo o aplicación necesitan una alta disponibilidad.

Además, debe utilizar un rol de IAM con las políticas necesarias para acceder a sus objetivos de notificación. Para obtener más información, consulte [Uso de la función de acceso a los recursos de análisis de llamadas de Amazon Chime SDK](call-analytics-resource-access-role.md).

**nota**  
En el caso de Amazon SQS y Amazon SNS, no admitimos colas. first-in-first-out Como resultado, es posible que los mensajes lleguen desordenados. Recomendamos comprobar las marcas de tiempo para ordenar los mensajes según sea necesario y conservar los mensajes en un almacén de datos como Amazon DynamoDB. También puede utilizar el comando Get APIs descrito en [Sondeo de los resultados de las tareas de Amazon Chime SDK](va-task-result-poll.md) para recibir los resultados más recientes.

En la siguiente tabla se enumeran los eventos y sus tipos de detalles correspondientes.


| Evento de notificación | Tipo de detalle | 
| --- | --- | 
| Metadatos de análisis de voz | `VoiceAnalyticsStatus` | 
| Búsqueda de interlocutores | `SpeakerSearchStatus` | 
| Análisis del tono de voz | `VoiceToneAnalysisStatus` | 

# Descripción de las políticas de IAM para los objetivos de notificación de Amazon Chime SDK
<a name="va-iam-target-policies"></a>

Debe utilizar políticas del rol de IAM en una configuración de Call Analytics que permitan el acceso a sus destinos de notificación de Amazon SQS, Amazon SNS, AWS Lambda o Amazon KDS. Para obtener más información, consulte la sección [Uso de la función de acceso a los recursos de análisis de llamadas de Amazon Chime SDK](call-analytics-resource-access-role.md) de esta guía.

## Eventos de búsqueda de hablantes
<a name="va-speaker-search-events"></a>

Los eventos de búsqueda de hablantes tienen el tipo de detalle `SpeakerSearchStatus`.

Los conectores de voz de Amazon Chime SDK envían los siguientes eventos de búsqueda de hablantes:
+ Coincidencias de identificación
+ Generación de incrustaciones de voz

Los eventos pueden tener los siguientes estados:
+ `IdentificationSuccessful`: se identificó correctamente al menos un ID de perfil de voz coincidente con una puntuación de confianza alta en el dominio del perfil de voz determinado.
+ `IdentificationFailure`: no se pudo realizar la identificación. Causas: el llamante no habla durante al menos 10 segundos, mala calidad de audio.
+ `IdentificationNoMatchesFound`: no se ha podido encontrar una coincidencia de alta confianza en el dominio del perfil de voz indicado. Es posible que la persona que llama sea nueva o que su voz haya cambiado.
+ `VoiceprintGenerationSuccessful`: el sistema ha generado una incrustación de voz utilizando 20 segundos de audio no silencioso.
+ `VoiceprintGenerationFailure`: el sistema no ha podido generar una incrustación de voz. Causas: el llamante no habla durante al menos 20 segundos, mala calidad de audio.

### Coincidencias de identificación
<a name="va-id-matches"></a>

Una vez que se llama a la API [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) de un `transactionId` concreto, el servicio Voice Connector devuelve una notificación de coincidencia de identificación tras 10 segundos de voz no silenciosa. El servicio muestra las 10 coincidencias más frecuentes, junto con un identificador de perfil de voz y una puntuación de confianza que oscila entre [0, 1]. Cuanto más alto sea el puntaje de confianza, mayor será la probabilidad de que el hablante de la llamada coincida con el ID del perfil de voz. Si el modelo de machine learning no encuentra coincidencias, el campo de la notificación `detailStatus` contiene `IdentificationNoMatchesFound`.

En el siguiente ejemplo, se muestra la notificación de una coincidencia correcta.

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

### Generación de incrustaciones de voz
<a name="va-voice-print-generation"></a>

Tras 10 segundos adicionales de voz no silenciosa, el conector de voz envía una notificación de generación de incrustaciones de voz a los destinatarios de la notificación. Puede inscribir nuevas incorporaciones de voz en un perfil de voz o actualizar una copia impresa que ya esté en un perfil de voz.

En el siguiente ejemplo, se muestra la notificación de una coincidencia correcta, lo que significa que puede actualizar el perfil de voz asociado.

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

## Eventos de análisis del tono de voz
<a name="va-tone-status"></a>

Los eventos de análisis del tono de voz tienen el tipo de detalle `VoiceToneAnalysisStatus`. Los análisis pueden devolver los siguientes estados:
+ `VoiceToneAnalysisSuccessful`: se han analizado satisfactoriamente las voces de la persona que llamaba y del agente en función de las probabilidades de emitir un sentimiento: positivo, negativo o neutral.
+ `VoiceToneAnalysisFailure`: no se ha podido realizar el análisis del tono. Esto puede suceder si la persona que llama se queda sin hablar durante 10 segundos o si la calidad del audio es demasiado mala.
+ `VoiceToneAnalysisCompleted`: se han analizado correctamente las voces del usuario y del agente para determinar las probabilidades de opinión durante toda la llamada. Este es el evento final, que se envía cuando finaliza el análisis del tono de voz.

En el siguiente ejemplo, se muestra un evento de análisis de tono de voz típico.

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

## Resumen de eventos posteriores a la llamada
<a name="va-post-call-summary-events"></a>

Los eventos resumidos posteriores a la llamada se envían 5 minutos después de que la llamada haya finalizado. Estos resúmenes proporcionan una visión general de las tareas de búsqueda de interlocutores que se realizaron durante la llamada.

En el siguiente ejemplo, se muestra un resumen posterior a la llamada con el perfil de voz que mejor coincide, la identidad confirmada del altavoz y una lista de los perfiles de voz creados o actualizados mediante las llamadas a la API `CreateVoiceProfile` y `UpdateVoiceProfile` realizadas durante la llamada.

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

# Ejemplo de análisis de voz: función de Lambda para Amazon Chime SDK
<a name="va-sample-lambda"></a>

El código de Python del siguiente ejemplo procesa las notificaciones recibidas de un conector de voz. Puede añadir el código a una función AWS Lambda. También puede utilizarla para activar su cola de Amazon SQS, un tema de Amazon SNS o Amazon Kinesis Data Streams. A continuación, puede almacenar las notificaciones en un futuro procesamiento de `EventTable`. Para conocer los formatos de notificación exactos, consulte [Descripción de las notificaciones de Amazon Chime SDK](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**  
Debe recibir el consentimiento antes de llamar al [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)quirófano [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. Le recomendamos que mantenga los eventos en un área de espera, como Amazon DynamoDB, hasta que reciba el consentimiento.