Tutorial: visualização de chamadas de suporte ao cliente com o OpenSearch Service e o OpenSearch Dashboards - OpenSearch Serviço Amazon

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Tutorial: visualização de chamadas de suporte ao cliente com o OpenSearch Service e o OpenSearch Dashboards

Este capítulo é uma descrição completa da seguinte situação: uma empresa recebe um determinado número de chamadas de suporte ao cliente e quer analisá-las. O que é o assunto de cada chamada? Quantas eram positivas? Quantas eram negativas? Como os gerentes podem pesquisar ou revisar as transcrições dessas chamadas?

Um fluxo de trabalho manual pode envolver funcionários ouvindo gravações, anotando o assunto de cada chamada e decidindo se a interação do cliente foi positiva.

Esse processo seria extremamente trabalhoso. Supondo um tempo médio de 10 minutos por chamada, cada funcionário escutaria apenas 48 chamadas por dia. Independentemente do viés humano, os dados que eles geram seriam altamente precisos, mas a quantidade de dados seria mínima: apenas o assunto da chamada e um booliano para saber se o cliente estava ou não satisfeito. Qualquer coisa mais complexa, como uma transcrição completa, tomaria uma quantidade imensa de tempo.

Usando o Amazon S3, Amazon Transcribe, Amazon Comprehend e Amazon OpenSearch Service, você pode automatizar um processo semelhante com muito pouco código e terminar com muito mais dados. Por exemplo, você pode obter uma transcrição completa da chamada, as palavras-chave da transcrição e um "sentimento" global da chamada (positivo, negativo, neutro ou misto). Em seguida, você pode usar o OpenSearch e o OpenSearch Dashboards para pesquisar e visualizar os dados.

Embora você possa usar esta demonstração no estado em que se encontra, a intenção é estimular ideias sobre como enriquecer seus documentos JSON antes de indexá-los no OpenSearch Service.

Custos estimados

Em geral, executar as etapas desta demonstração devem custar menos de US$ 2. A demonstração usa os seguintes recursos:

Etapa 1: Configurar os pré-requisitos

Para continuar, você deve ter os recursos a seguir.

Pré-requisito Descrição
Bucket do Amazon S3. Para obter mais informações, consulte Creating a Bucket (Criar um bucket) no Manual do usuário do Amazon Simple Storage Service.
Domínio do OpenSearch Service O destino dos dados. Para obter mais informações, consulte Criação de domínios do OpenSearch Service.

Se você ainda não tiver esses recursos, poderá criá-los usando os seguintes comandos do 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

Esses comandos usam a região us-west-2, mas você pode usar qualquer região compatível com o Amazon Comprehend. Para saber mais, consulte o Referência geral da AWS.

Etapa 2: Copiar código de exemplo

  1. Copie e cole o código de exemplo Python 3 a seguir em um novo arquivo chamado 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())
  2. Atualize as primeiras seis variáveis.

  3. Instale os pacotes exigidos usando os seguintes comandos:

    pip install boto3 pip install requests pip install requests_aws4auth
  4. Coloque o MP3 no mesmo diretório que call-center.py e execute o script. Uma saída de exemplo se segue:

    $ 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 executa uma série de operações:

  1. O script carrega de um arquivo de áudio (neste caso, um MP3, mas o Amazon Transcribe é compatível com vários formatos) no bucket do S3.

  2. Ele envia o URL do arquivo de áudio para o Amazon Transcribe e aguarda até que o trabalho de transcrição termine.

    O tempo para concluir o trabalho de transcrição depende do tamanho do arquivo de áudio. Considere minutos, não segundos.

    dica

    Para melhorar a qualidade da transcrição, você pode configurar um vocabulário personalizado para o Amazon Transcribe.

  3. Depois que o trabalho de transcrição for concluído, o script extrairá a transcrição, a deixará com 5.000 caracteres e a enviará para o Amazon Comprehend para uma análise de palavras-chave e sentimento.

  4. Finalmente, o script adicionará a transcrição completa, palavras-chave, sentimentos e carimbo de data/hora atual em um documento JSON e o indexará no OpenSearch Service.

