18 KiB
Μετάφραση ομιλίας - Wio Terminal
Σε αυτό το μέρος του μαθήματος, θα γράψετε κώδικα για τη μετάφραση κειμένου χρησιμοποιώντας την υπηρεσία μεταφραστή.
Μετατροπή κειμένου σε ομιλία χρησιμοποιώντας την υπηρεσία μεταφραστή
Το REST API της υπηρεσίας ομιλίας δεν υποστηρίζει άμεσες μεταφράσεις. Αντίθετα, μπορείτε να χρησιμοποιήσετε την υπηρεσία Translator για να μεταφράσετε το κείμενο που παράγεται από την υπηρεσία μετατροπής ομιλίας σε κείμενο, καθώς και το κείμενο της απάντησης που εκφωνείται. Αυτή η υπηρεσία διαθέτει REST API που μπορείτε να χρησιμοποιήσετε για τη μετάφραση του κειμένου, αλλά για να διευκολυνθεί η χρήση της, θα ενσωματωθεί σε ένα άλλο HTTP trigger στην εφαρμογή functions σας.
Εργασία - δημιουργία serverless function για τη μετάφραση κειμένου
-
Ανοίξτε το έργο
smart-timer-trigger
στο VS Code και ανοίξτε το τερματικό, διασφαλίζοντας ότι το εικονικό περιβάλλον είναι ενεργοποιημένο. Αν όχι, τερματίστε και δημιουργήστε ξανά το τερματικό. -
Ανοίξτε το αρχείο
local.settings.json
και προσθέστε ρυθμίσεις για το κλειδί API και την τοποθεσία της υπηρεσίας μεταφραστή:"TRANSLATOR_KEY": "<key>", "TRANSLATOR_LOCATION": "<location>"
Αντικαταστήστε το
<key>
με το API key για τον πόρο της υπηρεσίας μεταφραστή. Αντικαταστήστε το<location>
με την τοποθεσία που χρησιμοποιήσατε κατά τη δημιουργία του πόρου της υπηρεσίας μεταφραστή. -
Προσθέστε ένα νέο HTTP trigger σε αυτήν την εφαρμογή με το όνομα
translate-text
χρησιμοποιώντας την παρακάτω εντολή από το τερματικό του VS Code στον ριζικό φάκελο του έργου functions app:func new --name translate-text --template "HTTP trigger"
Αυτό θα δημιουργήσει ένα HTTP trigger με το όνομα
translate-text
. -
Αντικαταστήστε το περιεχόμενο του αρχείου
__init__.py
στον φάκελοtranslate-text
με το εξής: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'])
Αυτός ο κώδικας εξάγει το κείμενο και τις γλώσσες από το HTTP αίτημα. Στη συνέχεια, κάνει ένα αίτημα στο REST API του μεταφραστή, περνώντας τις γλώσσες ως παραμέτρους για το URL και το κείμενο προς μετάφραση ως σώμα. Τέλος, επιστρέφεται η μετάφραση.
-
Εκτελέστε την εφαρμογή functions τοπικά. Στη συνέχεια, μπορείτε να την καλέσετε χρησιμοποιώντας ένα εργαλείο όπως το curl με τον ίδιο τρόπο που δοκιμάσατε το HTTP trigger
text-to-timer
. Βεβαιωθείτε ότι περνάτε το κείμενο προς μετάφραση και τις γλώσσες ως JSON σώμα:{ "text": "Définir une minuterie de 30 secondes", "from_language": "fr-FR", "to_language": "en-US" }
Αυτό το παράδειγμα μεταφράζει το Définir une minuterie de 30 secondes από τα Γαλλικά στα Αγγλικά (ΗΠΑ). Θα επιστρέψει Set a 30-second timer.
💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο code/functions.
Εργασία - χρήση της λειτουργίας μεταφραστή για τη μετάφραση κειμένου
-
Ανοίξτε το έργο
smart-timer
στο VS Code αν δεν είναι ήδη ανοιχτό. -
Ο έξυπνος χρονοδιακόπτης σας θα έχει 2 γλώσσες ορισμένες - τη γλώσσα του διακομιστή που χρησιμοποιήθηκε για την εκπαίδευση του LUIS (η ίδια γλώσσα χρησιμοποιείται επίσης για τη δημιουργία των μηνυμάτων που εκφωνούνται στον χρήστη) και τη γλώσσα που μιλά ο χρήστης. Ενημερώστε τη σταθερά
LANGUAGE
στο αρχείο κεφαλίδαςconfig.h
ώστε να είναι η γλώσσα που θα μιλά ο χρήστης και προσθέστε μια νέα σταθερά με το όνομαSERVER_LANGUAGE
για τη γλώσσα που χρησιμοποιήθηκε για την εκπαίδευση του LUIS:const char *LANGUAGE = "<user language>"; const char *SERVER_LANGUAGE = "<server language>";
Αντικαταστήστε το
<user language>
με το όνομα τοπικής ρύθμισης για τη γλώσσα που θα μιλάτε, για παράδειγμαfr-FR
για τα Γαλλικά ήzn-HK
για τα Καντονέζικα.Αντικαταστήστε το
<server language>
με το όνομα τοπικής ρύθμισης για τη γλώσσα που χρησιμοποιήθηκε για την εκπαίδευση του LUIS.Μπορείτε να βρείτε μια λίστα με τις υποστηριζόμενες γλώσσες και τα ονόματα τοπικών ρυθμίσεων στην τεκμηρίωση υποστήριξης γλωσσών και φωνών στο Microsoft docs.
💁 Αν δεν μιλάτε πολλές γλώσσες, μπορείτε να χρησιμοποιήσετε μια υπηρεσία όπως το Bing Translate ή το Google Translate για να μεταφράσετε από την προτιμώμενη γλώσσα σας σε μια γλώσσα της επιλογής σας. Αυτές οι υπηρεσίες μπορούν στη συνέχεια να αναπαράγουν ήχο του μεταφρασμένου κειμένου.
Για παράδειγμα, αν εκπαιδεύσετε το LUIS στα Αγγλικά, αλλά θέλετε να χρησιμοποιήσετε τα Γαλλικά ως γλώσσα χρήστη, μπορείτε να μεταφράσετε προτάσεις όπως "set a 2 minute and 27 second timer" από τα Αγγλικά στα Γαλλικά χρησιμοποιώντας το Bing Translate και στη συνέχεια να χρησιμοποιήσετε το κουμπί Listen translation για να εκφωνήσετε τη μετάφραση στο μικρόφωνό σας.
-
Προσθέστε το API key και την τοποθεσία του μεταφραστή κάτω από το
SPEECH_LOCATION
:const char *TRANSLATOR_API_KEY = "<KEY>"; const char *TRANSLATOR_LOCATION = "<LOCATION>";
Αντικαταστήστε το
<KEY>
με το API key για τον πόρο της υπηρεσίας μεταφραστή. Αντικαταστήστε το<LOCATION>
με την τοποθεσία που χρησιμοποιήσατε κατά τη δημιουργία του πόρου της υπηρεσίας μεταφραστή. -
Προσθέστε το URL του trigger του μεταφραστή κάτω από το
VOICE_URL
:const char *TRANSLATE_FUNCTION_URL = "<URL>";
Αντικαταστήστε το
<URL>
με το URL για το HTTP triggertranslate-text
στην εφαρμογή functions σας. Αυτό θα είναι το ίδιο με την τιμή για τοTEXT_TO_TIMER_FUNCTION_URL
, εκτός από το ότι το όνομα της λειτουργίας θα είναιtranslate-text
αντί γιαtext-to-timer
. -
Προσθέστε ένα νέο αρχείο στον φάκελο
src
με το όνομαtext_translator.h
. -
Αυτό το νέο αρχείο κεφαλίδας
text_translator.h
θα περιέχει μια κλάση για τη μετάφραση κειμένου. Προσθέστε τα παρακάτω σε αυτό το αρχείο για να δηλώσετε αυτήν την κλάση:#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;
Αυτό δηλώνει την κλάση
TextTranslator
, μαζί με ένα στιγμιότυπο αυτής της κλάσης. Η κλάση έχει ένα μόνο πεδίο για τον WiFi client. -
Στην ενότητα
public
αυτής της κλάσης, προσθέστε μια μέθοδο για τη μετάφραση κειμένου:String translateText(String text, String from_language, String to_language) { }
Αυτή η μέθοδος λαμβάνει τη γλώσσα από την οποία θα γίνει η μετάφραση και τη γλώσσα στην οποία θα γίνει η μετάφραση. Όταν γίνεται επεξεργασία ομιλίας, η ομιλία θα μεταφράζεται από τη γλώσσα του χρήστη στη γλώσσα του διακομιστή LUIS, και όταν δίνονται απαντήσεις, θα μεταφράζεται από τη γλώσσα του διακομιστή LUIS στη γλώσσα του χρήστη.
-
Σε αυτήν τη μέθοδο, προσθέστε κώδικα για τη δημιουργία ενός JSON σώματος που περιέχει το κείμενο προς μετάφραση και τις γλώσσες:
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);
-
Παρακάτω, προσθέστε τον παρακάτω κώδικα για να στείλετε το σώμα στην εφαρμογή functions:
HTTPClient httpClient; httpClient.begin(_client, TRANSLATE_FUNCTION_URL); int httpResponseCode = httpClient.POST(body);
-
Στη συνέχεια, προσθέστε κώδικα για να λάβετε την απάντηση:
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); }
-
Τέλος, προσθέστε κώδικα για να κλείσετε τη σύνδεση και να επιστρέψετε το μεταφρασμένο κείμενο:
httpClient.end(); return translated_text;
Εργασία - μετάφραση της αναγνωρισμένης ομιλίας και των απαντήσεων
-
Ανοίξτε το αρχείο
main.cpp
. -
Προσθέστε μια οδηγία include στην κορυφή του αρχείου για το αρχείο κεφαλίδας της κλάσης
TextTranslator
:#include "text_translator.h"
-
Το κείμενο που λέγεται όταν ρυθμίζεται ή λήγει ένας χρονοδιακόπτης πρέπει να μεταφραστεί. Για να το κάνετε αυτό, προσθέστε το παρακάτω ως την πρώτη γραμμή της συνάρτησης
say
:text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Αυτό θα μεταφράσει το κείμενο στη γλώσσα του χρήστη.
-
Στη συνάρτηση
processAudio
, το κείμενο λαμβάνεται από τον καταγεγραμμένο ήχο με την κλήσηString text = speechToText.convertSpeechToText();
. Μετά από αυτήν την κλήση, μεταφράστε το κείμενο:String text = speechToText.convertSpeechToText(); text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
Αυτό θα μεταφράσει το κείμενο από τη γλώσσα του χρήστη στη γλώσσα που χρησιμοποιείται στον διακομιστή.
-
Δημιουργήστε αυτόν τον κώδικα, ανεβάστε τον στο Wio Terminal σας και δοκιμάστε τον μέσω του σειριακού παρακολουθητή. Μόλις δείτε το
Ready
στον σειριακό παρακολουθητή, πατήστε το κουμπί C (το αριστερό κουμπί, πιο κοντά στον διακόπτη τροφοδοσίας) και μιλήστε. Βεβαιωθείτε ότι η εφαρμογή functions εκτελείται και ζητήστε έναν χρονοδιακόπτη στη γλώσσα του χρήστη, είτε μιλώντας αυτήν τη γλώσσα είτε χρησιμοποιώντας μια εφαρμογή μετάφρασης.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.
💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο code/wio-terminal.
😀 Το πολυγλωσσικό πρόγραμμα χρονοδιακόπτη σας ήταν επιτυχές!
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.