12 KiB
Traduzir fala - Wio Terminal
Nesta parte da lição, você escreverá código para traduzir texto usando o serviço de tradução.
Converter texto em fala usando o serviço de tradução
A API REST do serviço de fala não suporta traduções diretas. Em vez disso, você pode usar o serviço Translator para traduzir o texto gerado pelo serviço de fala para texto e o texto da resposta falada. Este serviço possui uma API REST que você pode usar para traduzir o texto, mas para facilitar o uso, ele será encapsulado em outro gatilho HTTP no seu aplicativo de funções.
Tarefa - criar uma função serverless para traduzir texto
-
Abra seu projeto
smart-timer-trigger
no VS Code e abra o terminal, garantindo que o ambiente virtual esteja ativado. Caso contrário, encerre e recrie o terminal. -
Abra o arquivo
local.settings.json
e adicione as configurações para a chave da API do Translator e a localização:"TRANSLATOR_KEY": "<key>", "TRANSLATOR_LOCATION": "<location>"
Substitua
<key>
pela chave da API do recurso do serviço de tradução. Substitua<location>
pela localização usada ao criar o recurso do serviço de tradução. -
Adicione um novo gatilho HTTP a este aplicativo chamado
translate-text
usando o seguinte comando no terminal do VS Code, na pasta raiz do projeto do aplicativo de funções:func new --name translate-text --template "HTTP trigger"
Isso criará um gatilho HTTP chamado
translate-text
. -
Substitua o conteúdo do arquivo
__init__.py
na pastatranslate-text
pelo seguinte:import logging import os import requests import azure.functions as func location = os.environ['TRANSLATOR_LOCATION'] translator_key = os.environ['TRANSLATOR_KEY'] def main(req: func.HttpRequest) -> func.HttpResponse: req_body = req.get_json() from_language = req_body['from_language'] to_language = req_body['to_language'] text = req_body['text'] logging.info(f'Translating {text} from {from_language} to {to_language}') url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0' headers = { 'Ocp-Apim-Subscription-Key': translator_key, 'Ocp-Apim-Subscription-Region': location, 'Content-type': 'application/json' } params = { 'from': from_language, 'to': to_language } body = [{ 'text' : text }] response = requests.post(url, headers=headers, params=params, json=body) return func.HttpResponse(response.json()[0]['translations'][0]['text'])
Este código extrai o texto e os idiomas da solicitação HTTP. Em seguida, faz uma solicitação à API REST do Translator, passando os idiomas como parâmetros para a URL e o texto a ser traduzido como corpo. Por fim, a tradução é retornada.
-
Execute seu aplicativo de funções localmente. Você pode então chamá-lo usando uma ferramenta como curl da mesma forma que testou seu gatilho HTTP
text-to-timer
. Certifique-se de passar o texto a ser traduzido e os idiomas como um corpo JSON:{ "text": "Définir une minuterie de 30 secondes", "from_language": "fr-FR", "to_language": "en-US" }
Este exemplo traduz Définir une minuterie de 30 secondes do francês para o inglês dos EUA. Ele retornará Set a 30-second timer.
💁 Você pode encontrar este código na pasta code/functions.
Tarefa - usar a função de tradução para traduzir texto
-
Abra o projeto
smart-timer
no VS Code, caso ainda não esteja aberto. -
Seu temporizador inteligente terá 2 idiomas configurados - o idioma do servidor usado para treinar o LUIS (o mesmo idioma também é usado para construir as mensagens para falar com o usuário) e o idioma falado pelo usuário. Atualize a constante
LANGUAGE
no arquivo de cabeçalhoconfig.h
para ser o idioma que será falado pelo usuário e adicione uma nova constante chamadaSERVER_LANGUAGE
para o idioma usado para treinar o LUIS:const char *LANGUAGE = "<user language>"; const char *SERVER_LANGUAGE = "<server language>";
Substitua
<user language>
pelo nome do local do idioma que você falará, por exemplo,fr-FR
para francês ouzn-HK
para cantonês.Substitua
<server language>
pelo nome do local do idioma usado para treinar o LUIS.Você pode encontrar uma lista dos idiomas suportados e seus nomes de local na documentação de suporte de idioma e voz nos documentos da Microsoft.
💁 Se você não fala vários idiomas, pode usar um serviço como Bing Translate ou Google Translate para traduzir do seu idioma preferido para um idioma de sua escolha. Esses serviços podem reproduzir áudio do texto traduzido.
Por exemplo, se você treinar o LUIS em inglês, mas quiser usar francês como idioma do usuário, pode traduzir frases como "set a 2 minute and 27 second timer" do inglês para o francês usando o Bing Translate e, em seguida, usar o botão Ouvir tradução para falar a tradução no seu microfone.
-
Adicione a chave da API do Translator e a localização abaixo de
SPEECH_LOCATION
:const char *TRANSLATOR_API_KEY = "<KEY>"; const char *TRANSLATOR_LOCATION = "<LOCATION>";
Substitua
<KEY>
pela chave da API do recurso do serviço de tradução. Substitua<LOCATION>
pela localização usada ao criar o recurso do serviço de tradução. -
Adicione a URL do gatilho do Translator abaixo de
VOICE_URL
:const char *TRANSLATE_FUNCTION_URL = "<URL>";
Substitua
<URL>
pela URL do gatilho HTTPtranslate-text
no seu aplicativo de funções. Este será o mesmo valor deTEXT_TO_TIMER_FUNCTION_URL
, exceto com um nome de função detranslate-text
em vez detext-to-timer
. -
Adicione um novo arquivo à pasta
src
chamadotext_translator.h
. -
Este novo arquivo de cabeçalho
text_translator.h
conterá uma classe para traduzir texto. Adicione o seguinte a este arquivo para declarar esta classe:#pragma once #include <Arduino.h> #include <ArduinoJson.h> #include <HTTPClient.h> #include <WiFiClient.h> #include "config.h" class TextTranslator { public: private: WiFiClient _client; }; TextTranslator textTranslator;
Isso declara a classe
TextTranslator
, junto com uma instância desta classe. A classe possui um único campo para o cliente WiFi. -
Na seção
public
desta classe, adicione um método para traduzir texto:String translateText(String text, String from_language, String to_language) { }
Este método recebe o idioma de origem e o idioma de destino. Ao lidar com fala, a fala será traduzida do idioma do usuário para o idioma do servidor LUIS, e ao fornecer respostas, será traduzida do idioma do servidor LUIS para o idioma do usuário.
-
Neste método, adicione código para construir um corpo JSON contendo o texto a ser traduzido e os idiomas:
DynamicJsonDocument doc(1024); doc["text"] = text; doc["from_language"] = from_language; doc["to_language"] = to_language; String body; serializeJson(doc, body); Serial.print("Translating "); Serial.print(text); Serial.print(" from "); Serial.print(from_language); Serial.print(" to "); Serial.print(to_language);
-
Abaixo disso, adicione o seguinte código para enviar o corpo ao aplicativo de funções serverless:
HTTPClient httpClient; httpClient.begin(_client, TRANSLATE_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
-
Em seguida, adicione código para obter a resposta:
String translated_text = ""; if (httpResponseCode == 200) { translated_text = httpClient.getString(); Serial.print("Translated: "); Serial.println(translated_text); } else { Serial.print("Failed to translate text - error "); Serial.println(httpResponseCode); }
-
Por fim, adicione código para fechar a conexão e retornar o texto traduzido:
httpClient.end(); return translated_text;
Tarefa - traduzir a fala reconhecida e as respostas
-
Abra o arquivo
main.cpp
. -
Adicione uma diretiva de inclusão no topo do arquivo para o arquivo de cabeçalho da classe
TextTranslator
:#include "text_translator.h"
-
O texto que é dito quando um temporizador é configurado ou expira precisa ser traduzido. Para fazer isso, adicione o seguinte como a primeira linha da função
say
:text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Isso traduzirá o texto para o idioma do usuário.
-
Na função
processAudio
, o texto é recuperado do áudio capturado com a chamadaString text = speechToText.convertSpeechToText();
. Após esta chamada, traduza o texto:String text = speechToText.convertSpeechToText(); text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Isso traduzirá o texto do idioma do usuário para o idioma usado no servidor.
-
Compile este código, carregue-o no seu Wio Terminal e teste-o através do monitor serial. Assim que você vir
Ready
no monitor serial, pressione o botão C (o da esquerda, mais próximo ao interruptor de energia) e fale. Certifique-se de que seu aplicativo de funções esteja em execução e solicite um temporizador no idioma do usuário, seja falando esse idioma você mesmo ou usando um aplicativo de tradução.Connecting to WiFi.. Connected! Got access token. Ready. Starting recording... Finished recording Sending speech... Speech sent! {"RecognitionStatus":"Success","DisplayText":"Définir une minuterie de 2 minutes 27 secondes.","Offset":9600000,"Duration":40400000} Translating Définir une minuterie de 2 minutes 27 secondes. from fr-FR to en-US Translated: Set a timer of 2 minutes 27 seconds. Set a timer of 2 minutes 27 seconds. {"seconds": 147} Translating 2 minute 27 second timer started. from en-US to fr-FR Translated: 2 minute 27 seconde minute a commencé. 2 minute 27 seconde minute a commencé. Translating Times up on your 2 minute 27 second timer. from en-US to fr-FR Translated: Chronométrant votre minuterie de 2 minutes 27 secondes. Chronométrant votre minuterie de 2 minutes 27 secondes.
💁 Você pode encontrar este código na pasta code/wio-terminal.
😀 Seu programa de temporizador multilíngue foi um sucesso!
Aviso Legal:
Este documento foi traduzido utilizando o serviço de tradução por IA Co-op Translator. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional realizada por humanos. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações equivocadas decorrentes do uso desta tradução.