12 KiB
Beszéd fordítása - Wio Terminal
Ebben a leckében kódot fogsz írni, amely a fordító szolgáltatást használja szöveg fordítására.
Szöveg átalakítása beszéddé a fordító szolgáltatás segítségével
A beszédszolgáltatás REST API-ja nem támogatja a közvetlen fordítást, ehelyett a Fordító szolgáltatást használhatod a beszéd-szöveg szolgáltatás által generált szöveg és a kimondott válasz szövegének fordítására. Ez a szolgáltatás egy REST API-t biztosít a szöveg fordításához, de a használat megkönnyítése érdekében ezt egy másik HTTP triggerbe csomagoljuk a funkciós alkalmazásodban.
Feladat - szerver nélküli funkció létrehozása szöveg fordítására
-
Nyisd meg a
smart-timer-trigger
projektet a VS Code-ban, és nyisd meg a terminált, ügyelve arra, hogy a virtuális környezet aktiválva legyen. Ha nem, zárd be és hozd létre újra a terminált. -
Nyisd meg a
local.settings.json
fájlt, és add hozzá a fordító API kulcsának és helyének beállításait:"TRANSLATOR_KEY": "<key>", "TRANSLATOR_LOCATION": "<location>"
Cseréld le a
<key>
értéket a fordító szolgáltatás erőforrásának API kulcsára. Cseréld le a<location>
értéket arra a helyre, amelyet a fordító szolgáltatás erőforrás létrehozásakor használtál. -
Adj hozzá egy új HTTP triggert ehhez az alkalmazáshoz
translate-text
néven a következő parancs segítségével, amelyet a VS Code termináljában futtatsz a funkciós alkalmazás projekt gyökérmappájában:func new --name translate-text --template "HTTP trigger"
Ez létrehoz egy
translate-text
nevű HTTP triggert. -
Cseréld le a
translate-text
mappában található__init__.py
fájl tartalmát a következőre: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'])
Ez a kód kinyeri a szöveget és a nyelveket a HTTP kérésből. Ezután kérést küld a fordító REST API-nak, a nyelveket paraméterként adva meg az URL-hez, és a fordítandó szöveget a törzsben. Végül visszaadja a fordítást.
-
Futtasd helyben a funkciós alkalmazásodat. Ezután egy olyan eszközzel, mint például a curl, meghívhatod, ugyanúgy, ahogy a
text-to-timer
HTTP triggert tesztelted. Ügyelj arra, hogy a fordítandó szöveget és a nyelveket JSON törzsként add meg:{ "text": "Définir une minuterie de 30 secondes", "from_language": "fr-FR", "to_language": "en-US" }
Ez a példa a Définir une minuterie de 30 secondes szöveget fordítja franciáról amerikai angolra. Az eredmény Set a 30-second timer lesz.
💁 Ezt a kódot megtalálod a code/functions mappában.
Feladat - a fordító funkció használata szöveg fordítására
-
Nyisd meg a
smart-timer
projektet a VS Code-ban, ha még nincs megnyitva. -
Az okos időzítőd két nyelvet fog használni - a szerver nyelvét, amelyet a LUIS betanításához használtak (ugyanez a nyelv használatos a felhasználónak szóló üzenetek összeállításához is), és a felhasználó által beszélt nyelvet. Frissítsd a
LANGUAGE
konstans értékét aconfig.h
fejlécfájlban a felhasználó által beszélt nyelvre, és adj hozzá egy új konstansotSERVER_LANGUAGE
néven a LUIS betanításához használt nyelvhez:const char *LANGUAGE = "<user language>"; const char *SERVER_LANGUAGE = "<server language>";
Cseréld le a
<user language>
értéket a beszélt nyelv helyi nevére, példáulfr-FR
a franciához vagyzn-HK
a kantonihoz.Cseréld le a
<server language>
értéket a LUIS betanításához használt nyelv helyi nevére.A támogatott nyelvek és helyi nevek listáját megtalálod a Microsoft dokumentációjában a nyelv- és hangtámogatásról.
💁 Ha nem beszélsz több nyelvet, használhatsz olyan szolgáltatásokat, mint a Bing Translate vagy a Google Translate, hogy lefordítsd a kedvenc nyelvedet egy másik nyelvre. Ezek a szolgáltatások le is tudják játszani a fordított szöveg hangját.
Például, ha LUIS-t angolul tanítod be, de franciát szeretnél használni felhasználói nyelvként, lefordíthatod az olyan mondatokat, mint például "set a 2 minute and 27 second timer" angolról franciára a Bing Translate segítségével, majd a Listen translation gombbal kimondhatod a fordítást a mikrofonodba.
-
Add hozzá a fordító API kulcsát és helyét a
SPEECH_LOCATION
alá:const char *TRANSLATOR_API_KEY = "<KEY>"; const char *TRANSLATOR_LOCATION = "<LOCATION>";
Cseréld le a
<KEY>
értéket a fordító szolgáltatás erőforrásának API kulcsára. Cseréld le a<LOCATION>
értéket arra a helyre, amelyet a fordító szolgáltatás erőforrás létrehozásakor használtál. -
Add hozzá a fordító trigger URL-jét a
VOICE_URL
alá:const char *TRANSLATE_FUNCTION_URL = "<URL>";
Cseréld le a
<URL>
értéket atranslate-text
HTTP trigger URL-jére a funkciós alkalmazásodban. Ez ugyanaz lesz, mint aTEXT_TO_TIMER_FUNCTION_URL
értéke, kivéve, hogy a funkció nevetranslate-text
lesztext-to-timer
helyett. -
Adj hozzá egy új fájlt a
src
mappáhoztext_translator.h
néven. -
Ez az új
text_translator.h
fejlécfájl egy osztályt fog tartalmazni a szöveg fordítására. Add hozzá a következőt ehhez a fájlhoz az osztály deklarálásához:#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;
Ez deklarálja a
TextTranslator
osztályt, valamint ennek egy példányát. Az osztálynak egyetlen mezője van a WiFi kliens számára. -
Az osztály
public
szekciójához adj hozzá egy metódust a szöveg fordítására:String translateText(String text, String from_language, String to_language) { }
Ez a metódus megkapja a forrásnyelvet és a célnyelvet. Beszéd kezelésekor a beszédet a felhasználói nyelvről a LUIS szerver nyelvére fordítja, válaszadáskor pedig a LUIS szerver nyelvéről a felhasználói nyelvre.
-
Ebben a metódusban adj hozzá kódot egy JSON törzs létrehozásához, amely tartalmazza a fordítandó szöveget és a nyelveket:
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);
-
Ezután adj hozzá kódot a törzs elküldéséhez a szerver nélküli funkciós alkalmazásnak:
HTTPClient httpClient; httpClient.begin(_client, TRANSLATE_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
-
Ezután adj hozzá kódot a válasz lekéréséhez:
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); }
-
Végül adj hozzá kódot a kapcsolat lezárásához és a fordított szöveg visszaadásához:
httpClient.end(); return translated_text;
Feladat - a felismert beszéd és a válaszok fordítása
-
Nyisd meg a
main.cpp
fájlt. -
Adj hozzá egy include direktívát a fájl tetejéhez a
TextTranslator
osztály fejlécfájljához:#include "text_translator.h"
-
Az időzítő beállításakor vagy lejártakor kimondott szöveget le kell fordítani. Ehhez add hozzá a következőt a
say
függvény első soraként:text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Ez lefordítja a szöveget a felhasználó nyelvére.
-
A
processAudio
függvényben a rögzített hangból szöveget nyerünk ki aString text = speechToText.convertSpeechToText();
hívással. E hívás után fordítsd le a szöveget:String text = speechToText.convertSpeechToText(); text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Ez lefordítja a szöveget a felhasználó nyelvéről a szerveren használt nyelvre.
-
Fordítsd le a kódot, töltsd fel a Wio Terminal eszközödre, és teszteld a soros monitoron keresztül. Amint a
Ready
üzenetet látod a soros monitoron, nyomd meg a C gombot (a bal oldali, a bekapcsoló kapcsolóhoz legközelebbi gomb), és beszélj. Győződj meg róla, hogy a funkciós alkalmazásod fut, és kérj időzítőt a felhasználói nyelven, akár saját magad beszélve, akár egy fordító alkalmazás segítségével.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.
💁 Ezt a kódot megtalálod a code/wio-terminal mappában.
😀 A többnyelvű időzítő programod sikeres volt!
Felelősség kizárása:
Ez a dokumentum az AI fordítási szolgáltatás Co-op Translator segítségével lett lefordítva. Bár törekszünk a pontosságra, kérjük, vegye figyelembe, hogy az automatikus fordítások hibákat vagy pontatlanságokat tartalmazhatnak. Az eredeti dokumentum az eredeti nyelvén tekintendő hiteles forrásnak. Fontos információk esetén javasolt professzionális emberi fordítást igénybe venni. Nem vállalunk felelősséget semmilyen félreértésért vagy téves értelmezésért, amely a fordítás használatából eredhet.