You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/da/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-spee...

12 KiB

Oversæt tale - Wio Terminal

I denne del af lektionen vil du skrive kode til at oversætte tekst ved hjælp af oversættelsestjenesten.

Konverter tekst til tale ved hjælp af oversættelsestjenesten

REST API'en for taletjenesten understøtter ikke direkte oversættelser. I stedet kan du bruge oversættelsestjenesten til at oversætte teksten, der genereres af tale-til-tekst-tjenesten, samt teksten til det talte svar. Denne tjeneste har et REST API, som du kan bruge til at oversætte teksten, men for at gøre det nemmere at bruge, vil dette blive pakket ind i en anden HTTP-trigger i din funktion-app.

Opgave - opret en serverløs funktion til at oversætte tekst

  1. Åbn dit smart-timer-trigger-projekt i VS Code, og åbn terminalen, og sørg for, at det virtuelle miljø er aktiveret. Hvis ikke, luk og genskab terminalen.

  2. Åbn filen local.settings.json og tilføj indstillinger for oversættelsestjenestens API-nøgle og placering:

    "TRANSLATOR_KEY": "<key>",
    "TRANSLATOR_LOCATION": "<location>"
    

    Erstat <key> med API-nøglen til din oversættelsestjeneste. Erstat <location> med den placering, du brugte, da du oprettede oversættelsestjenesten.

  3. Tilføj en ny HTTP-trigger til denne app kaldet translate-text ved hjælp af følgende kommando fra terminalen i rodmappen af funktion-app-projektet:

    func new --name translate-text --template "HTTP trigger"
    

    Dette vil oprette en HTTP-trigger kaldet translate-text.

  4. Erstat indholdet af filen __init__.py i mappen translate-text med følgende:

    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'])
    

    Denne kode udtrækker teksten og sprogene fra HTTP-anmodningen. Den sender derefter en anmodning til oversættelsestjenestens REST API, hvor sprogene sendes som parametre i URL'en, og teksten, der skal oversættes, sendes som body. Til sidst returneres oversættelsen.

  5. Kør din funktion-app lokalt. Du kan derefter kalde denne ved hjælp af et værktøj som curl på samme måde, som du testede din text-to-timer HTTP-trigger. Sørg for at sende teksten, der skal oversættes, og sprogene som en JSON-body:

    {
        "text": "Définir une minuterie de 30 secondes",
        "from_language": "fr-FR",
        "to_language": "en-US"
    }
    

    Dette eksempel oversætter Définir une minuterie de 30 secondes fra fransk til amerikansk engelsk. Det vil returnere Set a 30-second timer.

💁 Du kan finde denne kode i mappen code/functions.

