

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.

# Tutorial: Visualización de las llamadas de atención al cliente con el OpenSearch servicio y los paneles OpenSearch
<a name="walkthrough"></a>

Este capítulo es un tutorial completo de la siguiente situación: el servicio de atención al cliente de una empresa recibe llamadas y quiere analizarlas. ¿Cuál es el tema de cada llamada? ¿Cuántas fueron positivas? ¿Cuántas negativas? ¿Cómo los gerentes pueden buscar o revisar las transcripciones de estas llamadas?

Un flujo de trabajo manual puede implicar que los empleados escuchen las grabaciones, apunten el tema de cada llamada y decidan si la interacción con el cliente fue positiva.

Dicho proceso requeriría mucho esfuerzo y trabajo. Suponiendo un tiempo medio de 10 minutos por llamada, cada empleado podría escuchar solo 48 llamadas al día. Salvo sesgo humano, los datos que generan sería de alta precisión, pero la *cantidad* de datos sería mínima: tan solo el tema de la llamada y un valor booleano para determinar si el cliente quedó satisfecho. Cualquier información más compleja, como, por ejemplo, una transcripción completa, requeriría gran cantidad de tiempo.

Con [Amazon S3](https://aws.amazon.com/s3/), [Amazon Transcribe](https://aws.amazon.com/transcribe/), [Amazon Comprehend](https://aws.amazon.com/comprehend/) y OpenSearch Amazon Service, puede automatizar un proceso similar con muy poco código y obtener muchos más datos. Por ejemplo, puede obtener una transcripción completa de la llamada, palabras clave de la transcripción, y un "sentimiento" general de la llamada (positiva, negativa, neutra o mixta). Luego, puede usar OpenSearch los OpenSearch paneles de control para buscar y visualizar los datos.

Si bien puedes usar este tutorial tal como está, la intención es generar ideas sobre cómo enriquecer tus documentos JSON antes de indexarlos en Service. OpenSearch 

**Costo estimado:**

En general, seguir los pasos que se indican en este tutorial debería costar menos de 2 USD. En este tutorial se utilizan los siguientes recursos:
+ bucket de S3 con menos de 100 MB transferidos y almacenados

  Para obtener más información, consulte [Precios de Amazon S3](https://aws.amazon.com/s3/pricing/).
+ OpenSearch Dominio de servicio con una `t2.medium` instancia y 10 GiB de almacenamiento de EBS durante varias horas

  Para obtener más información, consulta los [precios OpenSearch de Amazon Service](https://aws.amazon.com/elasticsearch-service/pricing/).
+ Varias llamadas a Amazon Transcribe

  Para obtener más información, consulte [Precios de Amazon Transcribe](https://aws.amazon.com/transcribe/pricing/).
+ Varias llamadas de procesamiento de lenguaje natural a Amazon Comprehend

  Para obtener más información, consulte [Precios de Amazon Comprehend](https://aws.amazon.com/comprehend/pricing/).

**Topics**
+ [Paso 1: configure los requisitos previos](#walkthrough-prereq)
+ [Paso 2: copie el código de muestra](#walkthrough-script)
+ [(Opcional) Paso 3: indexe los datos de ejemplo](#walkthrough-sample-data)
+ [Paso 4: analice y visualice sus datos](#walkthrough-analysis)
+ [Paso 5: elimine recursos y pasos siguientes](#walkthrough-next-steps)

## Paso 1: configure los requisitos previos
<a name="walkthrough-prereq"></a>

Antes de continuar, debe contar con los siguientes recursos.


****  

| Requisito previo | Description (Descripción) | 
| --- | --- | 
| Bucket de Amazon S3 | Para obtener más información, consulte [Creación de un bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html) en la Guía del usuario de Amazon Simple Storage Service. | 
| OpenSearch Dominio de servicio | El destino de los datos. Para obtener más información, consulte [Creación de dominios OpenSearch de servicio](createupdatedomains.md#createdomains). | 

Si aún no tiene estos recursos, puede crearlos utilizando los siguientes comandos de la AWS CLI :

```
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
```

**nota**  
Estos comandos utilizan la región `us-west-2`, pero puede utilizar cualquier región que admita Amazon Comprehend. Para obtener más información, consulte [Referencia general de AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#comprehend_region).

## Paso 2: copie el código de muestra
<a name="walkthrough-script"></a>

1. Copie y pegue el siguiente código de muestra de Python 3 en un archivo nuevo denominado `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. Actualice las seis variables iniciales.

1. Instale los paquetes necesarios mediante los siguientes comandos:

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

1. Colóquelo MP3 en el mismo directorio `call-center.py` y ejecute el script. A continuación se indica un ejemplo de salida:

   ```
   $ 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` realiza una serie de operaciones:

1. El script carga un archivo de audio (en este caso, un MP3, pero Amazon Transcribe admite varios formatos) a su bucket de S3.

1. Envía la URL del archivo de audio a Amazon Transcribe y espera que realice la tarea de transcripción.

   El tiempo necesario para terminar el trabajo de transcripción depende de la duración del archivo de audio. Supongamos que tomará minutos, no segundos.
**sugerencia**  
Para mejorar la calidad de la transcripción, puede configurar un [vocabulario personalizado](https://docs.aws.amazon.com/transcribe/latest/dg/API_CreateVocabulary.html) para Amazon Transcribe.

1. Una vez que el trabajo de transcripción termina, el script extrae la transcripción, la recorta a 5 000 caracteres y envía a Amazon Comprehend para identificar palabras clave y analizar el sentimiento.

1. Por último, el script agrega la transcripción completa, las palabras clave, el sentimiento y la marca de tiempo actual a un documento JSON y lo indexa en Service. OpenSearch 

**sugerencia**  
[LibriVox](https://librivox.org/)tiene audiolibros de dominio público que puede usar para realizar pruebas.

## (Opcional) Paso 3: indexe los datos de ejemplo
<a name="walkthrough-sample-data"></a>

Si no tiene a mano varias grabaciones de llamadas, y no es algo muy frecuente, puede [indexar](indexing.md) los documentos de muestra en [sample-calls.zip](samples/sample-calls.zip), que son comparables a lo que produce `call-center.py`.

1. Cree un archivo denominado `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. Actualice las dos variables iniciales para `host` y `region`.

1. Instale el paquete necesario mediante el siguiente comando:

   ```
   pip install opensearch-py
   ```

1. Descargue y descomprima [sample-calls.zip](samples/sample-calls.zip).

1. Guarde `sample-calls.bulk` en el mismo directorio que `bulk-helper.py` y ejecute el ayudante. A continuación se indica un ejemplo de salida:

   ```
   $ 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
   }
   ```

## Paso 4: analice y visualice sus datos
<a name="walkthrough-analysis"></a>

Ahora que tiene algunos datos en OpenSearch Service, puede visualizarlos mediante los OpenSearch paneles de control.

1. Vaya a `https://search-domain.region.es.amazonaws.com/_dashboards`.

1. Para poder usar los OpenSearch paneles, necesita un patrón de índice. Dashboards utiliza patrones de índice para limitar su análisis a uno o más índices. Para que coincida con el `support-calls`índice que`call-center.py` cree, diríjase a **Pila de administración**, **Patrones**, y defina un patrón de índice de `support*`. y luego elija **Paso siguiente**.

1. En **Time Filter field name (Nombre de campo Filtro de tiempo)**, elija **timestamp (marca temporal)**.

1. Ahora pude comenzar a crear visualizaciones. Seleccione **Visualize (Visualizar)** y añada una nueva visualización.

1. Seleccione el gráfico circular y el patrón de índice `support*`.

1. El valor predeterminado de visualización es básico. Si quiere crear una visualización más interesante, elija **Split Slices (Sectores divididos)**.

   Para **Aggregation (Agregación)**, elija **Terms (Términos)**. En **Field (Campo)**, elija **sentiment.keyword**. Seleccione **Apply changes (Aplicar cambios)** y **Save (Guardar)**.  
![\[Ejemplo de configuración para gráfico circular de Dashboards.\]](http://docs.aws.amazon.com/es_es/opensearch-service/latest/developerguide/images/sentiment-pie-chart.png)

1. Vuelva a la página **Visualizar** y agregue otra visualización. Esta vez, elija el gráfico de barras horizontales.

1. Seleccione **Split Series (Series divididas)**.

   Para **Aggregation (Agregación)**, elija **Terms (Términos)**. En **Field (Campo)**, elija **keywords.keyword** y cambie el valor de **Size (Tamaño)** a 20. Seleccione **Apply Changes (Aplicar cambios)** y **Save (Guardar)**.  
![\[Ejemplo de configuración para gráfico de barras horizontales de Dashboards.\]](http://docs.aws.amazon.com/es_es/opensearch-service/latest/developerguide/images/keyword-bar-chart.png)

1. Vuelva a la página **Visualizar** y agregue una última visualización, un gráfico de barras verticales.

1. Seleccione **Split Series (Series divididas)**. En **Aggregation (Agregación)**, elija **Date Histogram (Histograma de fecha)**. En **Field (Campo)**, elija **timestamp (marca temporal)** y cambie **Interval (Intervalo)** a **Daily (Diario)**.

1. Seleccione **Metrics & Axes (Métricas y ejes)** y cambie **Mode (Modo)** a **normal**.

1. Seleccione **Apply Changes (Aplicar cambios)** y **Save (Guardar)**.  
![\[Ejemplo de configuración para gráfico de barras verticales de Dashboards.\]](http://docs.aws.amazon.com/es_es/opensearch-service/latest/developerguide/images/timestamp-bar-chart-2.png)

1. Ahora que tiene tres visualizaciones, puede añadirlas a un panel de Dashboards. Seleccione **Dashboard (Panel)**, cree un panel y añada sus visualizaciones.  
![\[Visualización de paneles de ejemplo.\]](http://docs.aws.amazon.com/es_es/opensearch-service/latest/developerguide/images/dashboard-2.png)

## Paso 5: elimine recursos y pasos siguientes
<a name="walkthrough-next-steps"></a>

Para evitar cargos innecesarios, elimine el bucket de S3 y el dominio OpenSearch de servicio. Para obtener más información, consulta [Eliminar un bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-or-empty-bucket.html#delete-bucket) en la *Guía del usuario de Amazon Simple Storage Service* y [Eliminar un dominio de OpenSearch servicio](gsgdeleting.md) en esta guía.

Las transcripciones requieren mucho menos espacio en disco que MP3 los archivos. Es posible que pueda acortar el período de MP3 retención (por ejemplo, de tres meses de grabaciones de llamadas a un mes), conservar años de transcripciones y, aun así, ahorrar en costos de almacenamiento.

También puede automatizar el proceso de transcripción con AWS Step Functions Lambda, añadir metadatos adicionales antes de la indexación o crear visualizaciones más complejas que se adapten a su caso de uso exacto.