dica

O LibriVox tem audiolivros de domínio público que você pode usar para testes.

(Opcional) Etapa 3: Indexar dados de exemplo

Se você não tiver várias gravações de chamadas à disposição — e quem tem? — poderá indexar os documentos de exemplo em sample-calls.zip, os quais são comparáveis àqueles produzidos pelo call-center.py.

  1. Crie um arquivo chamado 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))
  2. Atualize as primeiras duas variáveis para host e region.

  3. Instale o pacote exigido usando o seguinte comando:

    pip install opensearch-py
  4. Faça download e descompacte sample-calls.zip.

  5. Coloque sample-calls.bulk no mesmo diretório que bulk-helper.py e execute o auxiliar. Uma saída de exemplo se segue:

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

Etapa 4: Analisar e visualizar seus dados

Agora que você tem alguns dados no OpenSearch Service, poderá visualizá-los usando o OpenSearch Dashboards.

  1. Acesse https://search-domain.region.es.amazonaws.com/_dashboards.

  2. Antes de usar o OpenSearch Dashboards, você precisará de um padrão de índice. O Dashboard usa padrões de índice para restringir sua análise a um ou mais índices. Para corresponder ao índice support-calls criado por call-center.py, vá para Stack Management (Gerenciamento de pilhas), Index Patterns (Padrões de índice) e definir um padrão de índice de support*. Em seguida, escolha Next step (Próxima etapa).

  3. Para o nome de campo Filtro de tempo, escolha timestamp.

  4. Agora, você pode começar a criar visualizações. Escolha Visualizar e, em seguida, adicione uma nova visualização.

  5. Escolha o gráfico de pizza e o padrão de índice support*.

  6. A visualização padrão é básica. Portanto, escolha Dividir fatias para criar uma visualização mais interessante.

    Em Aggregation, escolha Terms. Em Campo, escolha sentiment.keyword. Em seguida, escolha Aplicar alterações e Salvar.

    Exemplo de configuração para um gráfico de pizza do Dashboards.
  7. Volte para a página Visualizar e adicione outra visualização. Dessa vez, escolha o gráfico de barras horizontais.

  8. Selecione Dividir séries.

    Em Aggregation, escolha Terms. Em Campo, escolha keywords.keyword e altere Tamanho para 20. Em seguida, escolha Aplicar alterações e Salvar.

    Exemplo de configuração para um gráfico de barras horizontais do Dashboards.
  9. Volte para a página Visualizar e adicione uma visualização final, um gráfico de barras verticais.

  10. Selecione Dividir séries. Em Agregação, escolha Histograma de data. Em Campo, escolha timestamp e altere Intervalo para Diariamente.

  11. Escolha Métricas e eixos e altere Modo para normal.

  12. Escolha Aplicar alterações e Salvar.

    Exemplo de configuração para um gráfico de barras verticais do Dashboards.
  13. Agora que você tem três visualizações, poderá adicioná-las a uma visualização do Dashboards. Escolha Painel, crie um painel e adicione suas visualizações.

    Visualização de exemplo do Dashboards.

Etapa 5: Limpar recursos e próximas etapas

Para evitar cobranças desnecessárias, exclua o bucket do S3 e o domínio do OpenSearch Service. Para saber mais, consulte Delete a Bucket (Excluir um bucket) no Manual do usuário do Amazon Simple Storage Service e Delete an OpenSearch Service domain (Excluir um domínio do OpenSearch Service) nesse guia.

Transcrições exigem muito menos espaço em disco do que arquivos MP3. Você pode reduzir sua janela de retenção de MP3 — por exemplo, de três meses de gravações de chamadas para um mês —, reter anos de transcrições e ainda economizar custos de armazenamento.

Você também pode automatizar o processo de transcrição usando o AWS Step Functions e o Lambda, adicionar metadados adicionais antes de indexar ou criar visualizações mais complexas para se adequar ao seu caso de uso específico.