Opgave - brug oversættelsesfunktionen til at oversætte tekst

  1. Åbn projektet smart-timer i VS Code, hvis det ikke allerede er åbent.

  2. Din smarte timer vil have 2 sprog indstillet - sproget på serveren, der blev brugt til at træne LUIS (det samme sprog bruges også til at opbygge beskederne, der skal tales til brugeren), og sproget, der tales af brugeren. Opdater konstanten LANGUAGE i header-filen config.h til at være det sprog, der vil blive talt af brugeren, og tilføj en ny konstant kaldet SERVER_LANGUAGE for sproget, der blev brugt til at træne LUIS:

    const char *LANGUAGE = "<user language>";
    const char *SERVER_LANGUAGE = "<server language>";
    

    Erstat <user language> med lokalnavnet for det sprog, du vil tale, for eksempel fr-FR for fransk eller zn-HK for kantonesisk.

    Erstat <server language> med lokalnavnet for det sprog, der blev brugt til at træne LUIS.

    Du kan finde en liste over de understøttede sprog og deres lokalnavne i Language and voice support documentation on Microsoft docs.

    💁 Hvis du ikke taler flere sprog, kan du bruge en tjeneste som Bing Translate eller Google Translate til at oversætte fra dit foretrukne sprog til et sprog efter eget valg. Disse tjenester kan derefter afspille lyd af den oversatte tekst.

    For eksempel, hvis du træner LUIS på engelsk, men ønsker at bruge fransk som brugersprog, kan du oversætte sætninger som "set a 2 minute and 27 second timer" fra engelsk til fransk ved hjælp af Bing Translate, og derefter bruge knappen Lyt til oversættelse til at tale oversættelsen ind i din mikrofon.

    Knappen Lyt til oversættelse på Bing Translate

  3. Tilføj oversættelsestjenestens API-nøgle og placering under SPEECH_LOCATION:

    const char *TRANSLATOR_API_KEY = "<KEY>";
    const char *TRANSLATOR_LOCATION = "<LOCATION>";
    

    Erstat <KEY> med API-nøglen til din oversættelsestjeneste. Erstat <LOCATION> med den placering, du brugte, da du oprettede oversættelsestjenesten.

  4. Tilføj URL'en til oversættelsestriggeren under VOICE_URL:

    const char *TRANSLATE_FUNCTION_URL = "<URL>";
    

    Erstat <URL> med URL'en til HTTP-triggeren translate-text i din funktion-app. Dette vil være det samme som værdien for TEXT_TO_TIMER_FUNCTION_URL, bortset fra at funktionsnavnet er translate-text i stedet for text-to-timer.

  5. Tilføj en ny fil til mappen src kaldet text_translator.h.

  6. Denne nye header-fil text_translator.h vil indeholde en klasse til at oversætte tekst. Tilføj følgende til denne fil for at erklære 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;
    

    Dette erklærer klassen TextTranslator sammen med en instans af denne klasse. Klassen har et enkelt felt til WiFi-klienten.

  7. Til den offentlige sektion af denne klasse, tilføj en metode til at oversætte tekst:

    String translateText(String text, String from_language, String to_language)
    {
    }
    

    Denne metode tager sproget, der skal oversættes fra, og sproget, der skal oversættes til. Når tale behandles, vil talen blive oversat fra brugersproget til LUIS-serverens sprog, og når der gives svar, vil det blive oversat fra LUIS-serverens sprog til brugersproget.

  8. I denne metode, tilføj kode til at konstruere en JSON-body, der indeholder teksten, der skal oversættes, og sprogene:

    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);
    
  9. Under dette, tilføj følgende kode for at sende body til den serverløse funktion-app:

    HTTPClient httpClient;
    httpClient.begin(_client, TRANSLATE_FUNCTION_URL);
    
    int httpResponseCode = httpClient.POST(body);
    
  10. Tilføj derefter kode til at hente 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);
    }
    
  11. Til sidst, tilføj kode til at lukke forbindelsen og returnere den oversatte tekst:

    httpClient.end();
    
    return translated_text;
    

Opgave - oversæt den genkendte tale og svarene

  1. Åbn filen main.cpp.

  2. Tilføj en include-direktiv øverst i filen for header-filen til klassen TextTranslator:

    #include "text_translator.h"
    
  3. Teksten, der siges, når en timer indstilles eller udløber, skal oversættes. For at gøre dette, tilføj følgende som den første linje i funktionen say:

    text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
    

    Dette vil oversætte teksten til brugersproget.

  4. I funktionen processAudio hentes tekst fra den optagede lyd med kaldet String text = speechToText.convertSpeechToText();. Efter dette kald, oversæt teksten:

    String text = speechToText.convertSpeechToText();
    text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
    

    Dette vil oversætte teksten fra brugersproget til det sprog, der bruges på serveren.

  5. Byg denne kode, upload den til din Wio Terminal, og test den via den serielle monitor. Når du ser Ready i den serielle monitor, tryk på C-knappen (den til venstre, tættest på tænd/sluk-knappen), og tal. Sørg for, at din funktion-app kører, og anmod om en timer på brugersproget, enten ved at tale det sprog selv eller ved at bruge en oversættelsesapp.

    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 finde denne kode i mappen code/wio-terminal.

😀 Dit flersprogede timerprogram var en succes!


Ansvarsfraskrivelse:
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten Co-op Translator. Selvom vi bestræber os på nøjagtighed, skal du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det originale dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os ikke ansvar for eventuelle misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.