Μονάδα αναγνώρισης φωνής Arduino. Φωνητικός έλεγχος του Arduino με χρήση επεξεργασίας και Google Speech API

Σε αυτό το έργο, συνδύασα έναν ανιχνευτή ανίχνευσης προσώπου και ένα σύστημα παρακολούθησης.

Εν συντομία, η ουσία του έργου: μια κάμερα web που είναι εγκατεστημένη σε έναν περιστρεφόμενο μηχανισμό συνδέεται με έναν υπολογιστή με λειτουργικό σύστημα Windows και με εγκατεστημένο λογισμικό OpenCV. Εάν το πρόγραμμα εντοπίσει ένα πρόσωπο στο οπτικό πεδίο της κάμερας web, υπολογίζεται το κέντρο του προσώπου. Οι συντεταγμένες X και Y αποστέλλονται στον ελεγκτή Arduino, ο οποίος συνδέεται με τον υπολογιστή μέσω USB. Με τη σειρά του, ο ελεγκτής Arduino, με βάση τις λαμβανόμενες εντολές, ελέγχει δύο σερβοκινητήρες: κατά μήκος της συντεταγμένης Χ και κατά μήκος της συντεταγμένης Υ, δηλ. παρέχεται σύστημα παρακολούθησης.

Μπορείτε να κατεβάσετε τη βιβλιοθήκη OpenCV (Open Source Computer Vision Library). Η βιβλιοθήκη είναι πολλαπλών πλατφορμών και υπάρχει προς το παρόν για τα ακόλουθα λειτουργικά συστήματα: Windows, Linux, Android, Mac OS ακόμα και iOS. Η βιβλιοθήκη παρέχει επεξεργασία εικόνας σε πραγματικό χρόνο. Γραμμένο σε C/C++.

Οτι. Αυτό το έργο είναι ένα μείγμα μαλακών και σκληρών λύσεων. Η επεξεργασία της εικόνας γίνεται σε υπολογιστή και ο σερβομηχανισμός ελέγχεται χρησιμοποιώντας έναν ελεγκτή.

Λοιπόν αυτό που χρησιμοποίησα για το έργο:

Λογισμικό:

Σίδερο:

υπολογιστή με Windows 7 SP1

Arduino Uno ή συμβατό + PSU

2 σερβομηχανήματα

USB κάμερα web

Λοιπόν πάμε.

Βήμα 1: Εγκαταστήστε το λογισμικό

1) Εάν διαθέτετε λειτουργικό σύστημα Windows, κάντε λήψη του αρχείου OpenCV-2.3.1-win-superpack.exe (ή νεότερης έκδοσης) και εγκαταστήστε τη βιβλιοθήκη.

2) Κάντε λήψη και εγκατάσταση του Microsoft Visual C++ 2010 Express. Εάν έχετε μια έκδοση 64-bit των Windows, θα χρειαστεί επίσης να κάνετε λήψη του SDK των Windows (αλλά για την έκδοση 64 ενδέχεται να υπάρχουν προβλήματα. Δεν μπόρεσα να βάλω το OpenCV να λειτουργήσει στα Windows 7 x64).

Διαβάστε τη διαδικασία ρύθμισης του OpenCV για Visual C++ στον επίσημο ιστότοπο.

Βήμα 2. Τοποθέτηση της κάμερας και των σερβομηχανισμών

Δεν έκανα το σχέδιο «ανθεκτικό», γιατί μετά την επίτευξη του τελικού στόχου, αποσυναρμολογώ τα πάντα για το επόμενο έργο.

Τοποθέτησα τη διαδικτυακή κάμερα στον σερβοκινητήρα του άξονα Χ και αυτός, με τη σειρά του, τον προσάρτησα στον σερβοκινητήρα του άξονα Υ Και ασφάλισα ολόκληρη αυτή τη δομή σε έναν σφιγκτήρα "τρίτου χεριού".

Βήμα 3: Σύνδεση

Σύνδεση σερβοκινητήρων:

Ο κίτρινος πείρος από τον σερβοκεντρικό άξονα X συνδέεται στον ακροδέκτη 9 του ελεγκτή Arduino

Η κίτρινη ακίδα από τον σερβοκεντρικό άξονα Υ συνδέεται με την ακίδα 10 του ελεγκτή Arduino

Κόκκινη ακίδα Vcc από το servo συνδέεται με πείρο 5V

Η μαύρη ακίδα GND από τον σερβομηχανισμό συνδέεται με την ακίδα GND του ελεγκτή Arduino

Σύνδεση webcam:

Η κάμερα web συνδέεται με τον υπολογιστή μέσω διασύνδεσης USB. Το πρόγραμμα C++ αναγνωρίζει την κάμερα web από τον αριθμό της θύρας USB. Ίσως χρειαστεί να καθορίσετε τη θύρα στο πρόγραμμα.

Σύνδεση του ελεγκτή Arduino UNO:

Ο ελεγκτής συνδέεται επίσης με τον υπολογιστή μέσω διασύνδεσης USB. Στο σύστημα εμφανίζεται μια εικονική θύρα COM, η οποία πρέπει να προστεθεί στον κώδικα του προγράμματος στη C++.

Λήψη αρχείων έργου

Πρωτότυπο άρθρο στα αγγλικά (μετάφραση A.V. Koltykov για τον ιστότοπο cxem.net)

Κάπως μου ήρθε η ιδέα να κάνω τον φωνητικό έλεγχο του Arduino, αλλά το Arduino από μόνο του δεν αρκεί, γιατί... Για ένα σύστημα έξυπνου σπιτιού, πρέπει επίσης να επικοινωνείτε με τον υπολογιστή και τα συστήματά του.

Εύρεση λύσης:

BitVoicer
Συνάντησα διάφορα άρθρα που χρησιμοποιούν το BitVoicer σε συνδυασμό με το Arduino, αλλά το πρόβλημα είναι ότι το BitVoicer λειτουργεί μόνο σε Windows και αυτό δεν επιτρέπει στο σύστημα να χρησιμοποιηθεί σε απλές συσκευές όπως το Rasberry Pi που εκτελούν Unix.
Αναγνώριση φωνής Arduino
Το Arduino μπορεί επίσης να ελεγχθεί με φωνή χάρη στη μονάδα αναγνώρισης φωνής, αλλά μέχρι στιγμής δεν έχω τη χαρά να το αγοράσω και υπάρχουν πολλές ταλαιπωρίες κατά τη χρήση αυτής της μονάδας: περιορισμένος αριθμός εντολών, κουραστική εκπαίδευση, απαιτούνται νέες εντολές αναβοσβήνει τη μονάδα, η οποία είναι ήδη ένα μείον εάν το σύστημα διορθωθεί και εγκατασταθεί.

Λύση

Άρχισα να ψάχνω για μια λύση cross-platform που θα επέτρεπε στο σύστημα να λειτουργεί σε πολλά λειτουργικά συστήματα. Βρήκε αυτό: Βιβλιοθήκη ομιλίας σε κείμενο για Java/επεξεργασία. Το σύμπλεγμα υλοποιείται με βάση τη γλώσσα Επεξεργασία (Java)Και Google Speach APIΗ γάτα έχει ήδη γραφτεί στο παρελθόν. Αυτή η λύση σάς επιτρέπει να παρακολουθείτε τη φωνή σε πραγματικό χρόνο enableAutoRecord(), υποδείξτε το όριο έντασης enableAutoThreshold(), συνδέστε εξωτερικά μικρόφωνα getLineIn(), καθορίστε τη γλώσσα αναγνώρισης setLanguage(String). Μια πλήρης λίστα λειτουργιών και ιδιαιτεροτήτων είναι διαθέσιμη στον ιστότοπο του προγραμματιστή: http://stt.getflourish.com. Για να λειτουργήσουμε, χρειαζόμαστε το Google Speech API Key. Πώς να το αποκτήσετε περιγράφεται εδώ: www.chromium.org/developers/how-tos/api-keys. Το μόνο αρνητικό σημείο είναι ότι το Google Speech σάς επιτρέπει να επεξεργάζεστε μόνο 50 αιτήματα την ημέρα, αλλά στην πράξη διεκπεραιώνονται περισσότερα από 500 αιτήματα.

