17 KiB
Μετάφραση ομιλίας - Εικονική Συσκευή IoT
Σε αυτό το μέρος του μαθήματος, θα γράψετε κώδικα για να μεταφράσετε ομιλία κατά τη μετατροπή της σε κείμενο χρησιμοποιώντας την υπηρεσία ομιλίας, και στη συνέχεια να μεταφράσετε το κείμενο χρησιμοποιώντας την υπηρεσία Μετάφρασης πριν δημιουργήσετε μια απάντηση με ομιλία.
Χρησιμοποιήστε την υπηρεσία ομιλίας για να μεταφράσετε ομιλία
Η υπηρεσία ομιλίας μπορεί να πάρει ομιλία και όχι μόνο να τη μετατρέψει σε κείμενο στην ίδια γλώσσα, αλλά και να μεταφράσει το αποτέλεσμα σε άλλες γλώσσες.
Εργασία - Χρησιμοποιήστε την υπηρεσία ομιλίας για να μεταφράσετε ομιλία
-
Ανοίξτε το έργο
smart-timer
στο VS Code και βεβαιωθείτε ότι το εικονικό περιβάλλον είναι φορτωμένο στο τερματικό. -
Προσθέστε τις παρακάτω δηλώσεις εισαγωγής κάτω από τις υπάρχουσες εισαγωγές:
from azure.cognitiveservices import speech from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer import requests
Αυτό εισάγει κλάσεις που χρησιμοποιούνται για τη μετάφραση ομιλίας, καθώς και τη βιβλιοθήκη
requests
που θα χρησιμοποιηθεί για να γίνει κλήση στην υπηρεσία Μετάφρασης αργότερα σε αυτό το μάθημα. -
Ο έξυπνος χρονοδιακόπτης σας θα έχει 2 καθορισμένες γλώσσες - τη γλώσσα του διακομιστή που χρησιμοποιήθηκε για την εκπαίδευση του LUIS (η ίδια γλώσσα χρησιμοποιείται επίσης για τη δημιουργία των μηνυμάτων που απευθύνονται στον χρήστη) και τη γλώσσα που μιλάει ο χρήστης. Ενημερώστε τη μεταβλητή
language
ώστε να είναι η γλώσσα που θα μιλάει ο χρήστης και προσθέστε μια νέα μεταβλητή που ονομάζεταιserver_language
για τη γλώσσα που χρησιμοποιήθηκε για την εκπαίδευση του LUIS:language = '<user language>' 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 για να πείτε τη μετάφραση στο μικρόφωνό σας.
-
Αντικαταστήστε τις δηλώσεις
recognizer_config
καιrecognizer
με τις εξής:translation_config = SpeechTranslationConfig(subscription=speech_api_key, region=location, speech_recognition_language=language, target_languages=(language, server_language)) recognizer = TranslationRecognizer(translation_config=translation_config)
Αυτό δημιουργεί μια διαμόρφωση μετάφρασης για την αναγνώριση ομιλίας στη γλώσσα του χρήστη και τη δημιουργία μεταφράσεων στη γλώσσα του χρήστη και του διακομιστή. Στη συνέχεια, χρησιμοποιεί αυτή τη διαμόρφωση για να δημιουργήσει έναν αναγνωριστή μετάφρασης - έναν αναγνωριστή ομιλίας που μπορεί να μεταφράσει το αποτέλεσμα της αναγνώρισης ομιλίας σε πολλές γλώσσες.
💁 Η αρχική γλώσσα πρέπει να καθοριστεί στις
target_languages
, διαφορετικά δεν θα λάβετε καμία μετάφραση. -
Ενημερώστε τη συνάρτηση
recognized
, αντικαθιστώντας ολόκληρο το περιεχόμενο της συνάρτησης με τα εξής:if args.result.reason == speech.ResultReason.TranslatedSpeech: language_match = next(l for l in args.result.translations if server_language.lower().startswith(l.lower())) text = args.result.translations[language_match] if (len(text) > 0): print(f'Translated text: {text}') message = Message(json.dumps({ 'speech': text })) device_client.send_message(message)
Αυτός ο κώδικας ελέγχει αν το γεγονός αναγνώρισης ενεργοποιήθηκε επειδή η ομιλία μεταφράστηκε (αυτό το γεγονός μπορεί να ενεργοποιηθεί και σε άλλες περιπτώσεις, όπως όταν η ομιλία αναγνωρίζεται αλλά δεν μεταφράζεται). Αν η ομιλία μεταφράστηκε, βρίσκει τη μετάφραση στο λεξικό
args.result.translations
που αντιστοιχεί στη γλώσσα του διακομιστή.Το λεξικό
args.result.translations
χρησιμοποιεί ως κλειδί το μέρος της γλώσσας από τη ρύθμιση τοπικής γλώσσας, όχι ολόκληρη τη ρύθμιση. Για παράδειγμα, αν ζητήσετε μετάφραση σταfr-FR
για τα Γαλλικά, το λεξικό θα περιέχει μια καταχώρηση γιαfr
, όχι γιαfr-FR
.Το μεταφρασμένο κείμενο στη συνέχεια αποστέλλεται στο IoT Hub.
-
Εκτελέστε αυτόν τον κώδικα για να δοκιμάσετε τις μεταφράσεις. Βεβαιωθείτε ότι η εφαρμογή λειτουργιών σας εκτελείται και ζητήστε έναν χρονοδιακόπτη στη γλώσσα του χρήστη, είτε μιλώντας αυτή τη γλώσσα είτε χρησιμοποιώντας μια εφαρμογή μετάφρασης.
(.venv) ➜ smart-timer python app.py Connecting Connected Translated text: Set a timer of 2 minutes and 27 seconds.
Μετάφραση κειμένου χρησιμοποιώντας την υπηρεσία μετάφρασης
Η υπηρεσία ομιλίας δεν υποστηρίζει τη μετάφραση κειμένου πίσω σε ομιλία. Αντίθετα, μπορείτε να χρησιμοποιήσετε την υπηρεσία Μετάφρασης για να μεταφράσετε το κείμενο. Αυτή η υπηρεσία διαθέτει ένα REST API που μπορείτε να χρησιμοποιήσετε για τη μετάφραση του κειμένου.
Εργασία - Χρησιμοποιήστε τον πόρο μετάφρασης για να μεταφράσετε κείμενο
-
Προσθέστε το κλειδί API της υπηρεσίας μετάφρασης κάτω από το
speech_api_key
:translator_api_key = '<key>'
Αντικαταστήστε το
<key>
με το κλειδί API για τον πόρο της υπηρεσίας μετάφρασής σας. -
Πάνω από τη συνάρτηση
say
, ορίστε μια συνάρτησηtranslate_text
που θα μεταφράζει κείμενο από τη γλώσσα του διακομιστή στη γλώσσα του χρήστη:def translate_text(text):
-
Μέσα σε αυτή τη συνάρτηση, ορίστε το URL και τις κεφαλίδες για την κλήση του REST API:
url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0' headers = { 'Ocp-Apim-Subscription-Key': translator_api_key, 'Ocp-Apim-Subscription-Region': location, 'Content-type': 'application/json' }
Το URL για αυτό το API δεν είναι συγκεκριμένο για την τοποθεσία, αντίθετα η τοποθεσία περνάει ως κεφαλίδα. Το κλειδί API χρησιμοποιείται απευθείας, οπότε σε αντίθεση με την υπηρεσία ομιλίας, δεν υπάρχει ανάγκη να ληφθεί διακριτικό πρόσβασης από το API έκδοσης διακριτικών.
-
Κάτω από αυτό, ορίστε τις παραμέτρους και το σώμα για την κλήση:
params = { 'from': server_language, 'to': language } body = [{ 'text' : text }]
Το
params
ορίζει τις παραμέτρους που θα περαστούν στην κλήση του API, περνώντας τις γλώσσεςfrom
καιto
. Αυτή η κλήση θα μεταφράσει κείμενο από τη γλώσσαfrom
στη γλώσσαto
.Το
body
περιέχει το κείμενο που θα μεταφραστεί. Αυτό είναι ένας πίνακας, καθώς πολλαπλά μπλοκ κειμένου μπορούν να μεταφραστούν στην ίδια κλήση. -
Κάντε την κλήση στο REST API και λάβετε την απάντηση:
response = requests.post(url, headers=headers, params=params, json=body)
Η απάντηση που επιστρέφεται είναι ένας πίνακας JSON, με ένα στοιχείο που περιέχει τις μεταφράσεις. Αυτό το στοιχείο έχει έναν πίνακα για τις μεταφράσεις όλων των στοιχείων που περάστηκαν στο σώμα.
[ { "translations": [ { "text": "Chronométrant votre minuterie de 2 minutes 27 secondes.", "to": "fr" } ] } ]
-
Επιστρέψτε την ιδιότητα
text
από την πρώτη μετάφραση του πρώτου στοιχείου στον πίνακα:return response.json()[0]['translations'][0]['text']
-
Ενημερώστε τη συνάρτηση
say
για να μεταφράσει το κείμενο που θα ειπωθεί πριν δημιουργηθεί το SSML:print('Original:', text) text = translate_text(text) print('Translated:', text)
Αυτός ο κώδικας εκτυπώνει επίσης την αρχική και τη μεταφρασμένη έκδοση του κειμένου στην κονσόλα.
-
Εκτελέστε τον κώδικά σας. Βεβαιωθείτε ότι η εφαρμογή λειτουργιών σας εκτελείται και ζητήστε έναν χρονοδιακόπτη στη γλώσσα του χρήστη, είτε μιλώντας αυτή τη γλώσσα είτε χρησιμοποιώντας μια εφαρμογή μετάφρασης.
(.venv) ➜ smart-timer python app.py Connecting Connected Translated text: Set a timer of 2 minutes and 27 seconds. Original: 2 minute 27 second timer started. Translated: 2 minute 27 seconde minute a commencé. Original: Times up on your 2 minute 27 second timer. Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.
💁 Λόγω των διαφορετικών τρόπων έκφρασης σε διαφορετικές γλώσσες, μπορεί να λάβετε μεταφράσεις που διαφέρουν ελαφρώς από τα παραδείγματα που δώσατε στο LUIS. Αν συμβεί αυτό, προσθέστε περισσότερα παραδείγματα στο LUIS, επανεκπαιδεύστε και δημοσιεύστε ξανά το μοντέλο.
💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο code/virtual-iot-device.
😀 Το πολυγλωσσικό πρόγραμμα χρονοδιακόπτη σας ήταν επιτυχία!
Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.