# Μετάφραση ομιλίας - Raspberry Pi Σε αυτό το μέρος του μαθήματος, θα γράψετε κώδικα για να μεταφράσετε κείμενο χρησιμοποιώντας την υπηρεσία μεταφραστή. ## Μετατροπή κειμένου σε ομιλία χρησιμοποιώντας την υπηρεσία μεταφραστή Το REST API της υπηρεσίας ομιλίας δεν υποστηρίζει άμεσες μεταφράσεις. Αντίθετα, μπορείτε να χρησιμοποιήσετε την υπηρεσία Translator για να μεταφράσετε το κείμενο που δημιουργείται από την υπηρεσία μετατροπής ομιλίας σε κείμενο, καθώς και το κείμενο της απάντησης που θα ακουστεί. Αυτή η υπηρεσία διαθέτει REST API που μπορείτε να χρησιμοποιήσετε για να μεταφράσετε το κείμενο. ### Εργασία - χρήση του πόρου μεταφραστή για μετάφραση κειμένου 1. Ο έξυπνος χρονοδιακόπτης σας θα έχει ρυθμιστεί σε 2 γλώσσες - τη γλώσσα του διακομιστή που χρησιμοποιήθηκε για την εκπαίδευση του LUIS (η ίδια γλώσσα χρησιμοποιείται επίσης για τη δημιουργία των μηνυμάτων που θα μιλήσουν στον χρήστη) και τη γλώσσα που μιλά ο χρήστης. Ενημερώστε τη μεταβλητή `language` ώστε να είναι η γλώσσα που θα μιλήσει ο χρήστης και προσθέστε μια νέα μεταβλητή που ονομάζεται `server_language` για τη γλώσσα που χρησιμοποιήθηκε για την εκπαίδευση του LUIS: ```python language = '' server_language = '' ``` Αντικαταστήστε το `` με το όνομα τοπικής ρύθμισης για τη γλώσσα που θα μιλήσετε, για παράδειγμα `fr-FR` για τα Γαλλικά ή `zn-HK` για τα Καντονέζικα. Αντικαταστήστε το `` με το όνομα τοπικής ρύθμισης για τη γλώσσα που χρησιμοποιήθηκε για την εκπαίδευση του LUIS. Μπορείτε να βρείτε μια λίστα με τις υποστηριζόμενες γλώσσες και τα ονόματα τοπικών ρυθμίσεών τους στην [τεκμηρίωση υποστήριξης γλωσσών και φωνών στη Microsoft](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** για να μιλήσετε τη μετάφραση στο μικρόφωνό σας. > > ![Το κουμπί listen translation στο Bing Translate](../../../../../translated_images/bing-translate.348aa796d6efe2a92f41ea74a5cf42bb4c63d6faaa08e7f46924e072a35daa48.el.png) 1. Προσθέστε το κλειδί API του μεταφραστή κάτω από το `speech_api_key`: ```python translator_api_key = '' ``` Αντικαταστήστε το `` με το κλειδί API για τον πόρο της υπηρεσίας μεταφραστή σας. 1. Πάνω από τη συνάρτηση `say`, ορίστε μια συνάρτηση `translate_text` που θα μεταφράζει κείμενο από τη γλώσσα του διακομιστή στη γλώσσα του χρήστη: ```python def translate_text(text, from_language, to_language): ``` Οι γλώσσες `from` και `to` περνούν σε αυτή τη συνάρτηση - η εφαρμογή σας πρέπει να μετατρέπει από τη γλώσσα του χρήστη στη γλώσσα του διακομιστή όταν αναγνωρίζει ομιλία και από τη γλώσσα του διακομιστή στη γλώσσα του χρήστη όταν παρέχει προφορική ανατροφοδότηση. 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': from_language, 'to': 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": "Set a 2 minute 27 second timer.", "to": "en" } ] } ] ``` 1. Επιστρέψτε την ιδιότητα `test` από την πρώτη μετάφραση του πρώτου στοιχείου στον πίνακα: ```python return response.json()[0]['translations'][0]['text'] ``` 1. Ενημερώστε τον βρόχο `while True` για να μεταφράσει το κείμενο από την κλήση `convert_speech_to_text` από τη γλώσσα του χρήστη στη γλώσσα του διακομιστή: ```python if len(text) > 0: print('Original:', text) text = translate_text(text, language, server_language) print('Translated:', text) message = Message(json.dumps({ 'speech': text })) device_client.send_message(message) ``` Αυτός ο κώδικας εκτυπώνει επίσης τις αρχικές και μεταφρασμένες εκδόσεις του κειμένου στην κονσόλα. 1. Ενημερώστε τη συνάρτηση `say` για να μεταφράσει το κείμενο που θα ειπωθεί από τη γλώσσα του διακομιστή στη γλώσσα του χρήστη: ```python def say(text): print('Original:', text) text = translate_text(text, server_language, language) print('Translated:', text) speech = get_speech(text) play_speech(speech) ``` Αυτός ο κώδικας εκτυπώνει επίσης τις αρχικές και μεταφρασμένες εκδόσεις του κειμένου στην κονσόλα. 1. Εκτελέστε τον κώδικά σας. Βεβαιωθείτε ότι η εφαρμογή λειτουργιών σας εκτελείται και ζητήστε έναν χρονοδιακόπτη στη γλώσσα του χρήστη, είτε μιλώντας αυτή τη γλώσσα είτε χρησιμοποιώντας μια εφαρμογή μετάφρασης. ```output pi@raspberrypi:~/smart-timer $ python3 app.py Connecting Connected Using voice fr-FR-DeniseNeural Original: Définir une minuterie de 2 minutes et 27 secondes. Translated: 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/pi](../../../../../6-consumer/lessons/4-multiple-language-support/code/pi). 😀 Το πολυγλωσσικό πρόγραμμα χρονοδιακόπτη σας ήταν επιτυχία! --- **Αποποίηση ευθύνης**: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης [Co-op Translator](https://github.com/Azure/co-op-translator). Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτόματες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.