Για να διευκολυνθεί η πλοήγηση στο κείμενο στο μέλλον, επισυνάπτω όλες τις πηγές, οι οποίες περιέχουν ήδη φωνητικές εντολές, σύνδεση με τον πίνακα Arduino, ένα σκίτσο για τον πίνακα Arduino, φωνητική επιβεβαίωση φράσεων και οτιδήποτε άλλο ήδη εκεί και λειτουργεί: πηγές. Μετά τη λήψη, τοποθετούμε τον φάκελο GoogleTTS στις βιβλιοθήκες Επεξεργασία"a. Το σκίτσο για το Arduino βρίσκεται στο φάκελο GoogleTTS/ArduinoSerial. Όλα γράφτηκαν στο Processing 3.0a4, διαθέσιμο σε προέκδοση στον επίσημο ιστότοπο.

Εκτέλεση("Άκου την εντολή μου!"):
Αποφασίσαμε την αναγνώριση. Τώρα πρέπει να πιάσουμε τις εντολές που χρειαζόμαστε και να πάρουμε αποφάσεις για αυτές. Το τμήμα είναι υπεύθυνο για αυτό:
void commands() ( if (result.equals("arduino")) ( // Αναζήτηση αντιστοίχισης // Εκτέλεση εντολής όταν λαμβάνεται μια αντιστοίχιση ) else if (result.equals("τι ώρα είναι")) ( / / Εκτέλεση εντολής όταν λαμβάνεται μια αντιστοίχιση ) )
Φωνητική απόκριση
Τώρα χρειαζόμαστε ένα εργαλείο που θα μας ανταποκρίνεται με ανθρώπινη φωνή αν βρεθεί ένα ταίρι. Ως εργαλείο υλοποίησης επιλέχθηκε το Google Translate, ή μάλλον μια λειτουργική μονάδα που μετατρέπει το κείμενο σε φωνή. Το κείμενο αποστέλλεται κατόπιν αιτήματος στον διακομιστή της Google, μετατρέπεται σε αρχείο ήχου και μας αποστέλλεται σε μορφή mp3. Το τμήμα είναι υπεύθυνο για αυτό:
void googleTTS(String txt, String language) ( // το κείμενο μετατρέπεται σε ήχο χρησιμοποιώντας την εντολή googleTTS("text", "language") String u = "http://translate.google.com/translate_tts?tl="; u = u + γλώσσα + "&q=" + txt u = u.replace(" ", "%20"); σύνδεση setRequestProperty("User-Agent", "Mozilla/4.0 (συμβατό; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; Connect( ) ; ) (out.write(buf, 0, len); ) out.close("File Created: " + txt + " .mp3" ) catch (IOException e) (e.printStackTrace(); ) catch (MalformedURLException e) ( e.printStackTrace(); ) )

Η ενότητα είναι υπεύθυνη για την απευθείας επεξεργασία φράσεων κειμένου:
void voicer(String s) ( // Εκτελείται από την εντολή voicer("text") println(s); // χρησιμοποιείται για την παρακολούθηση κειμένου File f = new File(sketchPath + "/" + s + ".mp3"); // Έλεγχος του αρχείου // Εάν το αρχείο υπάρχει ήδη, παίξτε το αρχείο if(f.exists())( println("Το αρχείο υπάρχει ήδη! Παίζω το αρχείο!"); player = minim.loadFile(s + ".mp3"); "ru" = minim.loadFile(s + ".mp3");

Παράδειγμα εφαρμογής αναγνώρισης και φωνητικής επιβεβαίωσης:
void commands() ( if (result.equals("υπολογιστής")) ( // Ψάχνετε για έναν φωνητή αντιστοίχισης ("Listen"); // Λήψη φωνητικής επιβεβαίωσης // Εκτέλεση εντολής κατά τη λήψη ενός αγώνα ) )
Είναι ζωντανός!

Επεξεργασία + Arduino

Λοιπόν, φαίνεται ότι λειτούργησε, αλλά κάτι λείπει. Τώρα ας «κάνουμε φίλους» με το Arduino.
Αρχικοποιούμε τη σειριακή σύνδεση στο Processing για να στείλουμε δεδομένα στο Arduino (για χρήστες Mac και Unix):
String portName = Serial.list(); myPort = new Serial(this, portName, 9600); myPort.bufferUntil("\n");

Για χρήστες Windows:
String myPort = new Serial (αυτό, "Your COM port", 9600); myPort.bufferUntil("\n");

Και στείλτε μια εντολή εκεί εάν βρεθεί αντιστοίχιση φωνής:
void commands() ( if (result.equals("ενεργοποιήστε το φως")) ( // Εάν η φωνητική φράση αναγνωρίζεται ως "ενεργοποιήστε το φως", τότε εκτελέστε το αίτημα myPort.write("High"); / / Στέλνει την εντολή High στο Serial connection voicer ("Ενεργοποιήστε το φως" // Φωνητική επιβεβαίωση της εκτέλεσης της εντολής ) αλλιώς (result.equals("Turn off the light")) ( myPort.write("Low); "); // Στέλνει την εντολή Χαμηλή στον εκφωνητή σειριακής σύνδεσης ("Σβήσιμο του φωτός"); // Επιβεβαίωση // Εκτέλεση εντολής όταν λαμβάνεται ένας αγώνας) )

Τώρα ας περάσουμε στον πίνακα Arduino. Πρέπει να ακούσουμε τη Σειριακή θύρα και όταν βρούμε μια εντολή από τη λίστα, να εκτελέσουμε την απαιτούμενη ενέργεια σύμφωνα με την εντολή. Το σκίτσο είναι πολύ απλό:
int led = 13; // Καρφίτσα LED στην πλακέτα void setup() ( Serial.begin(9600); // Εκκίνηση της σειριακής σύνδεσης pinMode(led, OUTPUT); // Η ακίδα LED μεταδίδει δεδομένα ) void loop() ( int i=0; / / μεταβλητή για να τοποθετήσετε μια συμβολοσειρά στο buffer char buffer // έναν πίνακα buffer για να τοποθετήσετε τη συμβολοσειρά σε αυτήν if(Serial.available())( // Ελέγξτε τη σειριακή θύρα για την παρουσία καθυστέρησης δεδομένων (100); // βάλτε αυτό που διαβάστηκε στο buffer while(Serial.available () && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
Ολα. Ας ελέγξουμε.

Προβλήματα και σχέδια:

Επειδή Δεν έχω κάνει προγραμματισμό πριν αυτή τη φορά, δεν καταλαβαίνω πλήρως κάποια πράγματα στη διαδικασία εντοπισμού σφαλμάτων. Θα ήμουν ευγνώμων αν μπορούσε κάποιος να μου πει πώς να λύσω τα προβλήματα που αναφέρονται παρακάτω:

Το πιο βασικό πρόβλημα είναι ότι δεν εκφωνείται ολόκληρη η φωνητική φράση. Τα τελευταία γράμματα εξαφανίζονται. Αν και το αρχείο ήχου προέρχεται από τον διακομιστή Google σε κανονική μορφή. Όπως καταλαβαίνω την κατάσταση: υπάρχει πρόβλημα με το πρόγραμμα αναπαραγωγής ήχου, αλλά το πού ακριβώς δεν είναι ακόμη σαφές.
- Έχω ήδη γράψει ότι το Google Speech API έχει όριο 50 αιτημάτων την ημέρα, αλλά στην πραγματικότητα αποδεικνύεται περισσότερα. Σε κάθε περίπτωση, αυτό δεν αρκεί. Σκοπεύω να καταχωρήσω τοπική αναγνώριση της κύριας εντολής και μόνο αφού αναγνωριστεί, στείλω το υπόλοιπο κείμενο για επεξεργασία από την Google.
- Νομίζω ότι δεν θα ήταν κακό να στείλετε εντολές στην ασπίδα Arduino Ethernet, γιατί... Ορισμένα συστήματα ενδέχεται να βρίσκονται σε σημαντική απόσταση από τον κεντρικό υπολογιστή και μια σειριακή σύνδεση δεν θα λειτουργεί πλέον εδώ. Θα ασχοληθώ με αυτήν την απόφαση μια από αυτές τις μέρες, γιατί... Δεν έχω δρομολογητή για να συνδέσω ένα Arduino με ασπίδα Ethernet σε αυτό.

Αυτό είναι όλο! Παρακαλώ μην κρίνετε αυστηρά με βάση τις γραμμές κώδικα! Μόλις άρχισα να μελετώ αυτό το εφαλτήριο και θα είμαι εξαιρετικά ευγνώμων αν τρίψετε τη μύτη μου πώς να μην το κάνω και μου δείξετε πώς να το κάνω. Θα χαρώ επίσης να συμμετάσχουν και άλλα ενδιαφερόμενα μέρη σε αυτό το έργο - είμαι πάντα ανοιχτός στην επικοινωνία!

  • Επεξεργασία
  • Ανάπτυξη ιστοσελίδας
  • Ιδέα:

    Κάπως μου ήρθε η ιδέα να κάνω τον φωνητικό έλεγχο του Arduino, αλλά το Arduino από μόνο του δεν αρκεί, γιατί... Για ένα σύστημα έξυπνου σπιτιού, πρέπει επίσης να επικοινωνείτε με τον υπολογιστή και τα συστήματά του.

    Εύρεση λύσης:

    BitVoicer
    Συνάντησα διάφορα άρθρα που χρησιμοποιούν το BitVoicer σε συνδυασμό με το Arduino, αλλά το πρόβλημα είναι ότι το BitVoicer λειτουργεί μόνο σε Windows και αυτό δεν επιτρέπει στο σύστημα να χρησιμοποιηθεί σε απλές συσκευές όπως το Rasberry Pi που εκτελούν Unix.
    Αναγνώριση φωνής Arduino
    Το Arduino μπορεί επίσης να ελεγχθεί με φωνή χάρη στη μονάδα αναγνώρισης φωνής, αλλά μέχρι στιγμής δεν έχω τη χαρά να το αγοράσω και υπάρχουν πολλές ταλαιπωρίες κατά τη χρήση αυτής της μονάδας: περιορισμένος αριθμός εντολών, κουραστική εκπαίδευση, απαιτούνται νέες εντολές αναβοσβήνει τη μονάδα, η οποία είναι ήδη ένα μείον εάν το σύστημα διορθωθεί και εγκατασταθεί.

    Λύση

    Άρχισα να ψάχνω για μια λύση cross-platform που θα επέτρεπε στο σύστημα να λειτουργεί σε πολλά λειτουργικά συστήματα. Βρήκε αυτό: Βιβλιοθήκη ομιλίας σε κείμενο για Java/επεξεργασία. Το σύμπλεγμα υλοποιείται με βάση τη γλώσσα Επεξεργασία (Java)Και Google Speach APIΗ γάτα έχει ήδη γραφτεί στο παρελθόν. Αυτή η λύση σάς επιτρέπει να παρακολουθείτε τη φωνή σε πραγματικό χρόνο enableAutoRecord(), υποδείξτε το όριο έντασης enableAutoThreshold(), συνδέστε εξωτερικά μικρόφωνα getLineIn(), καθορίστε τη γλώσσα αναγνώρισης setLanguage(String). Μια πλήρης λίστα λειτουργιών και ιδιαιτεροτήτων είναι διαθέσιμη στον ιστότοπο του προγραμματιστή: http://stt.getflourish.com. Για να λειτουργήσουμε, χρειαζόμαστε το Google Speech API Key. Πώς να το αποκτήσετε περιγράφεται εδώ: www.chromium.org/developers/how-tos/api-keys. Το μόνο αρνητικό σημείο είναι ότι το Google Speech σάς επιτρέπει να επεξεργάζεστε μόνο 50 αιτήματα την ημέρα, αλλά στην πράξη διεκπεραιώνονται περισσότερα από 500 αιτήματα.

    Για να διευκολυνθεί η πλοήγηση στο κείμενο στο μέλλον, επισυνάπτω όλες τις πηγές, οι οποίες περιέχουν ήδη φωνητικές εντολές, σύνδεση με τον πίνακα Arduino, ένα σκίτσο για τον πίνακα Arduino, φωνητική επιβεβαίωση φράσεων και οτιδήποτε άλλο ήδη εκεί και λειτουργεί: πηγές. Μετά τη λήψη, τοποθετούμε τον φάκελο GoogleTTS στις βιβλιοθήκες Επεξεργασία"a. Το σκίτσο για το Arduino βρίσκεται στο φάκελο GoogleTTS/ArduinoSerial. Όλα γράφτηκαν στο Processing 3.0a4, διαθέσιμο σε προέκδοση στον επίσημο ιστότοπο.

    Εκτέλεση("Άκου την εντολή μου!"):
    Αποφασίσαμε την αναγνώριση. Τώρα πρέπει να πιάσουμε τις εντολές που χρειαζόμαστε και να πάρουμε αποφάσεις για αυτές. Το τμήμα είναι υπεύθυνο για αυτό:
    void commands() ( if (result.equals("arduino")) ( // Αναζήτηση αντιστοίχισης // Εκτέλεση εντολής όταν λαμβάνεται μια αντιστοίχιση ) else if (result.equals("τι ώρα είναι")) ( / / Εκτέλεση εντολής όταν λαμβάνεται μια αντιστοίχιση ) )
    Φωνητική απόκριση
    Τώρα χρειαζόμαστε ένα εργαλείο που θα μας ανταποκρίνεται με ανθρώπινη φωνή αν βρεθεί ένα ταίρι. Ως εργαλείο υλοποίησης επιλέχθηκε το Google Translate, ή μάλλον μια λειτουργική μονάδα που μετατρέπει το κείμενο σε φωνή. Το κείμενο αποστέλλεται κατόπιν αιτήματος στον διακομιστή της Google, μετατρέπεται σε αρχείο ήχου και μας αποστέλλεται σε μορφή mp3. Το τμήμα είναι υπεύθυνο για αυτό:
    void googleTTS(String txt, String language) ( // το κείμενο μετατρέπεται σε ήχο χρησιμοποιώντας την εντολή googleTTS("text", "language") String u = "http://translate.google.com/translate_tts?tl="; u = u + γλώσσα + "&q=" + txt u = u.replace(" ", "%20"); σύνδεση setRequestProperty("User-Agent", "Mozilla/4.0 (συμβατό; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; Connect( ) ; ) (out.write(buf, 0, len); ) out.close("File Created: " + txt + " .mp3" ) catch (IOException e) (e.printStackTrace(); ) catch (MalformedURLException e) ( e.printStackTrace(); ) )

    Η ενότητα είναι υπεύθυνη για την απευθείας επεξεργασία φράσεων κειμένου:
    void voicer(String s) ( // Εκτελείται από την εντολή voicer("text") println(s); // χρησιμοποιείται για την παρακολούθηση κειμένου File f = new File(sketchPath + "/" + s + ".mp3"); // Έλεγχος του αρχείου // Εάν το αρχείο υπάρχει ήδη, παίξτε το αρχείο if(f.exists())( println("Το αρχείο υπάρχει ήδη! Παίζω το αρχείο!"); player = minim.loadFile(s + ".mp3"); "ru" = minim.loadFile(s + ".mp3");

    Παράδειγμα εφαρμογής αναγνώρισης και φωνητικής επιβεβαίωσης:
    void commands() ( if (result.equals("υπολογιστής")) ( // Ψάχνετε για έναν φωνητή αντιστοίχισης ("Listen"); // Λήψη φωνητικής επιβεβαίωσης // Εκτέλεση εντολής κατά τη λήψη ενός αγώνα ) )
    Είναι ζωντανός!

    Επεξεργασία + Arduino

    Λοιπόν, φαίνεται ότι λειτούργησε, αλλά κάτι λείπει. Τώρα ας «κάνουμε φίλους» με το Arduino.
    Αρχικοποιούμε τη σειριακή σύνδεση στο Processing για να στείλουμε δεδομένα στο Arduino (για χρήστες Mac και Unix):
    String portName = Serial.list(); myPort = new Serial(this, portName, 9600); myPort.bufferUntil("\n");

    Για χρήστες Windows:
    String myPort = new Serial (αυτό, "Your COM port", 9600); myPort.bufferUntil("\n");

    Και στείλτε μια εντολή εκεί εάν βρεθεί αντιστοίχιση φωνής:
    void commands() ( if (result.equals("ενεργοποιήστε το φως")) ( // Εάν η φωνητική φράση αναγνωρίζεται ως "ενεργοποιήστε το φως", τότε εκτελέστε το αίτημα myPort.write("High"); / / Στέλνει την εντολή High στο Serial connection voicer ("Ενεργοποιήστε το φως" // Φωνητική επιβεβαίωση της εκτέλεσης της εντολής ) αλλιώς (result.equals("Turn off the light")) ( myPort.write("Low); "); // Στέλνει την εντολή Χαμηλή στον εκφωνητή σειριακής σύνδεσης ("Σβήσιμο του φωτός"); // Επιβεβαίωση // Εκτέλεση εντολής όταν λαμβάνεται ένας αγώνας) )

    Τώρα ας περάσουμε στον πίνακα Arduino. Πρέπει να ακούσουμε τη Σειριακή θύρα και όταν βρούμε μια εντολή από τη λίστα, να εκτελέσουμε την απαιτούμενη ενέργεια σύμφωνα με την εντολή. Το σκίτσο είναι πολύ απλό:
    int led = 13; // Καρφίτσα LED στην πλακέτα void setup() ( Serial.begin(9600); // Εκκίνηση της σειριακής σύνδεσης pinMode(led, OUTPUT); // Η ακίδα LED μεταδίδει δεδομένα ) void loop() ( int i=0; / / μεταβλητή για να τοποθετήσετε μια συμβολοσειρά στο buffer char buffer // έναν πίνακα buffer για να τοποθετήσετε τη συμβολοσειρά σε αυτήν if(Serial.available())( // Ελέγξτε τη σειριακή θύρα για την παρουσία καθυστέρησης δεδομένων (100); // βάλτε αυτό που διαβάστηκε στο buffer while(Serial.available () && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    Ολα. Ας ελέγξουμε.

    Προβλήματα και σχέδια:

    Επειδή Δεν έχω κάνει προγραμματισμό πριν αυτή τη φορά, δεν καταλαβαίνω πλήρως κάποια πράγματα στη διαδικασία εντοπισμού σφαλμάτων. Θα ήμουν ευγνώμων αν μπορούσε κάποιος να μου πει πώς να λύσω τα προβλήματα που αναφέρονται παρακάτω:

    Το πιο βασικό πρόβλημα είναι ότι δεν εκφωνείται ολόκληρη η φωνητική φράση. Τα τελευταία γράμματα εξαφανίζονται. Αν και το αρχείο ήχου προέρχεται από τον διακομιστή Google σε κανονική μορφή. Όπως καταλαβαίνω την κατάσταση: υπάρχει πρόβλημα με το πρόγραμμα αναπαραγωγής ήχου, αλλά το πού ακριβώς δεν είναι ακόμη σαφές.
    - Έχω ήδη γράψει ότι το Google Speech API έχει όριο 50 αιτημάτων την ημέρα, αλλά στην πραγματικότητα αποδεικνύεται περισσότερα. Σε κάθε περίπτωση, αυτό δεν αρκεί. Σκοπεύω να καταχωρήσω τοπική αναγνώριση της κύριας εντολής και μόνο αφού αναγνωριστεί, στείλω το υπόλοιπο κείμενο για επεξεργασία από την Google.
    - Νομίζω ότι δεν θα ήταν κακό να στείλετε εντολές στην ασπίδα Arduino Ethernet, γιατί... Ορισμένα συστήματα ενδέχεται να βρίσκονται σε σημαντική απόσταση από τον κεντρικό υπολογιστή και μια σειριακή σύνδεση δεν θα λειτουργεί πλέον εδώ. Θα ασχοληθώ με αυτήν την απόφαση μια από αυτές τις μέρες, γιατί... Δεν έχω δρομολογητή για να συνδέσω ένα Arduino με ασπίδα Ethernet σε αυτό.

    Αυτό είναι όλο! Παρακαλώ μην κρίνετε αυστηρά με βάση τις γραμμές κώδικα! Μόλις άρχισα να μελετώ αυτό το εφαλτήριο και θα είμαι εξαιρετικά ευγνώμων αν τρίψετε τη μύτη μου πώς να μην το κάνω και μου δείξετε πώς να το κάνω. Θα χαρώ επίσης να συμμετάσχουν και άλλα ενδιαφερόμενα μέρη σε αυτό το έργο - είμαι πάντα ανοιχτός στην επικοινωνία!

    Όπως υποδηλώνει ο τίτλος, αυτό το άρθρο θα επικεντρωθεί στην αναγνώριση αριθμών σε έναν μικροελεγκτή. Θα ήθελα να κάνω μια κράτηση αμέσως ότι αυτό το άρθρο δεν θα παρέχει τον πηγαίο κώδικα, δεν θα συζητήσει την τεχνολογία ή τον αλγόριθμο αναγνώρισης, θα πω μόνο ότι χρησιμοποιούνται οι ιδέες μιας συστηματικής προσέγγισης. Μερικά από αυτά περιγράφονται στα άρθρα μας (και εδώ). Αυτό οφείλεται στο γεγονός ότι η προσέγγισή μας επιδιώκει την πρωτοτυπία, αλλά απαιτεί διευκρίνιση ορισμένων θεμάτων.Κάποιος μπορεί να πει: "άλλο ένα άρθρο σχετικά με τον προγραμματισμό μικροελεγκτών." Καθόλου, η αναζήτηση για παρόμοια έργα δεν έδωσε κανένα σαφές αποτέλεσμα, εκτός από αυτό βίντεο. Από τις συζητήσεις στα φόρουμ, ένα πράγμα είναι ξεκάθαρο: η ιδέα της απόκτησης μιας τέτοιας συσκευής (κάμερα + μικροελεγκτής = αποτέλεσμα αναγνώρισης εξόδου και όχι μόνο μια τραβηγμένη εικόνα) ήρθε σε πολλούς ανθρώπους, αλλά παρέμεινε χωρίς εφαρμογή. Και η αναγνώριση, από κάθε άποψη, απαιτεί πολλούς υπολογιστικούς πόρους και οι μικροελεγκτές δεν είναι κατάλληλοι για αυτό, ειδικά για το Arduino υπήρχαν δηλώσεις ότι αυτό είναι γενικά αδύνατο. Αν ενδιαφέρεστε, δείτε το cat.

    Για να αποφύγουμε προφανείς ερωτήσεις, ας τις απαντήσουμε:

    • Όχι, δεν πρόκειται για υπηρεσία αναγνώρισης εικόνων.
    • Όχι, αυτό δεν είναι OpenCV
    • Όχι, αυτά δεν είναι νευρωνικά δίκτυα
    • Ναι, η αναγνώριση γίνεται από τον μικροελεγκτή!

    Ιδέα

    Με λίγα λόγια, όλα ξεκίνησαν με την επιθυμία να δοκιμάσω τις δυνάμεις μου και να δοκιμάσω τις ιδέες μου στην αναγνώριση εικόνων. Κατά τη διάρκεια της συζήτησης, καταλήξαμε στο συμπέρασμα ότι μπορούμε να τα καταφέρουμε με μικρή υπολογιστική ισχύ για να λύσουμε αυτό το πρόβλημα. Για ευνόητους λόγους, δεν θα περιγράψουμε τις λεπτομέρειες αυτών των συζητήσεων.

    Εγκατάσταση

    Άρα, το καθήκον έχει τεθεί, χρειάζεται υλοποίηση. Χωρίς να παρεκκλίνουμε από ήδη καθιερωμένες αρχές
    παίρνουμε ότι έχουμε στα χέρια μας. Και είχα μερικά Arduino Unos, ένα παλιό οπτικό ποντίκι και μια μονάδα CD στο χέρι. Παρεμπιπτόντως, αυτό που μας ώθησε να χρησιμοποιήσουμε έναν αισθητήρα οπτικού ποντικιού ως κάμερα για να λάβουμε μια εικόνα ήταν κάτι που διαβάσαμε πριν από πολύ καιρό, και, στην πραγματικότητα, όλο το άλλο υλικό «ποντικιού». Το μόνο που έπρεπε να κάνουμε ήταν να ξεκολλήσουμε τον αισθητήρα και ολόκληρη την πλεξούδα του για ευκολία στη χρήση και επίσης να κολλήσουμε έναν φακό, τον οποίο προσεκτικά «σκίσαμε» από τη μονάδα CD. Αυτό ήταν απαραίτητο για να αυξηθεί η απόσταση από το θέμα στην κάμερα, διαφορετικά δεν θα χωρούσαν οι αριθμοί του μεγέθους μας και θα ήταν ορατό μόνο ένα μικρό μέρος. Παρεμπιπτόντως, προσπαθήσαμε να συνδέσουμε τα οπτικά από την κάμερα web μπροστά από τον φακό από τη μονάδα CD, αλλά κατά κάποιο τρόπο δεν λειτούργησε.


    Περισσότερο



    Τότε προέκυψε το ερώτημα πώς να τοποθετήσετε αυτήν την κάμερα πάνω από το θέμα. Εδώ μας βοήθησε πολύ ένα παλιό σπασμένο μικροσκόπιο που βρισκόταν σε αδράνεια. Με σεβασμό αφαιρέσαμε τον μηχανισμό ελέγχου σκηνής από αυτό. Αυτός ο μηχανισμός μας επέτρεψε να μετακινήσουμε την κάμερα μόνο σε δύο άξονες, ήρθε αμέσως η ιδέα να χρησιμοποιήσουμε τον οδηγό κεφαλής λέιζερ από τη μονάδα CD. Όλα αυτά ήταν ασφαλισμένα στην θήκη της πολύπαθης μονάδας CD. Ως αποτέλεσμα, αποκτήσαμε έναν δροσερό μηχανισμό τοποθέτησης κάμερας.


    Περισσότερο




    Σύνολο: έχουμε μια λεγόμενη κάμερα, υπάρχει μηχανισμός τοποθέτησης, το μόνο που μένει είναι να βάλουμε ένα χαρτί με έναν αριθμό και να πάρουμε μια εικόνα από την κάμερα. Εδώ ξεκίνησαν τα «προβλήματα». Δεδομένου ότι τα χαρακτηριστικά του οπτικού αισθητήρα «ποντικιού» είναι πολύ φτωχά για τη χρήση του ως κάμερα, άρχισαν να αυτοσχεδιάζουν με οπίσθιο φωτισμό.


    Περισσότερο




    Έγινε σαφές ότι δεν θα ήταν δυνατό να τονιστεί απλώς η ένταση της κατεύθυνσης του εξωτερικού φωτός επίσης. Έπρεπε να ενεργοποιήσω ένα άλλο Arduino για να ελέγξω την ένταση του οπίσθιου φωτισμού ( Φυσικά, ήταν δυνατό να το ελέγξετε διαφορετικά, αλλά στη συνέχεια όχι μόνο από τον οπίσθιο φωτισμό, αλλά και με την εναλλαγή αριθμών στην ένδειξη). Τελικά, αποδείχθηκε ότι η λήψη στο φως είναι πολύ καλύτερη. Και αν, για παράδειγμα, χρησιμοποιείτε ως στόχο έναν λαμπερό δείκτη επτά τμημάτων, τότε ο αισθητήρας το βλέπει τέλεια. Τώρα λοιπόν έχουμε μια ένδειξη και μια λωρίδα με λευκούς αριθμούς γεμάτες με μαύρο φόντο ως αντικείμενα λήψης.


    στα αριστερά είναι μια εικόνα σε κλίμακα του γκρι που λαμβάνεται από τον δείκτη (λαμβάνουμε μια τέτοια εικόνα από τον αισθητήρα), στα δεξιά είναι δυαδική.


    Περισσότερο



    Γενική άποψη της συναρμολογημένης εγκατάστασης



    επιλογή πρώιμης εγκατάστασης





    Μπλοκ αναγνώρισης


    Σημαντικό ρόλο στην εγκατάστασή μας παίζει η λεγόμενη μονάδα αναγνώρισης (στην παραπάνω εικόνα). Όπως μπορείτε να δείτε, αποτελείται από ένα Arduino Uno και έναν γνωστό πομπό wifi ESP8266. Επιτρέψτε μου να εξηγήσω, χρειαζόμαστε έναν πομπό wifi για να δούμε το αποτέλεσμα αναγνώρισης στο tablet. Η εφαρμογή στο tablet στέλνει ένα αίτημα, το Arduino, μόλις λάβει το αίτημα, «συλλαμβάνει» την εικόνα από τον αισθητήρα του ποντικιού και στη συνέχεια τη δυαδοποιεί. Μετά τη δυαδοποίηση, εμφανίζεται η αναγνώριση και μετά την ολοκλήρωσή της, δημιουργείται μια απόκριση. Στην απόκριση, στέλνουμε το αποτέλεσμα αναγνώρισης και 41 byte για να δημιουργήσουμε μια δυαδική εικόνα στην οθόνη του tablet, ας πούμε έτσι, για λόγους σαφήνειας.

    Αν κοιτάξετε πίσω, το Arduino έχει κάποιες καλές λειτουργίες: εργασία με την κάμερα, αναγνώριση και εργασία με το esp8266. Αυτό που δεν μπορούσε παρά να επηρεάσει τη δουλειά ήταν ότι έπρεπε να αντιμετωπίσουμε την έλλειψη μνήμης. Ποτέ δεν πίστευα ότι θα έπρεπε ποτέ να ανακτήσω κάθε byte μνήμης.

    Επίδειξη της διαδικασίας αναγνώρισης

    Αντί για συμπέρασμα

    Αυτό είναι όλο. Υπάρχει ακόμη πολλή δουλειά μπροστά. Και το πρώτο καθήκον: αναγνώριση αριθμών (σειρές αριθμών) που καταγράφονται από μια «ανθρώπινη» κάμερα (και όχι «αισθητήρας ποντικιού») και μεταφορά της ανεπτυγμένης τεχνολογίας στο ESP8266 και μείωση της έντασης του αγώνα για κάθε byte μνήμης.

    Θα χαρούμε να απαντήσουμε στις ερωτήσεις σας.

    Θυμάστε πώς πριν από μερικά χρόνια (και ίσως ακόμη και τώρα) ήταν δημοφιλής η ιδέα να ελέγχετε το φως σε ένα δωμάτιο χτυπώντας τα χέρια σας; Αλλά, είναι πολύ βολικό, είσαι ξαπλωμένος στο κρεβάτι, πολύ τεμπέλης για να σηκωθείς και να σβήσεις το φως με ένα χτύπημα των χεριών σου, ή πάμε σπίτι, είναι σκοτεινά, χρειάζεται πολύς χρόνος για να βρεις τον διακόπτη και μετά από το κατώφλι ακούγονται ένα ή δύο παλαμάκια και το φως είναι ήδη αναμμένο. Μου φαίνεται ότι αυτή η έννοια εξακολουθεί να είναι σχετική, αλλά μπορούν να εφαρμοστούν υψηλότερες τεχνολογίες σε σύγκριση με εκείνες που ήταν πριν από 5 ή 10 χρόνια. Τώρα, για ένα σχετικά μικρό ποσό, μπορείτε να αγοράσετε πολλά εξαρτήματα και να προγραμματίσετε τη σχεδίαση για παρόμοιες λειτουργίες, οι οποίες θα συζητηθούν παρακάτω.

    Σήμερα θα εξετάσουμε μια μονάδα που έχει σχεδιαστεί για να αναγνωρίζει φωνητικές εντολές (συμπεριλαμβανομένων μόνο φωνών μέσα σε μια ηχογραφημένη φωνητική εντολή) – Μονάδα αναγνώρισης φωνής V3.1 (V3)ή το όνομα κωδικοποίησης FZ0475 που συναντάται συχνά.

    Το σετ παράδοσης περιλαμβάνει την ίδια τη μονάδα (πλακέτα τυπωμένου κυκλώματος πολύ καλής ποιότητας), ένα μικρόφωνο σε ένα εύκαμπτο πόδι με υποδοχή υποδοχής 3,5 mm και γωνιακές επαφές PLS με βήμα 2,56 mm για την πλακέτα της μονάδας (δεν μπορούν να χρησιμοποιηθούν εάν συνδέεται με τις επαφές της μονάδας με άλλο τρόπο).

    Σήμερα, υπάρχουν διάφοροι τύποι μονάδων με παρόμοια λειτουργικότητα από διαφορετικούς κατασκευαστές και προγραμματιστές ή σχέδια. Αυτή η μονάδα αναγνώρισης φωνής, κατά τη γνώμη μου, έχει μια ορισμένη ισορροπία μεταξύ κόστους, λειτουργικότητας και ευκολίας. Η μονάδα EasyVR θα είναι πιο ισχυρή και σημαντικά πιο ακριβή. Οι μονάδες που βασίζονται στο LD3320 θα είναι φθηνότερες και πιο άβολες (άβολες τουλάχιστον επειδή δεν είναι εύκολο να βρεθεί μια κανονική περιγραφή για αυτά, αλλά τα υπόλοιπα είναι υποκειμενικά).

    Χαρακτηριστικά της μονάδας αναγνώρισης φωνής V3.1 (V3):

    • Τάση τροφοδοσίας – 5 βολτ
    • Κατανάλωση ρεύματος – έως 40 mA
    • Διεπαφές – UART, GPIO
    • Ακρίβεια αναγνώρισης – 99% (υπό ιδανικές συνθήκες)
    • Εύρος - εξαρτάται από το μικρόφωνο που χρησιμοποιείται, για το τυπικό μικρόφωνο που περιλαμβάνεται στο κιτ η μέγιστη απόσταση είναι 0,5 - 1 μέτρο με αρκετά δυνατή φωνή, αλλά εάν η φωνή είναι ήσυχη, θα πρέπει να φέρετε το μικρόφωνο πιο κοντά στο στόμα σας

    Η μονάδα είναι μια μικρή τακτοποιημένη πλακέτα στην οποία υπάρχει ένας κύριος μικροελεγκτής (black blot), μια υποδοχή jack 3,5 mm για σύνδεση μικροφώνου, ένα τσιπ μνήμης flash, GPIO, UART και επαφές τροφοδοσίας, ένα ζευγάρι LED και τα υπόλοιπα απαραίτητος εξοπλισμός που απαιτείται για τη λειτουργία του κυκλώματος - αντιστάσεις, πυκνωτές, χαλαζίας. Το μικρό μέγεθος της πλακέτας θα σας επιτρέψει να ενσωματώσετε εύκολα τη μονάδα στα δικά σας σχέδια. Για να αυξήσετε το εύρος των φωνητικών εντολών, είναι πιθανώς απαραίτητο να χρησιμοποιήσετε ένα ενισχυμένο μικρόφωνο. Μόλις επιτευχθεί ένα αποδεκτό εύρος, η μονάδα είναι κατάλληλη για χρήση σε έξυπνα οικιακά συστήματα. Χωρίς τροποποιήσεις για τη βελτίωση του εύρους λειτουργίας, η μονάδα μπορεί να χρησιμοποιηθεί σε συστήματα ελέγχου επιτραπέζιου υπολογιστή, καθώς και σε συστήματα ασφαλείας (έλεγχος πρόσβασης και περιορισμός). Με ένα τυπικό μικρόφωνο, λόγω της μικρής εμβέλειας, είναι πιο αξιόπιστο να χρησιμοποιείτε τη μονάδα φωνητικής αναγνώρισης ως ακουστικό και να μεταδίδετε ασύρματα εντολές σε έναν ελεγκτή που ελέγχει κάτι χρησιμοποιώντας μπαταρία και ασύρματες μονάδες (για παράδειγμα, HC-05 ή HC- 12 ή οποιοδήποτε άλλο κατάλληλο). Η μονάδα είναι σε θέση να λειτουργεί χωρίς εξωτερικό μικροελεγκτή, καθώς ο κατασκευαστής παρέχει λειτουργική ανεξαρτησία, χρειάζεται να εγγράψετε φωνητικές εντολές μόνο μία φορά και να ορίσετε τις ρυθμίσεις για ανεξάρτητη λειτουργία χρησιμοποιώντας μια εξωτερική συσκευή (PC ή MCU).

    Έτσι, για να ξεκινήσουμε να εργαζόμαστε με τη μονάδα αναγνώρισης φωνής, πρέπει να τη συνδέσουμε είτε σε υπολογιστή (χρειάζεστε έναν προσαρμογέα USB-UART) είτε σε έναν μικροελεγκτή (πρέπει να αναπτύξετε κώδικα προγράμματος για να ελέγξετε τη μονάδα).

    Δεν υπάρχει θεμελιώδης διαφορά στη διαχείριση και τη διαμόρφωση της μονάδας μεταξύ της σύνδεσης σε υπολογιστή ή μικροελεγκτή, επομένως για λόγους σαφήνειας, θα χρησιμοποιήσουμε έναν υπολογιστή για τη διαμόρφωση. Οι οδηγίες περιγράφουν τις εντολές για τη μονάδα σε δεκαεξαδική μορφή, επομένως για ευκολία θα χρειαστείτε επίσης ένα τερματικό που μεταδίδει bytes σε δεκαεξαδική μορφή, για παράδειγμα, AccessPort (μπορείτε να το κατεβάσετε στο τέλος του άρθρου). Επιπλέον, ο κατασκευαστής εστιάζει στους χρήστες της πλατφόρμας Arduino και παρέχει μια βιβλιοθήκη για τη χρήση αυτής της ενότητας και οδηγίες για τη χρήση αυτής της βιβλιοθήκης. Ωστόσο, πολλοί από εμάς ενδιαφέρονται πολύ περισσότερο να εργαστούν με το ίδιο το module απευθείας παρά μέσω του περιτυλίγματος Arduino.

    Πριν ξεκινήσουμε τη δουλειά, ας δούμε τον πίνακα. Στα άκρα της πλακέτας στα δεξιά υπάρχει μια υποδοχή για τη σύνδεση μικροφώνου, στην άλλη υπάρχουν τέσσερις επαφές της διεπαφής UART. Στο κάτω μέρος υπάρχουν οκτώ επαφές που χρησιμοποιούνται για την έξοδο σημάτων που προκαλούνται από την αναγνώριση φωνητικών εντολών. Στο επάνω μέρος, τέσσερις ακίδες που έχουν διαμορφωθεί ως είσοδος σήματος χρησιμοποιούνται για εναλλαγή μεταξύ ομάδων (από επτά φωνητικές εντολές η καθεμία) εντολών, εάν χρησιμοποιείται μια τέτοια δυνατότητα. Και οι υπόλοιπες έξι ακίδες στο επάνω μέρος πιθανότατα χρησιμοποιούνται για σύνδεση στη μνήμη της μονάδας.

    Ένα σύστημα εντολών χρησιμοποιείται για τη λειτουργία και τη διαμόρφωση της μονάδας. Η γενική άποψη του πλαισίου μοιάζει με αυτό:

    Οι πρώτες τέσσερις εντολές 00, 01, 02, 03 χρησιμοποιούνται για τον έλεγχο της κατάστασης της μονάδας και των ρυθμίσεών της. Οι επόμενες έξι εντολές 10, 11, 12, 13, 14, 15 χρησιμοποιούνται για την αλλαγή των ρυθμίσεων της μονάδας, συμπεριλαμβανομένου του ελέγχου θύρας εξόδου και των ρυθμίσεων αυτόματης φόρτωσης. Στη συνέχεια, τρεις εντολές 20,21, 22 χρησιμοποιούνται για την εγγραφή φωνητικών εντολών. Οι επόμενες τρεις εντολές 30,31,32 χρησιμοποιούνται για τον έλεγχο της αναγνώρισης φωνητικών εντολών. Οι εντολές 0A, 0D, FF χρησιμοποιούνται μόνο όταν επιστρέφονται δεδομένα από την ίδια τη μονάδα. Στην πραγματικότητα δεν υπάρχουν πολλές εντολές και όλα αυτά δεν είναι τόσο τρομακτικά όσο φαίνεται με την πρώτη ματιά στην τεκμηρίωση για τη μονάδα. Ας δούμε τις εντολές που είναι απαραίτητες για να εργαστείτε με τη μονάδα αναγνώρισης φωνής. Δεν είναι όλες οι υπάρχουσες εντολές πρακτικές.

    Αξίζει να σημειωθεί ότι η μονάδα μπορεί να λειτουργήσει χωρίς εξωτερικό μικροελεγκτή ελέγχου και μπορεί επίσης να ελέγξει ανεξάρτητα κάτι με τις θύρες εξόδου της. Για να το κάνετε αυτό, πρέπει να τις διαμορφώσετε (εντολές 12, 13, 14).

    Ομάδα 12 – διαμόρφωση θυρών εξόδου. Αυτή η εντολή διαμορφώνει τον τρόπο λειτουργίας των θυρών εξόδου της μονάδας αναγνώρισης φωνής.

    Μορφή: | ΑΑ | 03 | 12 | ΛΕΙΤΟΥΡΓΙΑ | 0A |

    Όπου η MODE μπορεί να λάβει τέσσερις τιμές: 0 – λειτουργία παλμού (όταν ενεργοποιείται μια φωνητική εντολή, η έξοδος που αντιστοιχεί στην εντολή θα αλλάξει την κατάστασή της για το χρόνο που έχει οριστεί από την εντολή 13), 1 – λειτουργία εναλλαγής (εναλλαγή ή αναστροφή) (κάθε φορά ενεργοποιείται μια φωνητική εντολή, η έξοδος που αντιστοιχεί στη φωνητική εντολή ανεστραμμένη), 2 – λειτουργία ενεργοποίησης (όταν ενεργοποιηθεί η φωνητική εντολή, η έξοδος θα μεταβεί στη λογική μία κατάσταση και δεν θα μεταβαίνει πλέον στη λογική κατάσταση μηδέν, η επαναφορά είναι εκτελείται με την εντολή 14), 3 – λειτουργία απενεργοποίησης (παρόμοια με τη λειτουργία ενεργοποίησης, μόνο αντίθετα, όταν ενεργοποιείται η φωνητική εντολή, η έξοδος πηγαίνει σε κατάσταση λογικής μηδέν).

    Το πιο πρακτικό είναι η λειτουργία διακόπτη, η οποία δεν απαιτεί περιττές εντολές. Η παλμική λειτουργία θα ήταν καλή, αλλά η λογική αυτής της λειτουργίας είναι τέτοια που όταν ενεργοποιείται μια φωνητική εντολή, εκδίδει μια λογική μία φορά, για ένα διάστημα από 10 ms έως 1 δευτερόλεπτο. Δεν είναι αρκετό. Αν και, ανάλογα με τις απαιτήσεις για αυτήν τη λειτουργία, μπορεί να είναι χρήσιμο. Οι τρόποι ενεργοποίησης και απενεργοποίησης υλοποιούνται άβολα, καθώς απαιτούν την εκτέλεση πρόσθετων εντολών.

    Ομάδα 13 – ρύθμιση της διάρκειας παλμού της αντίστοιχης λειτουργίας.

    Μορφή: | ΑΑ | 03 | 13 | ΕΠΙΠΕΔΟ | 0A |

    Όπου LEVEL παίρνει μια τιμή από 00 έως 0F (που αντιστοιχεί σε διάρκεια από 10 ms έως 1 s).

    ΕΠΙΠΕΔΟ διάρκεια
    0x00 10 ms
    0x01 15 ms
    0x02 20 ms
    0x03 25 ms
    0x04 30 ms
    0x05 35 ms
    0x06 40 ms
    0x07 45 ms
    0x08 50 ms
    0x09 75 ms
    0x0A 100 ms
    0x0B 200 ms
    0x0C 300 ms
    0x0D 400 ms
    0x0E 500 ms
    0x0F 1 s

    Ομάδα 14 – επαναφέρετε τις θύρες εξόδου στην κατάσταση που καθορίζεται από τις λειτουργίες ενεργοποίησης ή απενεργοποίησης.

    Μορφή: | ΑΑ| 03 | 14 | FF | 0A | - επαναφέρετε όλες τις θύρες εξόδου

    | ΑΑ| 03+n | 14 | IO0 | ... | ΙΟΝ | 0A | - επαναφέρετε τις επιλεγμένες θύρες εξόδου

    Όπου n είναι ο αριθμός των ακίδων που επαναφέρονται επιλεκτικά, το IO0...ION είναι μια λίστα αυτών των ακίδων στο πλαίσιο αποστολής δεδομένων.

    Στη συνέχεια, για να εκτελεστούν φωνητικές εντολές, πρέπει να καταγραφούν στη μονάδα (εκπαίδευση της μονάδας). Εδώ υπάρχει ένας περιορισμός. Μόνο επτά εντολές μπορούν να αναγνωριστούν κάθε φορά, αν και μπορούν να καταγραφούν πολλές περισσότερες. Για την επέκταση του εύρους των φωνητικών εντολών που θα αναγνωριστούν, χρησιμοποιείται ένα σύστημα ομαδοποίησης (εντολή 32), το οποίο ελέγχεται από τις θύρες εισόδου της μονάδας. Ρυθμίζοντας τη διαμόρφωση του σήματος σε αυτές τις ακίδες, επιλέγετε την ομάδα εντολών που θα αναγνωριστούν. Αυτό οφείλεται στην περιορισμένη απόδοση του φωνητικού ελεγκτή της μονάδας.

    Ομάδα 20 - ηχογράφηση μιας ή περισσότερων φωνητικών εντολών.

    Μορφή: | ΑΑ| 03+n | 20 | R0 | ... | Rn | 0A |

    Όπου n είναι ο αριθμός των εγγεγραμμένων φωνητικών εντολών (αν ηχογραφηθεί μία εντολή n=0, δύο εντολές n=1 κ.ο.κ. σύμφωνα με τη γενική μορφή για τη μετάδοση εντολών Μήκος - μήκος), R0...Rn αριθμοί φωνητικών εντολών (AA 03 20 03 0A - εντολή για ηχογράφηση της τρίτης φωνητικής εντολής).

    Ομάδα 21 - ηχογραφήστε μία φωνητική εντολή και ορίστε μια υπογραφή για αυτήν.

    Μορφή: | ΑΑ| 03+SIGLEN | 21 | ΡΕΚΟΡ | SIG | 0A |

    Όπου RECORD είναι ο αριθμός φωνητικής εντολής, SIG είναι η υπογραφή (μπορεί να αποτελείται από πολλά byte, έτσι ώστε κάθε byte να αντιστοιχεί σε έναν αλφαβητικό χαρακτήρα που κωδικοποιεί εάν είναι απαραίτητο), SIGLEN είναι ο αριθμός των byte που συνθέτουν την υπογραφή.

    Ομάδα 22 - προσθέστε ή διαγράψτε μια υπογραφή για την επιλεγμένη φωνητική εντολή.

    Μορφή: | ΑΑ | 03+SIGLEN | 22 | ΡΕΚΟΡ | SIG | 0A | - προσθήκη υπογραφής

    | ΑΑ | 03 | 22 | ΡΕΚΟΡ | 0A | - αφαίρεση υπογραφής

    Κατά την εγγραφή φωνητικών εντολών, πρέπει να καθοδηγηθείτε από σήματα LED. Αφού εισαγάγετε την εντολή που ξεκινά τη διαδικασία εγγραφής, το κίτρινο (πορτοκαλί) LED αρχίζει να αναβοσβήνει γρήγορα. Μόλις ανάψει το κόκκινο LED, πρέπει να πείτε μια φωνητική εντολή στο μικρόφωνο. Εάν είναι επιτυχής, η κίτρινη (πορτοκαλί) λυχνία LED θα ανάψει και μετά θα ξανακόκκινη - πρέπει να επιβεβαιώσετε τη φωνητική εντολή και να την πείτε ξανά. Εάν είναι επιτυχής, θα ανάψουν και οι δύο λυχνίες LED - η φωνητική εντολή έχει αποθηκευτεί.

    Μόλις εγγραφούν φωνητικές εντολές στη μονάδα, τίποτα δεν θα συμβεί έως ότου αυτές οι εντολές τοποθετηθούν στο "Recognizer" της μονάδας. Για να το κάνετε αυτό, πρέπει να χρησιμοποιήσετε την εντολή 30. Μετά την εκτέλεση αυτής της εντολής, η λειτουργική μονάδα θα αρχίσει να περιμένει τη φωνητική εντολή να ταιριάζει με τα αποθηκευμένα δείγματα. Μόνο επτά εντολές μπορούν να αναγνωριστούν κάθε φορά. Σε αυτήν την περίπτωση, το κίτρινο (πορτοκαλί) LED στην πλακέτα της μονάδας θα αναβοσβήνει αργά.

    Ομάδα 30 - φόρτωση εγγραφών στο Recognizer της μονάδας.

    Μορφή: | ΑΑ| 2+n | 30 | R0 | ... | Rn | 0A |

    Η μορφή απάντησης είναι η εξής: | ΑΑ | 07 | 0D | 00 | GRPM | R | RI | ΣΙΓΚΛΕΝ | SIG | 0A |

    Όπου το GRPM είναι πληροφορίες σχετικά με την ομάδα στην οποία ανήκει η εντολή (εάν χρησιμοποιείται), το R είναι η αναγνωρισμένη φωνητική εντολή (χρησιμοποιώντας αυτά τα δεδομένα μπορείτε να διακρίνετε εντολές μεταξύ τους εάν δεν χρησιμοποιούνται υπογραφές), το RI είναι το ευρετήριο εντολών στον αναγνωριστικό, Το SIGLEN είναι το μήκος της υπογραφής σε byte, SIG - υπογραφή (αν χρησιμοποιείται).

    Και τέλος, εάν η μονάδα πρέπει να λειτουργεί ανεξάρτητα, τότε πρέπει να χρησιμοποιήσετε την εντολή 15 για αυτόματη εκκίνηση σύμφωνα με τις προεπιλογές του αναγνωριστικού. Σε αυτήν την περίπτωση, η μονάδα αναγνώρισης φωνής θα λειτουργεί ανεξάρτητα χωρίς να χρειάζεται προετοιμασία μετά την ενεργοποίηση.

    Ομάδα 15 - ρύθμιση της λειτουργίας αναγνώρισης σε αυτόματη εκκίνηση όταν είναι ενεργοποιημένη.

    Μορφή: | ΑΑ| 03 | 15 | 00 | 0A | - απενεργοποιήστε τη λειτουργία αυτόματης εκτέλεσης

    | ΑΑ| 03+n | 15 | BITMAP | R0 | ... | Rn | 0A | - ρύθμιση της λειτουργίας αυτόματης εκτέλεσης

    Για τον έλεγχο της σωστής εκτέλεσης των εντολών, καθεμία από αυτές έχει τη δική της απόκριση. Εάν είναι απαραίτητο, όλα τα δεδομένα μπορούν να βρεθούν στην τεκμηρίωση για τη μονάδα αναγνώρισης φωνής που επισυνάπτεται στο τέλος του άρθρου. Μην ξεχνάτε ότι όλες οι αριθμητικές τιμές παρουσιάζονται στο δεκαεξαδικόμορφή.

    Έτσι, χρησιμοποιώντας το σύστημα εντολών, μπορείτε να διαμορφώσετε ευέλικτα τη μονάδα αναγνώρισης φωνής για χρήση για διάφορους σκοπούς. Εάν η απλή διαχείριση των θυρών εξόδου της μονάδας δεν είναι αρκετή, η μονάδα αναγνώρισης φωνής μπορεί να συνδεθεί με άλλες συσκευές μέσω UART ή GPIO. Για ασύρματη σύνδεση, μπορείτε να χρησιμοποιήσετε τις μονάδες που συζητήθηκαν προηγουμένως.

    Χρησιμοποιώντας ασύρματες μονάδες, μπορείτε να συνδέσετε τη μονάδα αναγνώρισης φωνής σε οποιεσδήποτε συσκευές είναι απαραίτητο. Για παράδειγμα, ας το συνδέσουμε σε έναν μικροελεγκτή, ο οποίος θα ελέγχει τα LED με βάση τα δεδομένα που λαμβάνονται σχετικά με την αναγνώριση φωνητικών εντολών. Οι ασύρματες μονάδες επιτρέπουν τη μετάδοση δεδομένων προς δύο κατευθύνσεις, επομένως, εάν είναι απαραίτητο, μπορείτε να γράψετε κώδικα για τον μικροελεγκτή για την προετοιμασία της μονάδας φωνής και την εγγραφή φωνητικών εντολών. Στην περίπτωσή μας, υπό τον έλεγχο του υπολογιστή, πολλές φωνητικές εντολές έχουν ήδη εγγραφεί στη μονάδα και η αναγνώριση έχει ρυθμιστεί για αυτόματη εκκίνηση όταν είναι ενεργοποιημένη η τροφοδοσία, επομένως για τον μικροελεγκτή θα καταχωρίσουμε μόνο τη λήψη δεδομένων και τον έλεγχο LED σε σχέση με αυτά τα δεδομένα. Ο μικροελεγκτής STM32F103C8T6 χρησιμοποιεί το USART1 για τη λήψη δεδομένων και τις ακίδες PB10...PB15 που έχουν διαμορφωθεί ως έξοδο, το οποίο ελέγχει τα LED. Ο πηγαίος κώδικας βρίσκεται στο παράρτημα στο τέλος του άρθρου.

    Λίγο για τα αποτελέσματα

    Η αναγνώριση φωνής δεν είναι απολύτως ακριβής. Εξαρτάται από τις επιλεγμένες εντολές και τη φωνή του χρήστη. Κατά τη διάρκεια της δοκιμής βρήκα αρκετά αρνητικά σημεία. Κατά τη διδασκαλία των εντολών της ενότητας, επιλέχθηκαν οι φωνητικές εντολές «ένα» και «δύο». Η εντολή "δύο" περνούσε πάντα καθαρά, αλλά η εντολή "ένα" συχνά προσδιοριζόταν ως εντολή "δύο" και ο κωδικός της δεύτερης εντολής εκτελούνταν ανάλογα. Επιπλέον, όταν προσπαθούσαμε να δώσουμε φωνητικές εντολές στα Αγγλικά (και δεν καταγράφηκαν στη μονάδα φωνής), η εντολή «ένα» σχεδόν πάντα οριζόταν ως «δύο». Ίσως όλα έχουν να κάνουν με την προφορά, τον τονισμό και άλλες πτυχές της ανθρώπινης φωνής που είναι ενσωματωμένες στον αλγόριθμο για την κωδικοποίηση της μονάδας φωνής των προφορικών εντολών. Ωστόσο, οι κατασκευαστές δεν δημοσιοποιούν αυτά τα μυστικά. Επιπλέον, η ποιότητα της αναγνώρισης επηρεάζεται από τις εξωτερικές συνθήκες θορύβου - θόρυβος από το δρόμο, θόρυβος ανεμιστήρα, τυχαίους ήχους κ.λπ. Ο κατασκευαστής τονίζει ότι ένα υψηλό επίπεδο ακρίβειας αναγνώρισης προκύπτει υπό ιδανικές συνθήκες. Η ιδέα της χρήσης μικροφώνου με ενισχυτή θα αυξήσει φυσικά το εύρος λειτουργίας της συσκευής, αλλά θα αυξήσει και την πιθανότητα σφαλμάτων, αφού η ενίσχυση της φωνής θα αυξήσει και τον θόρυβο.

    Τελικά, εάν έχετε χαμηλές απαιτήσεις για φωνητική αναγνώριση και εκτέλεση φωνητικών εντολών, τότε αυτή η ενότητα θα επεξεργαστεί με ειλικρίνεια τα χρήματα που δαπανήθηκαν για αυτήν.

    Κατάλογος ραδιοστοιχείων

    Ονομασία Τύπος Ονομασία Ποσότητα ΣημείωσηΚατάστημαΤο σημειωματάριό μου
    IC1 MK STM32

    STM32F103C8

    1 Στο σημειωματάριο
    VR1 Γραμμικός ρυθμιστής

    AMS1117-3.3

    1 Στο σημειωματάριο
    MOD1, MOD3 Ασύρματη μονάδαHC-122 Στο σημειωματάριο
    MOD2 Μονάδα αναγνώρισης φωνήςVR3.11 Στο σημειωματάριο
    Ζ1 Χαλαζίας8 MHz1


    Έχετε ερωτήσεις;

    Αναφέρετε ένα τυπογραφικό λάθος

    Κείμενο που θα σταλεί στους συντάκτες μας: