Exercício – Chamar o Serviço de tradução

Concluído

Com o Serviço de tradução do back-end criado no Azure e com as variáveis armazenadas prontas a utilizar, vamos concentrar-nos em adicionar a lógica e o modelo necessários à nossa aplicação, para a tradução do texto. Vamos executar os seguintes passos:

  1. Adicionar código para chamar o serviço
  2. Criar o modelo para apresentar resultados
  3. Testar a nossa aplicação

Adicionar código para chamar o serviço

O app.py contém a lógica da nossa aplicação. Vamos adicionar algumas importações necessárias às bibliotecas que vamos utilizar, seguidas da nova rota para dar resposta ao utilizador.

  1. Na parte superior do ficheiro app.py, adicione as seguintes linhas de código:

    import requests, os, uuid, json
    from dotenv import load_dotenv
    load_dotenv()
    

A linha superior importará as bibliotecas que vamos utilizar posteriormente, quando for feita a chamada para o Serviço de tradução. Também vamos importar load_dotenv de dotenv e executar a função, o que permitirá carregar os valores de .env.

  1. Na parte inferior do app.py, adicione as seguintes linhas de código para criar a rota e a lógica para traduzir o texto:

    @app.route('/', methods=['POST'])
    def index_post():
        # Read the values from the form
        original_text = request.form['text']
        target_language = request.form['language']
    
        # Load the values from .env
        key = os.environ['KEY']
        endpoint = os.environ['ENDPOINT']
        location = os.environ['LOCATION']
    
        # Indicate that we want to translate and the API version (3.0) and the target language
        path = '/translate?api-version=3.0'
        # Add the target language parameter
        target_language_parameter = '&to=' + target_language
        # Create the full URL
        constructed_url = endpoint + path + target_language_parameter
    
        # Set up the header information, which includes our subscription key
        headers = {
            'Ocp-Apim-Subscription-Key': key,
            'Ocp-Apim-Subscription-Region': location,
            'Content-type': 'application/json',
            'X-ClientTraceId': str(uuid.uuid4())
        }
    
        # Create the body of the request with the text to be translated
        body = [{ 'text': original_text }]
    
        # Make the call using post
        translator_request = requests.post(constructed_url, headers=headers, json=body)
        # Retrieve the JSON response
        translator_response = translator_request.json()
        # Retrieve the translation
        translated_text = translator_response[0]['translations'][0]['text']
    
        # Call render template, passing the translated text,
        # original text, and target language to the template
        return render_template(
            'results.html',
            translated_text=translated_text,
            original_text=original_text,
            target_language=target_language
        )
    

O código é comentado para descrever os passos que estão a ser executados. Num nível elevado, o código fará o seguinte:

  1. Lê o texto que o utilizador introduziu e o idioma que selecionou no formulário
  2. Lê as variáveis ambientais que criámos anteriormente no nosso ficheiro .env
  3. Cria o caminho necessário para chamar o Serviço de tradução, que inclui o idioma de destino (o idioma de origem é detetado automaticamente)
  4. Cria as informações de cabeçalho, que incluem a chave do Serviço de tradução, a localização do serviço e um ID arbitrário para a tradução
  5. Cria o corpo do pedido, que inclui o texto que queremos traduzir
  6. Chama post em requests para chamar o Serviço de tradução
  7. Recupera a resposta JSON do servidor, que inclui o texto traduzido
  8. Recupera o texto traduzido (veja a nota seguinte)
  9. Chama render_template para apresentar a página de resposta

Nota

Ao chamar o Serviço de tradução, é possível ter várias instruções traduzidas em vários idiomas numa única chamada. Como resultado de tal, o JSON devolvido pelo serviço contém muitas informações, das quais precisamos apenas de uma pequena parte. Assim, precisamos de recuar um pouco para obter o texto traduzido.

Especificamente, devemos ler o primeiro resultado, em seguida, a recolha de translations, a primeira tradução e, em seguida, o text. Esta ação pode ser realizada pela chamada: translator_response[0]['translations'][0]['text']

[
  {
    "detectedLanguage": {
      "language": "en",
      "score": 1.0
    },
    "translations": [
      {
        "text": "これはテストです",
        "to": "ja"
      }
    ]
  }
]

Criar o modelo para apresentar resultados

Vamos criar o modelo HTML para a página de resultados.

  1. Crie um novo ficheiro em modelos ao selecionar modelos na ferramenta Explorador no Visual Studio Code. Em seguida, selecione Novo ficheiro

  2. Dê o nome resultados.html ao ficheiro

  3. Adicione o seguinte código HTML ao ficheiro resultados.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css"
            integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
        <title>Result</title>
    </head>
    <body>
        <div class="container">
            <h2>Results</h2>
            <div>
                <strong>Original text:</strong> {{ original_text }}
            </div>
            <div>
                <strong>Translated text:</strong> {{ translated_text }}
            </div>
            <div>
                <strong>Target language code:</strong> {{ target_language }}
            </div>
            <div>
                <a href="{{ url_for('index') }}">Try another one!</a>
            </div>
        </div>
    </body>
    </html>
    

Observará que acedemos a original_text, translated_text e target_language, que passamos como parâmetros nomeados em render_template com {{ }}. Esta operação diz ao Flask para compor os conteúdos como texto simples. Também estamos a utilizar url_for('index') para criar uma ligação de retorno à página predefinida. Embora seja, tecnicamente, possível escrever o caminho para a página original, utilizar url_for indica ao Flask que deve ler o caminho para a função com o nome que indicamos (neste caso index). Se reorganizarmos o site, o URL gerado para a ligação será sempre válido.

Testar a página

Retorne ao terminal integrado no Visual Studio Code (ou reabra-o com Ctrl-', ou Cmd-' em um Mac). Se o site estiver em execução, será necessário parar e reiniciar o mesmo, para que a aplicação leia as nossas variáveis ambientais.

  1. Utilize Ctrl-C de forma a parar a aplicação Flask

  2. Execute o comando flask run para reiniciar o serviço

  3. Navegue para http://localhost:5000 para testar a aplicação

  4. Introduza o texto na área de texto, escolha um idioma e selecione Traduzir

    Screenshot showing the completed translation form with text for translation that reads I am going to Osaka and Japanese selected as the language.

  5. Os resultados serão apresentados!

    Screenshot showing the translation results.

Parabéns!

Criou com sucesso um site que utiliza a Tradução para implementar traduções! Dado que o idioma e a comunicação dependem do contexto e o mesmo nem sempre é claro para um computador, poderá ver que os resultados não são perfeitos. No entanto, normalmente, estão muito próximos ou suficientemente perto para uma comunicação eficaz, o que é o objetivo!

O código que proporcionamos aqui pode ser incorporado em qualquer aplicação desejada. Pode continuar a compilá-lo no site que criamos ou, até mesmo, implementá-lo no Serviço de Aplicações do Azure!

Verifique o seu conhecimento

1.

Qual é o nome do cabeçalho HTTP que carrega chaves de API em chamadas para serviços de IA do Azure?