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/pl/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-spee...

12 KiB

Tłumaczenie mowy - Wio Terminal

W tej części lekcji napiszesz kod do tłumaczenia tekstu za pomocą usługi Translator.

Konwersja tekstu na mowę za pomocą usługi Translator

REST API usługi mowy nie obsługuje bezpośrednich tłumaczeń. Możesz jednak użyć usługi Translator, aby przetłumaczyć tekst wygenerowany przez usługę zamiany mowy na tekst oraz tekst odpowiedzi mówionej. Usługa Translator posiada REST API, które możesz wykorzystać do tłumaczenia tekstu, ale aby ułatwić korzystanie z niej, zostanie ona opakowana w inny wyzwalacz HTTP w Twojej aplikacji funkcji.

Zadanie - utwórz funkcję bezserwerową do tłumaczenia tekstu

  1. Otwórz swój projekt smart-timer-trigger w VS Code i uruchom terminal, upewniając się, że środowisko wirtualne jest aktywne. Jeśli nie, zamknij i ponownie utwórz terminal.

  2. Otwórz plik local.settings.json i dodaj ustawienia dla klucza API usługi Translator oraz lokalizacji:

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

    Zamień <key> na klucz API dla zasobu usługi Translator. Zamień <location> na lokalizację, którą wybrałeś podczas tworzenia zasobu usługi Translator.

  3. Dodaj nowy wyzwalacz HTTP do tej aplikacji o nazwie translate-text, używając następującego polecenia w terminalu VS Code w katalogu głównym projektu aplikacji funkcji:

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

    To utworzy wyzwalacz HTTP o nazwie translate-text.

  4. Zastąp zawartość pliku __init__.py w folderze translate-text następującym kodem:

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

    Ten kod pobiera tekst i języki z żądania HTTP. Następnie wysyła żądanie do REST API usługi Translator, przekazując języki jako parametry URL oraz tekst do przetłumaczenia jako treść żądania. Na końcu zwracane jest tłumaczenie.

  5. Uruchom lokalnie swoją aplikację funkcji. Możesz ją wywołać za pomocą narzędzia takiego jak curl, w taki sam sposób, w jaki testowałeś wyzwalacz HTTP text-to-timer. Upewnij się, że przekazujesz tekst do przetłumaczenia oraz języki w treści JSON:

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

    Ten przykład tłumaczy Définir une minuterie de 30 secondes z francuskiego na angielski amerykański. Zwróci Set a 30-second timer.

💁 Ten kod znajdziesz w folderze code/functions.

