

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Memahami notifikasi untuk Amazon Chime SDK
<a name="va-notification-targets"></a>

Analisis suara secara otomatis mengirimkan peristiwa ke target saat penelusuran speaker atau tugas analisis nada suara dimulai, saat dijalankan, dan saat selesai. Anda menggunakan target notifikasi untuk menerima peristiwa tersebut. Sebaiknya gunakan beberapa target notifikasi jika alur kerja atau aplikasi Anda membutuhkan ketersediaan tinggi.

Selain itu, Anda harus menggunakan peran IAM dengan kebijakan yang diperlukan untuk mengakses target notifikasi Anda. Untuk informasi selengkapnya, lihat [Menggunakan peran akses sumber daya analitik panggilan untuk Amazon Chime SDK](call-analytics-resource-access-role.md).

**catatan**  
Untuk Amazon SQS dan Amazon SNS, kami tidak mendukung antrian. first-in-first-out Akibatnya, pesan mungkin tidak beres. Sebaiknya periksa stempel waktu untuk memesan pesan sesuai kebutuhan, dan menyimpan pesan di penyimpanan data seperti Amazon DynamoDB. Anda juga dapat menggunakan Dapatkan APIs dijelaskan [Polling untuk hasil tugas untuk Amazon Chime SDK](va-task-result-poll.md) untuk menerima hasil terbaru.

Tabel berikut mencantumkan peristiwa dan jenis detailnya yang sesuai.


| Acara pemberitahuan | Jenis detail | 
| --- | --- | 
| Metadata analitik suara | `VoiceAnalyticsStatus` | 
| Pencarian speaker | `SpeakerSearchStatus` | 
| Analisis nada suara | `VoiceToneAnalysisStatus` | 

# Memahami kebijakan IAM untuk target notifikasi untuk Amazon Chime SDK
<a name="va-iam-target-policies"></a>

Anda harus menggunakan kebijakan dalam peran IAM dalam konfigurasi Call Analytics yang memungkinkan akses ke target notifikasi Amazon SQS, Amazon SNS, AWS Lambda, atau Amazon KDS Anda. Untuk informasi selengkapnya, lihat [Menggunakan peran akses sumber daya analitik panggilan untuk Amazon Chime SDK](call-analytics-resource-access-role.md) dalam panduan ini.

## Acara pencarian pembicara
<a name="va-speaker-search-events"></a>

Acara pencarian pembicara memiliki jenis `SpeakerSearchStatus` detail.

Amazon Chime SDK Voice Connectors mengirimkan acara pencarian pembicara berikut:
+ Kecocokan identifikasi
+ Generasi penyematan suara

Acara dapat memiliki status berikut:
+ `IdentificationSuccessful`— Berhasil mengidentifikasi setidaknya satu ID profil suara yang cocok dengan skor kepercayaan tinggi di domain profil suara yang diberikan.
+ `IdentificationFailure`— Gagal melakukan identifikasi. Penyebab: penelepon tidak berbicara setidaknya 10 detik, kualitas audio buruk.
+ `IdentificationNoMatchesFound`— Tidak dapat menemukan kecocokan kepercayaan tinggi di domain profil suara yang diberikan. Penelepon mungkin baru, atau suara mereka mungkin telah berubah.
+ `VoiceprintGenerationSuccessful`— Sistem menghasilkan penyematan suara menggunakan 20 detik audio non-senyap.
+ `VoiceprintGenerationFailure`— Sistem gagal menghasilkan penyematan suara. Penyebab: penelepon tidak berbicara setidaknya selama 20 detik, kualitas audio buruk.

### Kecocokan identifikasi
<a name="va-id-matches"></a>

Setelah [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 dipanggil untuk diberikan`transactionId`, layanan Konektor Suara mengembalikan pemberitahuan kecocokan identifikasi setelah 10 detik ucapan tanpa suara. Layanan mengembalikan 10 pertandingan teratas, bersama dengan ID profil suara dan skor kepercayaan mulai dari [0, 1]. Semakin tinggi skor kepercayaan, semakin besar kemungkinan pembicara dari panggilan tersebut cocok dengan ID profil suara. Jika model pembelajaran mesin tidak menemukan kecocokan, `detailStatus` bidang notifikasi berisi`IdentificationNoMatchesFound`.

Contoh berikut menunjukkan pemberitahuan untuk kecocokan yang berhasil.

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

### Generasi penyematan suara
<a name="va-voice-print-generation"></a>

Setelah 10 detik ucapan non-senyap tambahan, Konektor Suara mengirimkan pemberitahuan pembuatan penyematan suara ke target notifikasi. Anda dapat mendaftarkan penyematan suara baru di profil suara, atau memperbarui cetakan yang sudah ada di profil suara.

Contoh berikut menunjukkan pemberitahuan untuk kecocokan yang berhasil, artinya Anda dapat memperbarui profil suara terkait.

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

## Peristiwa analisis nada suara
<a name="va-tone-status"></a>

Peristiwa analisis nada suara memiliki jenis `VoiceToneAnalysisStatus` detail. Analisis dapat mengembalikan status ini:
+ `VoiceToneAnalysisSuccessful`— Berhasil menganalisis suara penelepon dan agen menjadi probabilitas sentimen — positif, negatif, atau netral.
+ `VoiceToneAnalysisFailure`— Gagal melakukan analisis nada. Ini bisa terjadi jika penelepon hang tanpa berbicara selama 10 detik, atau jika kualitas audio menjadi terlalu buruk.
+ `VoiceToneAnalysisCompleted`— Berhasil menganalisis suara pengguna dan agen ke dalam probabilitas sentimen untuk seluruh panggilan. Ini adalah acara terakhir, dikirim ketika analisis nada suara selesai.

Contoh berikut menunjukkan peristiwa analisis nada suara yang khas.

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

## Acara ringkasan pasca-panggilan
<a name="va-post-call-summary-events"></a>

Acara ringkasan panggilan pos dikirim 5 menit setelah panggilan berakhir. Ringkasan ini memberikan ikhtisar tugas pencarian pembicara yang terjadi selama panggilan.

Contoh berikut menunjukkan ringkasan panggilan pos dengan kecocokan profil suara terbaik, identitas pembicara yang dikonfirmasi, dan daftar profil suara yang dibuat atau diperbarui melalui panggilan `UpdateVoiceProfile` API `CreateVoiceProfile` dan yang dilakukan selama panggilan.

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

# Contoh analisis suara Fungsi Lambda untuk Amazon Chime SDK
<a name="va-sample-lambda"></a>

Kode Python dalam contoh berikut memproses notifikasi yang diterima dari Konektor Suara. Anda dapat menambahkan kode ke fungsi AWS Lambda. Anda juga dapat menggunakannya untuk memicu antrean Amazon SQS, topik Amazon SNS, atau Amazon Kinesis Data Stream. Anda kemudian dapat menyimpan notifikasi dalam pemrosesan `EventTable` for future. Untuk format notifikasi yang tepat, lihat[Memahami notifikasi untuk 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
```

**penting**  
Anda harus menerima persetujuan sebelum menelepon [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)atau [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. Kami menyarankan Anda mempertahankan acara di area penahanan, seperti Amazon DynamoDB, hingga Anda menerima persetujuan.