12 KiB
Översätt tal - Wio Terminal
I den här delen av lektionen kommer du att skriva kod för att översätta text med hjälp av översättningstjänsten.
Konvertera text till tal med översättningstjänsten
REST-API:t för tal-tjänsten stöder inte direkta översättningar, men du kan använda översättningstjänsten för att översätta texten som genereras av tal-till-text-tjänsten och texten för det talade svaret. Den här tjänsten har ett REST-API som du kan använda för att översätta text, men för att göra det enklare att använda kommer detta att kapslas in i en annan HTTP-trigger i din funktionapp.
Uppgift - skapa en serverlös funktion för att översätta text
-
Öppna ditt
smart-timer-trigger
-projekt i VS Code och öppna terminalen, se till att den virtuella miljön är aktiverad. Om inte, avsluta och återskapa terminalen. -
Öppna filen
local.settings.json
och lägg till inställningar för API-nyckeln och platsen för översättningstjänsten:"TRANSLATOR_KEY": "<key>", "TRANSLATOR_LOCATION": "<location>"
Ersätt
<key>
med API-nyckeln för din översättningstjänstresurs. Ersätt<location>
med platsen du använde när du skapade översättningstjänstresursen. -
Lägg till en ny HTTP-trigger i den här appen som heter
translate-text
med följande kommando från terminalen i VS Code i rotmappen för funktionapp-projektet:func new --name translate-text --template "HTTP trigger"
Detta skapar en HTTP-trigger som heter
translate-text
. -
Ersätt innehållet i filen
__init__.py
i mappentranslate-text
med följande: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'])
Den här koden extraherar texten och språken från HTTP-förfrågan. Den gör sedan en förfrågan till översättningstjänstens REST-API, skickar språken som parametrar för URL:en och texten som ska översättas som kroppen. Slutligen returneras översättningen.
-
Kör din funktionapp lokalt. Du kan sedan anropa den med ett verktyg som curl på samma sätt som du testade din
text-to-timer
HTTP-trigger. Se till att skicka texten som ska översättas och språken som en JSON-kropp:{ "text": "Définir une minuterie de 30 secondes", "from_language": "fr-FR", "to_language": "en-US" }
Detta exempel översätter Définir une minuterie de 30 secondes från franska till amerikansk engelska. Det kommer att returnera Set a 30-second timer.
💁 Du kan hitta denna kod i mappen code/functions.
Uppgift - använd översättningsfunktionen för att översätta text
-
Öppna projektet
smart-timer
i VS Code om det inte redan är öppet. -
Din smarta timer kommer att ha två språk inställda - språket för servern som användes för att träna LUIS (samma språk används också för att bygga meddelanden som ska talas till användaren) och språket som talas av användaren. Uppdatera konstanten
LANGUAGE
i header-filenconfig.h
till att vara språket som kommer att talas av användaren, och lägg till en ny konstant som heterSERVER_LANGUAGE
för språket som användes för att träna LUIS:const char *LANGUAGE = "<user language>"; const char *SERVER_LANGUAGE = "<server language>";
Ersätt
<user language>
med lokalnamnet för språket du kommer att tala, till exempelfr-FR
för franska ellerzn-HK
för kantonesiska.Ersätt
<server language>
med lokalnamnet för språket som användes för att träna LUIS.Du kan hitta en lista över de stödda språken och deras lokalnamn i Language and voice support documentation på Microsoft docs.
💁 Om du inte talar flera språk kan du använda en tjänst som Bing Translate eller Google Translate för att översätta från ditt föredragna språk till ett språk du väljer. Dessa tjänster kan sedan spela upp ljud av den översatta texten.
Till exempel, om du tränar LUIS på engelska men vill använda franska som användarspråk, kan du översätta meningar som "set a 2 minute and 27 second timer" från engelska till franska med Bing Translate, och sedan använda knappen Lyssna på översättning för att tala översättningen i din mikrofon.
-
Lägg till API-nyckeln och platsen för översättningstjänsten under
SPEECH_LOCATION
:const char *TRANSLATOR_API_KEY = "<KEY>"; const char *TRANSLATOR_LOCATION = "<LOCATION>";
Ersätt
<KEY>
med API-nyckeln för din översättningstjänstresurs. Ersätt<LOCATION>
med platsen du använde när du skapade översättningstjänstresursen. -
Lägg till URL:en för översättningstriggern under
VOICE_URL
:const char *TRANSLATE_FUNCTION_URL = "<URL>";
Ersätt
<URL>
med URL:en för HTTP-triggerntranslate-text
i din funktionapp. Detta kommer att vara samma som värdet förTEXT_TO_TIMER_FUNCTION_URL
, förutom med funktionsnamnettranslate-text
istället förtext-to-timer
. -
Lägg till en ny fil i mappen
src
som hetertext_translator.h
. -
Denna nya header-fil
text_translator.h
kommer att innehålla en klass för att översätta text. Lägg till följande i denna fil för att deklarera klassen:#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;
Detta deklarerar klassen
TextTranslator
, tillsammans med en instans av denna klass. Klassen har ett enda fält för WiFi-klienten. -
Till den
public
sektionen av denna klass, lägg till en metod för att översätta text:String translateText(String text, String from_language, String to_language) { }
Denna metod tar språket att översätta från och språket att översätta till. När tal hanteras kommer talet att översättas från användarspråket till LUIS-serverns språk, och när svar ges kommer det att översättas från LUIS-serverns språk till användarens språk.
-
I denna metod, lägg till kod för att konstruera en JSON-kropp som innehåller texten att översätta och språken:
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);
-
Nedanför detta, lägg till följande kod för att skicka kroppen till den serverlösa funktionappen:
HTTPClient httpClient; httpClient.begin(_client, TRANSLATE_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
-
Nästa steg är att lägga till kod för att hämta svaret:
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); }
-
Slutligen, lägg till kod för att stänga anslutningen och returnera den översatta texten:
httpClient.end(); return translated_text;
Uppgift - översätt det igenkända talet och svaren
-
Öppna filen
main.cpp
. -
Lägg till en include-direktiv högst upp i filen för header-filen för klassen
TextTranslator
:#include "text_translator.h"
-
Texten som sägs när en timer ställs in eller går ut behöver översättas. För att göra detta, lägg till följande som första raden i funktionen
say
:text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Detta kommer att översätta texten till användarens språk.
-
I funktionen
processAudio
hämtas text från det inspelade ljudet med anropetString text = speechToText.convertSpeechToText();
. Efter detta anrop, översätt texten:String text = speechToText.convertSpeechToText(); text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Detta kommer att översätta texten från användarens språk till språket som används på servern.
-
Bygg denna kod, ladda upp den till din Wio Terminal och testa den via seriell monitor. När du ser
Ready
i den seriella monitorn, tryck på C-knappen (den till vänster, närmast strömbrytaren) och tala. Se till att din funktionapp körs och begär en timer på användarspråket, antingen genom att tala det språket själv eller använda en översättningstjänst.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.
💁 Du kan hitta denna kod i mappen code/wio-terminal.
😀 Ditt flerspråkiga timerprogram blev en framgång!
Ansvarsfriskrivning:
Detta dokument har översatts med hjälp av AI-översättningstjänsten Co-op Translator. Även om vi strävar efter noggrannhet, bör det noteras att automatiserade översättningar kan innehålla fel eller inexaktheter. Det ursprungliga dokumentet på dess originalspråk bör betraktas som den auktoritativa källan. För kritisk information rekommenderas professionell mänsklig översättning. Vi ansvarar inte för eventuella missförstånd eller feltolkningar som uppstår vid användning av denna översättning.