Zadanie - użyj funkcji Translator do tłumaczenia tekstu

  1. Otwórz projekt smart-timer w VS Code, jeśli nie jest już otwarty.

  2. Twój inteligentny timer będzie miał ustawione 2 języki - język serwera, który został użyty do trenowania LUIS (ten sam język jest również używany do budowania komunikatów mówionych do użytkownika) oraz język używany przez użytkownika. Zaktualizuj stałą LANGUAGE w pliku nagłówkowym config.h, aby odpowiadała językowi, w którym będzie mówił użytkownik, i dodaj nową stałą o nazwie SERVER_LANGUAGE dla języka użytego do trenowania LUIS:

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

    Zamień <user language> na nazwę lokalizacji dla języka, w którym będziesz mówić, na przykład fr-FR dla francuskiego lub zn-HK dla kantońskiego.

    Zamień <server language> na nazwę lokalizacji dla języka użytego do trenowania LUIS.

    Listę obsługiwanych języków i ich nazw lokalizacji znajdziesz w dokumentacji wsparcia językowego i głosowego na Microsoft Docs.

    💁 Jeśli nie mówisz w wielu językach, możesz użyć usługi takiej jak Bing Translate lub Google Translate, aby przetłumaczyć z preferowanego języka na wybrany język. Te usługi mogą również odtwarzać dźwięk przetłumaczonego tekstu.

    Na przykład, jeśli trenujesz LUIS w języku angielskim, ale chcesz używać francuskiego jako języka użytkownika, możesz przetłumaczyć zdania takie jak "set a 2 minute and 27 second timer" z angielskiego na francuski za pomocą Bing Translate, a następnie użyć przycisku Listen translation, aby wypowiedzieć tłumaczenie do mikrofonu.

    Przycisk Listen translation w Bing Translate

  3. Dodaj klucz API usługi Translator i lokalizację poniżej SPEECH_LOCATION:

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

    Zamień <KEY> na klucz API dla zasobu usługi Translator. Zamień <LOCATION> na lokalizację, którą wybrałeś podczas tworzenia zasobu usługi Translator.

  4. Dodaj URL wyzwalacza Translator poniżej VOICE_URL:

    const char *TRANSLATE_FUNCTION_URL = "<URL>";
    

    Zamień <URL> na URL dla wyzwalacza HTTP translate-text w Twojej aplikacji funkcji. Będzie to ta sama wartość co TEXT_TO_TIMER_FUNCTION_URL, z wyjątkiem nazwy funkcji translate-text zamiast text-to-timer.

  5. Dodaj nowy plik do folderu src o nazwie text_translator.h.

  6. Ten nowy plik nagłówkowy text_translator.h będzie zawierał klasę do tłumaczenia tekstu. Dodaj do tego pliku następujący kod, aby zadeklarować tę klasę:

    #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;
    

    Deklaruje to klasę TextTranslator oraz jej instancję. Klasa ma jedno pole dla klienta WiFi.

  7. W sekcji public tej klasy dodaj metodę do tłumaczenia tekstu:

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

    Ta metoda przyjmuje język, z którego tłumaczymy, oraz język, na który tłumaczymy. Podczas obsługi mowy, mowa będzie tłumaczona z języka użytkownika na język serwera LUIS, a podczas udzielania odpowiedzi będzie tłumaczona z języka serwera LUIS na język użytkownika.

  8. W tej metodzie dodaj kod do skonstruowania treści JSON zawierającej tekst do przetłumaczenia oraz języki:

    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. Poniżej tego kodu dodaj kod do wysłania treści do aplikacji funkcji bezserwerowej:

    HTTPClient httpClient;
    httpClient.begin(_client, TRANSLATE_FUNCTION_URL);
    
    int httpResponseCode = httpClient.POST(body);
    
  10. Następnie dodaj kod do pobrania odpowiedzi:

    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. Na końcu dodaj kod do zamknięcia połączenia i zwrócenia przetłumaczonego tekstu:

    httpClient.end();
    
    return translated_text;
    

Zadanie - tłumaczenie rozpoznanej mowy i odpowiedzi

  1. Otwórz plik main.cpp.

  2. Dodaj dyrektywę include na początku pliku dla pliku nagłówkowego klasy TextTranslator:

    #include "text_translator.h"
    
  3. Tekst wypowiadany, gdy timer jest ustawiany lub wygasa, musi być przetłumaczony. Aby to zrobić, dodaj następujący kod jako pierwszą linię funkcji say:

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

    To przetłumaczy tekst na język użytkownika.

  4. W funkcji processAudio tekst jest pobierany z przechwyconego dźwięku za pomocą wywołania String text = speechToText.convertSpeechToText();. Po tym wywołaniu przetłumacz tekst:

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

    To przetłumaczy tekst z języka użytkownika na język używany na serwerze.

  5. Zbuduj ten kod, wgraj go na swój Wio Terminal i przetestuj za pomocą monitora szeregowego. Gdy zobaczysz Ready w monitorze szeregowym, naciśnij przycisk C (ten po lewej stronie, najbliżej przełącznika zasilania) i mów. Upewnij się, że Twoja aplikacja funkcji działa, i zażądaj timera w języku użytkownika, mówiąc w tym języku samodzielnie lub używając aplikacji tłumaczącej.

    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.
    

💁 Ten kod znajdziesz w folderze code/wio-terminal.

😀 Twój wielojęzyczny program timera zakończył się sukcesem!

Zastrzeżenie:
Ten dokument został przetłumaczony za pomocą usługi tłumaczenia AI Co-op Translator. Chociaż dokładamy wszelkich starań, aby tłumaczenie było precyzyjne, prosimy pamiętać, że automatyczne tłumaczenia mogą zawierać błędy lub nieścisłości. Oryginalny dokument w jego rodzimym języku powinien być uznawany za wiarygodne źródło. W przypadku informacji o kluczowym znaczeniu zaleca się skorzystanie z profesjonalnego tłumaczenia przez człowieka. Nie ponosimy odpowiedzialności za jakiekolwiek nieporozumienia lub błędne interpretacje wynikające z użycia tego tłumaczenia.