

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.

# Tutoriel : Visualisation des appels d'assistance client avec le OpenSearch service et OpenSearch les tableaux de bord
<a name="walkthrough"></a>

Ce chapitre est une procédure détaillée de la situation suivante : une entreprise reçoit un certain nombre d'appels au support client et les analyse. Quel est l'objet de chaque appel ? Combien étaient positifs ? Combien étaient négatifs ? Comment les gestionnaires peuvent-ils chercher ou revoir les transcriptions de ces appels ?

Un flux de travail manuel peut impliquer des employés qui écoutent des enregistrements, notant l'objet de chaque appel et décidant si l'interaction avec le client était positive ou non.

Ce processus serait extrêmement fastidieux. En supposant un temps moyen de 10 minutes par appel, chaque employé pourrait écouter seulement 48 appels par jour. À moins d'un biais humain, les données générées seraient très précises, mais la *quantité* de données serait minime : simplement l'objet de l'appel et une valeur booléenne pour savoir si le client a été satisfait. Tout ce qui est plus complexe, par exemple une transcription complète, prendrait beaucoup de temps.

À l'aide d'[Amazon S3](https://aws.amazon.com/s3/)[, Amazon Transcribe](https://aws.amazon.com/transcribe/), [Amazon Comprehend](https://aws.amazon.com/comprehend/) et OpenSearch Amazon Service, vous pouvez automatiser un processus similaire avec très peu de code et obtenir ainsi beaucoup plus de données. Par exemple, vous pouvez obtenir une transcription complète de l'appel, des mots-clés de la transcription et un « sentiment » général de l'appel (positif, négatif, neutre ou mixte). Vous pouvez ensuite utiliser OpenSearch les OpenSearch tableaux de bord pour rechercher et visualiser les données.

Bien que vous puissiez utiliser cette procédure pas à pas telle quelle, l'objectif est de susciter des idées sur la manière d'enrichir vos documents JSON avant de les indexer dans OpenSearch Service.

**Coûts estimés**

En général, l'exécution des étapes de cette procédure devrait coûter moins de 2 USD. La procédure utilise les ressources suivantes :
+ Compartiment S3 avec moins de 100 Mo transférés et stockés

  Pour en savoir plus, consultez la page relative à la [Tarification Amazon S3](https://aws.amazon.com/s3/pricing/).
+ OpenSearch Domaine de service avec une `t2.medium` instance et 10 GiB de stockage EBS pendant plusieurs heures

  Pour en savoir plus, consultez [Amazon OpenSearch Service Pricing](https://aws.amazon.com/elasticsearch-service/pricing/).
+ Plusieurs appels à Amazon Transcribe

  Pour en savoir plus, consultez [Tarification Amazon Transcribe](https://aws.amazon.com/transcribe/pricing/).
+ Plusieurs appels de traitement du langage naturel à Amazon Comprehend

  Pour en savoir plus, consultez [Tarification Amazon Comprehend](https://aws.amazon.com/comprehend/pricing/).

**Topics**
+ [Étape 1 : Configurer les prérequis](#walkthrough-prereq)
+ [Étape 2 : Copier un exemple de code](#walkthrough-script)
+ [(Facultatif) Étape 3 : Indexer des exemples de données](#walkthrough-sample-data)
+ [Étape 4 : Analyser et visualiser vos données](#walkthrough-analysis)
+ [Étape 5 : Nettoyage des ressources et étapes suivantes](#walkthrough-next-steps)

## Étape 1 : Configurer les prérequis
<a name="walkthrough-prereq"></a>

Avant de poursuivre, vous devez disposer des ressources suivantes.


****  

| Prérequis | Description | 
| --- | --- | 
| Compartiment Amazon S3 | Pour de plus amples informations, veuillez consulter [Création d'un compartiment](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html) dans le Guide de l'utilisateur d'Amazon Simple Storage Service. | 
| OpenSearch Domaine de service | La destination des données. Pour plus d'informations, consultez la section [Création OpenSearch de domaines de service](createupdatedomains.md#createdomains). | 

Si vous ne disposez pas déjà de ces ressources, vous pouvez les créer à l'aide des commandes AWS CLI suivantes :

```
aws s3 mb s3://my-transcribe-test --region us-west-2
```

```
aws opensearch create-domain --domain-name my-transcribe-test --engine-version OpenSearch_1.0 --cluster-config  InstanceType=t2.medium.search,InstanceCount=1 --ebs-options EBSEnabled=true,VolumeType=standard,VolumeSize=10 --access-policies '{"Version": "2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:root"},"Action":"es:*","Resource":"arn:aws:es:us-west-2:123456789012:domain/my-transcribe-test/*"}]}' --region us-west-2
```

**Note**  
Ces commandes utilisent la région `us-west-2`, mais vous pouvez utiliser n'importe quelle région prise en charge par Amazon Comprehend. Pour en savoir plus, consultez [Références générales AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#comprehend_region).

## Étape 2 : Copier un exemple de code
<a name="walkthrough-script"></a>

1. Copiez et collez l'exemple de code Python 3 suivant dans un nouveau fichier nommé `call-center.py` :

   ```
   import boto3
   import datetime
   import json
   import requests
   from requests_aws4auth import AWS4Auth
   import time
   import urllib.request
   
   # Variables to update
   audio_file_name = '' # For example, 000001.mp3
   bucket_name = '' # For example, my-transcribe-test
   domain = '' # For example, https://search-my-transcribe-test-12345.us-west-2.es.amazonaws.com
   index = 'support-calls'
   type = '_doc'
   region = 'us-west-2'
   
   # Upload audio file to S3.
   s3_client = boto3.client('s3')
   
   audio_file = open(audio_file_name, 'rb')
   
   print('Uploading ' + audio_file_name + '...')
   response = s3_client.put_object(
       Body=audio_file,
       Bucket=bucket_name,
       Key=audio_file_name
   )
   
   # # Build the URL to the audio file on S3.
   # # Only for the us-east-1 region.
   # mp3_uri = 'https://' + bucket_name + '.s3.amazonaws.com/' + audio_file_name
   
   # Get the necessary details and build the URL to the audio file on S3.
   # For all other regions.
   response = s3_client.get_bucket_location(
       Bucket=bucket_name
   )
   bucket_region = response['LocationConstraint']
   mp3_uri = 'https://' + bucket_name + '.s3-' + bucket_region + '.amazonaws.com/' + audio_file_name
   
   # Start transcription job.
   transcribe_client = boto3.client('transcribe')
   
   print('Starting transcription job...')
   response = transcribe_client.start_transcription_job(
       TranscriptionJobName=audio_file_name,
       LanguageCode='en-US',
       MediaFormat='mp3',
       Media={
           'MediaFileUri': mp3_uri
       },
       Settings={
           'ShowSpeakerLabels': True,
           'MaxSpeakerLabels': 2 # assumes two people on a phone call
       }
   )
   
   # Wait for the transcription job to finish.
   print('Waiting for job to complete...')
   while True:
       response = transcribe_client.get_transcription_job(TranscriptionJobName=audio_file_name)
       if response['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
           break
       else:
           print('Still waiting...')
       time.sleep(10)
   
   transcript_uri = response['TranscriptionJob']['Transcript']['TranscriptFileUri']
   
   # Open the JSON file, read it, and get the transcript.
   response = urllib.request.urlopen(transcript_uri)
   raw_json = response.read()
   loaded_json = json.loads(raw_json)
   transcript = loaded_json['results']['transcripts'][0]['transcript']
   
   # Send transcript to Comprehend for key phrases and sentiment.
   comprehend_client = boto3.client('comprehend')
   
   # If necessary, trim the transcript.
   # If the transcript is more than 5 KB, the Comprehend calls fail.
   if len(transcript) > 5000:
       trimmed_transcript = transcript[:5000]
   else:
       trimmed_transcript = transcript
   
   print('Detecting key phrases...')
   response = comprehend_client.detect_key_phrases(
       Text=trimmed_transcript,
       LanguageCode='en'
   )
   
   keywords = []
   for keyword in response['KeyPhrases']:
       keywords.append(keyword['Text'])
   
   print('Detecting sentiment...')
   response = comprehend_client.detect_sentiment(
       Text=trimmed_transcript,
       LanguageCode='en'
   )
   
   sentiment = response['Sentiment']
   
   # Build the Amazon OpenSearch Service URL.
   id = audio_file_name.strip('.mp3')
   url = domain + '/' + index + '/' + type + '/' + id
   
   # Create the JSON document.
   json_document = {'transcript': transcript, 'keywords': keywords, 'sentiment': sentiment, 'timestamp': datetime.datetime.now().isoformat()}
   
   # Provide all details necessary to sign the indexing request.
   credentials = boto3.Session().get_credentials()
   awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, 'opensearchservice', session_token=credentials.token)
   
   # Index the document.
   print('Indexing document...')
   response = requests.put(url, auth=awsauth, json=json_document, headers=headers)
   
   print(response)
   print(response.json())
   ```

1. Mettez à jour les six variables initiales.

1. Installez les packages requis à l'aide des commandes suivantes :

   ```
   pip install boto3
   pip install requests
   pip install requests_aws4auth
   ```

1.  MP3 Placez-le dans le même répertoire que le script `call-center.py` et exécutez-le. Un exemple de sortie suit :

   ```
   $ python call-center.py
   Uploading 000001.mp3...
   Starting transcription job...
   Waiting for job to complete...
   Still waiting...
   Still waiting...
   Still waiting...
   Still waiting...
   Still waiting...
   Still waiting...
   Still waiting...
   Detecting key phrases...
   Detecting sentiment...
   Indexing document...
   <Response [201]>
   {u'_type': u'call', u'_seq_no': 0, u'_shards': {u'successful': 1, u'failed': 0, u'total': 2}, u'_index': u'support-calls4', u'_version': 1, u'_primary_term': 1, u'result': u'created', u'_id': u'000001'}
   ```

`call-center.py` effectue un certain nombre d'opérations :

1. Le script télécharge un fichier audio (dans ce cas, un MP3, mais Amazon Transcribe prend en charge plusieurs formats) dans votre compartiment S3.

1. Il envoie l'URL du fichier audio à Amazon Transcribe et attend que la tâche de transcription se termine.

   Le temps nécessaire pour terminer la tâche de transcription dépend de la longueur du fichier audio. Supposons des minutes, pas des secondes.
**Astuce**  
Pour améliorer la qualité de la transcription, vous pouvez configurer un [vocabulaire personnalisé](https://docs.aws.amazon.com/transcribe/latest/dg/API_CreateVocabulary.html) pour Amazon Transcribe.

1. Une fois la tâche de transcription terminée, le script extrait la transcription, la tronque à 5 000 caractères et l'envoie à Amazon Comprehend pour l'analyse des mots-clés et des sentiments.

1. Enfin, le script ajoute la transcription complète, les mots clés, le sentiment et l'horodatage actuel à un document JSON et l'indexe dans OpenSearch Service.

**Astuce**  
[LibriVox](https://librivox.org/)contient des livres audio du domaine public que vous pouvez utiliser à des fins de test.

## (Facultatif) Étape 3 : Indexer des exemples de données
<a name="walkthrough-sample-data"></a>

Si vous n'avez pas beaucoup d'enregistrements d'appels (ce qui est souvent le cas) à portée de main, vous pouvez [indexer](indexing.md) les exemples de document dans [sample-calls.zip](samples/sample-calls.zip), qui sont comparables à ce que `call-center.py` produit.

1. Créez un fichier nommé `bulk-helper.py`:

   ```
   import boto3
   from opensearchpy import OpenSearch, RequestsHttpConnection
   import json
   from requests_aws4auth import AWS4Auth
   
   host = '' # For example, my-test-domain.us-west-2.es.amazonaws.com
   region = '' # For example, us-west-2
   service = 'es'
   
   bulk_file = open('sample-calls.bulk', 'r').read()
   
   credentials = boto3.Session().get_credentials()
   awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
   
   search = OpenSearch(
       hosts = [{'host': host, 'port': 443}],
       http_auth = awsauth,
       use_ssl = True,
       verify_certs = True,
       connection_class = RequestsHttpConnection
   )
   
   response = search.bulk(bulk_file)
   print(json.dumps(response, indent=2, sort_keys=True))
   ```

1. Mettez à jour les deux variables initiales pour `host` et `region`.

1. Installez le package requis à l'aide de la commande suivante :

   ```
   pip install opensearch-py
   ```

1. Téléchargez et décompressez [sample-calls.zip](samples/sample-calls.zip).

1. Placez `sample-calls.bulk` dans le même répertoire que `bulk-helper.py` et lancez l'assistant. Un exemple de sortie suit :

   ```
   $ python bulk-helper.py
   {
     "errors": false,
     "items": [
       {
         "index": {
           "_id": "1",
           "_index": "support-calls",
           "_primary_term": 1,
           "_seq_no": 42,
           "_shards": {
             "failed": 0,
             "successful": 1,
             "total": 2
           },
           "_type": "_doc",
           "_version": 9,
           "result": "updated",
           "status": 200
         }
       },
       ...
     ],
     "took": 27
   }
   ```

## Étape 4 : Analyser et visualiser vos données
<a name="walkthrough-analysis"></a>

Maintenant que vous disposez de certaines données dans OpenSearch Service, vous pouvez les visualiser à l'aide de OpenSearch tableaux de bord.

1. Accédez à `https://search-domain.region.es.amazonaws.com/_dashboards`.

1. Avant de pouvoir utiliser les OpenSearch tableaux de bord, vous avez besoin d'un modèle d'index. Dashboards utilise des modèles d'index pour affiner votre analyse à un ou plusieurs index. Pour faire correspondre l'index `support-calls` créé par `call-center.py`, accédez à **Stack Management (Gestion de pile)**, **Index Patterns (Modèles d'index)**, et définissez un modèle d'index de `support*`, puis choisissez **Next step (Étape suivante)**.

1. Pour **Time Filter field name (Nom du champ de filtre de temps)**, choisissez **timestamp (horodatage)**.

1. Maintenant, vous pouvez commencer à créer des visualisations. Choisissez **Visualize (Visualiser)**, puis ajoutez une nouvelle visualisation.

1. Choisissez le diagramme à secteurs et le modèle d'index `support*`.

1. La valeur par défaut est la visualisation de base. De ce fait, choisissez **Split Slices (Fractionner des tranches)** pour créer une visualisation plus intéressante.

   Pour **Aggregation (Regroupement)**, choisissez **Terms (Termes)**. Pour **Field (Champ)**, choisissez **sentiment.keyword**. Puis, choisissez **Apply changes (Appliquer les modifications)** et **Save (Enregistrer)**.  
![\[Exemple de configuration pour un graphique à secteurs Dashboards.\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/sentiment-pie-chart.png)

1. Revenez à la page **Visualize (Visualiser)** et ajoutez une autre visualisation. Cette fois-ci, sélectionnez le diagramme à barres horizontales.

1. Sélectionnez **Split Series (Fractionner les séries)**.

   Pour **Aggregation (Regroupement)**, choisissez **Terms (Termes)**. Pour **Field (Champ)**, choisissez **keywords.keyword** et définissez **Size (Taille)** sur 20. Puis, choisissez **Apply Changes (Appliquer les modifications)** et **Save (Enregistrer)**.  
![\[Exemple de configuration pour un diagramme à barres horizontales Dashboards.\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/keyword-bar-chart.png)

1. Revenez à la page **Visualize (Visualiser)** et ajoutez une visualisation finale, un diagramme à barres verticales.

1. Sélectionnez **Split Series (Fractionner les séries)**. Pour **Aggregation (Regroupement)**, choisissez **Date Histogram (Histogramme par date)**. Pour **Field (Champ)**, choisissez **timestamp (horodatage)** et définissez **Interval (Intervalle)** sur **Daily (Quotidien)**.

1. Choisissez **Metrics & Axes (Métriques et axes)** et définissez **Mode** sur **normal**.

1. Choisissez **Apply Changes (Appliquer les modifications)** et **Save (Enregistrer)**.  
![\[Exemple de configuration pour un diagramme à barres verticales Dashboards.\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/timestamp-bar-chart-2.png)

1. Maintenant que vous avez trois visualisations, vous pouvez les ajouter à un tableau de bord Dashboards. Choisissez **Dashboard (Tableau de bord)**, créez un tableau de bord, puis ajoutez vos visualisations.  
![\[Exemple de visualisation Dashboards.\]](http://docs.aws.amazon.com/fr_fr/opensearch-service/latest/developerguide/images/dashboard-2.png)

## Étape 5 : Nettoyage des ressources et étapes suivantes
<a name="walkthrough-next-steps"></a>

Pour éviter des frais inutiles, supprimez le compartiment S3 et le domaine OpenSearch de service. Pour en savoir plus, consultez [Supprimer un compartiment](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-or-empty-bucket.html#delete-bucket) dans le *guide de l'utilisateur d'Amazon Simple Storage Service* et [Supprimer un domaine de OpenSearch service](gsgdeleting.md) dans ce guide.

Les transcriptions nécessitent beaucoup moins d'espace disque que MP3 les fichiers. Vous pouvez peut-être raccourcir votre période de MP3 conservation, par exemple en passant de trois mois d'enregistrements d'appels à un mois, en conservant des années de transcriptions tout en économisant sur les coûts de stockage.

Vous pouvez également automatiser le processus de transcription à l'aide AWS Step Functions de Lambda, ajouter des métadonnées supplémentaires avant l'indexation ou créer des visualisations plus complexes adaptées à votre cas d'utilisation exact.