# Μετάφραση ομιλίας - Εικονική Συσκευή IoT Σε αυτό το μέρος του μαθήματος, θα γράψετε κώδικα για να μεταφράσετε ομιλία κατά τη μετατροπή της σε κείμενο χρησιμοποιώντας την υπηρεσία ομιλίας, και στη συνέχεια να μεταφράσετε το κείμενο χρησιμοποιώντας την υπηρεσία Μετάφρασης πριν δημιουργήσετε μια απάντηση με ομιλία. ## Χρησιμοποιήστε την υπηρεσία ομιλίας για να μεταφράσετε ομιλία Η υπηρεσία ομιλίας μπορεί να πάρει ομιλία και όχι μόνο να τη μετατρέψει σε κείμενο στην ίδια γλώσσα, αλλά και να μεταφράσει το αποτέλεσμα σε άλλες γλώσσες. ### Εργασία - Χρησιμοποιήστε την υπηρεσία ομιλίας για να μεταφράσετε ομιλία 1. Ανοίξτε το έργο `smart-timer` στο VS Code και βεβαιωθείτε ότι το εικονικό περιβάλλον είναι φορτωμένο στο τερματικό. 1. Προσθέστε τις παρακάτω δηλώσεις εισαγωγής κάτω από τις υπάρχουσες εισαγωγές: ```python from azure.cognitiveservices import speech from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer import requests ``` Αυτό εισάγει κλάσεις που χρησιμοποιούνται για τη μετάφραση ομιλίας, καθώς και τη βιβλιοθήκη `requests` που θα χρησιμοποιηθεί για να γίνει κλήση στην υπηρεσία Μετάφρασης αργότερα σε αυτό το μάθημα. 1. Ο έξυπνος χρονοδιακόπτης σας θα έχει 2 καθορισμένες γλώσσες - τη γλώσσα του διακομιστή που χρησιμοποιήθηκε για την εκπαίδευση του LUIS (η ίδια γλώσσα χρησιμοποιείται επίσης για τη δημιουργία των μηνυμάτων που απευθύνονται στον χρήστη) και τη γλώσσα που μιλάει ο χρήστης. Ενημερώστε τη μεταβλητή `language` ώστε να είναι η γλώσσα που θα μιλάει ο χρήστης και προσθέστε μια νέα μεταβλητή που ονομάζεται `server_language` για τη γλώσσα που χρησιμοποιήθηκε για την εκπαίδευση του LUIS: ```python language = '' server_language = '' ``` Αντικαταστήστε το `` με το όνομα τοπικής ρύθμισης για τη γλώσσα που θα μιλάτε, για παράδειγμα `fr-FR` για τα Γαλλικά ή `zn-HK` για τα Καντονέζικα. Αντικαταστήστε το `` με το όνομα τοπικής ρύθμισης για τη γλώσσα που χρησιμοποιήθηκε για την εκπαίδευση του LUIS. Μπορείτε να βρείτε μια λίστα με τις υποστηριζόμενες γλώσσες και τα ονόματα τοπικών ρυθμίσεων τους στην [τεκμηρίωση υποστήριξης γλωσσών και φωνών στο Microsoft docs](https://docs.microsoft.com/azure/cognitive-services/speech-service/language-support?WT.mc_id=academic-17441-jabenn#speech-to-text). > 💁 Αν δεν μιλάτε πολλές γλώσσες, μπορείτε να χρησιμοποιήσετε μια υπηρεσία όπως το [Bing Translate](https://www.bing.com/translator) ή το [Google Translate](https://translate.google.com) για να μεταφράσετε από την προτιμώμενη γλώσσα σας σε μια γλώσσα της επιλογής σας. Αυτές οι υπηρεσίες μπορούν στη συνέχεια να αναπαράγουν ήχο του μεταφρασμένου κειμένου. Να έχετε υπόψη ότι ο αναγνωριστής ομιλίας μπορεί να αγνοήσει ορισμένες εξόδους ήχου από τη συσκευή σας, οπότε ίσως χρειαστεί να χρησιμοποιήσετε μια επιπλέον συσκευή για να αναπαράγετε το μεταφρασμένο κείμενο. > > Για παράδειγμα, αν εκπαιδεύσετε το LUIS στα Αγγλικά, αλλά θέλετε να χρησιμοποιήσετε τα Γαλλικά ως γλώσσα χρήστη, μπορείτε να μεταφράσετε προτάσεις όπως "set a 2 minute and 27 second timer" από τα Αγγλικά στα Γαλλικά χρησιμοποιώντας το Bing Translate και στη συνέχεια να χρησιμοποιήσετε το κουμπί **Listen translation** για να πείτε τη μετάφραση στο μικρόφωνό σας. > > ![Το κουμπί ακρόασης μετάφρασης στο Bing Translate](../../../../../translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.el.png) 1. Αντικαταστήστε τις δηλώσεις `recognizer_config` και `recognizer` με τις εξής: ```python 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`, διαφορετικά δεν θα λάβετε καμία μετάφραση. 1. Ενημερώστε τη συνάρτηση `recognized`, αντικαθιστώντας ολόκληρο το περιεχόμενο της συνάρτησης με τα εξής: ```python 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. 1. Εκτελέστε αυτόν τον κώδικα για να δοκιμάσετε τις μεταφράσεις. Βεβαιωθείτε ότι η εφαρμογή λειτουργιών σας εκτελείται και ζητήστε έναν χρονοδιακόπτη στη γλώσσα του χρήστη, είτε μιλώντας αυτή τη γλώσσα είτε χρησιμοποιώντας μια εφαρμογή μετάφρασης. ```output (.venv) ➜ smart-timer python app.py Connecting Connected Translated text: Set a timer of 2 minutes and 27 seconds. ``` ## Μετάφραση κειμένου χρησιμοποιώντας την υπηρεσία μετάφρασης Η υπηρεσία ομιλίας δεν υποστηρίζει τη μετάφραση κειμένου πίσω σε ομιλία. Αντίθετα, μπορείτε να χρησιμοποιήσετε την υπηρεσία Μετάφρασης για να μεταφράσετε το κείμενο. Αυτή η υπηρεσία διαθέτει ένα REST API που μπορείτε να χρησιμοποιήσετε για τη μετάφραση του κειμένου. ### Εργασία - Χρησιμοποιήστε τον πόρο μετάφρασης για να μεταφράσετε κείμενο 1. Προσθέστε το κλειδί API της υπηρεσίας μετάφρασης κάτω από το `speech_api_key`: ```python translator_api_key = '' ``` Αντικαταστήστε το `` με το κλειδί API για τον πόρο της υπηρεσίας μετάφρασής σας. 1. Πάνω από τη συνάρτηση `say`, ορίστε μια συνάρτηση `translate_text` που θα μεταφράζει κείμενο από τη γλώσσα του διακομιστή στη γλώσσα του χρήστη: ```python def translate_text(text): ``` 1. Μέσα σε αυτή τη συνάρτηση, ορίστε το URL και τις κεφαλίδες για την κλήση του REST API: ```python 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 έκδοσης διακριτικών. 1. Κάτω από αυτό, ορίστε τις παραμέτρους και το σώμα για την κλήση: ```python params = { 'from': server_language, 'to': language } body = [{ 'text' : text }] ``` Το `params` ορίζει τις παραμέτρους που θα περαστούν στην κλήση του API, περνώντας τις γλώσσες `from` και `to`. Αυτή η κλήση θα μεταφράσει κείμενο από τη γλώσσα `from` στη γλώσσα `to`. Το `body` περιέχει το κείμενο που θα μεταφραστεί. Αυτό είναι ένας πίνακας, καθώς πολλαπλά μπλοκ κειμένου μπορούν να μεταφραστούν στην ίδια κλήση. 1. Κάντε την κλήση στο REST API και λάβετε την απάντηση: ```python response = requests.post(url, headers=headers, params=params, json=body) ``` Η απάντηση που επιστρέφεται είναι ένας πίνακας JSON, με ένα στοιχείο που περιέχει τις μεταφράσεις. Αυτό το στοιχείο έχει έναν πίνακα για τις μεταφράσεις όλων των στοιχείων που περάστηκαν στο σώμα. ```json [ { "translations": [ { "text": "Chronométrant votre minuterie de 2 minutes 27 secondes.", "to": "fr" } ] } ] ``` 1. Επιστρέψτε την ιδιότητα `text` από την πρώτη μετάφραση του πρώτου στοιχείου στον πίνακα: ```python return response.json()[0]['translations'][0]['text'] ``` 1. Ενημερώστε τη συνάρτηση `say` για να μεταφράσει το κείμενο που θα ειπωθεί πριν δημιουργηθεί το SSML: ```python print('Original:', text) text = translate_text(text) print('Translated:', text) ``` Αυτός ο κώδικας εκτυπώνει επίσης την αρχική και τη μεταφρασμένη έκδοση του κειμένου στην κονσόλα. 1. Εκτελέστε τον κώδικά σας. Βεβαιωθείτε ότι η εφαρμογή λειτουργιών σας εκτελείται και ζητήστε έναν χρονοδιακόπτη στη γλώσσα του χρήστη, είτε μιλώντας αυτή τη γλώσσα είτε χρησιμοποιώντας μια εφαρμογή μετάφρασης. ```output (.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](../../../../../6-consumer/lessons/4-multiple-language-support/code/virtual-iot-device). 😀 Το πολυγλωσσικό πρόγραμμα χρονοδιακόπτη σας ήταν επιτυχία! --- **Αποποίηση ευθύνης**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.