Αναγνώριση ομιλίας με χρήση εφαρμογών επιφάνειας εργασίας .NET. Εξαιρετικά γρήγορη αναγνώριση ομιλίας χωρίς διακομιστές χρησιμοποιώντας ένα πραγματικό παράδειγμα Αναγνώριση ομιλίας εκτός σύνδεσης στο Android 6.0

) χρησιμοποιώντας ένα πραγματικό παράδειγμα Hello World ελέγχου οικιακών συσκευών.
Γιατί οικιακές συσκευές; Ναι, γιατί χάρη σε ένα τέτοιο παράδειγμα μπορείτε να το εκτιμήσετε αυτό ταχύτητα και ακρίβειαπου μπορεί να επιτευχθεί με τη χρήση εντελώς τοπικάαναγνώριση ομιλίας χωρίς διακομιστές όπως Google ASRή Yandex SpeechKit.
Επισυνάπτω επίσης στο άρθρο όλο τον πηγαίο κώδικα του προγράμματος και την ίδια τη συναρμολόγηση για Android.

Γιατί ξαφνικά;

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

Γιατί χρειαζόμαστε οτιδήποτε άλλο εκτός από το Yandex και το Google;

Για αυτήν την πολύ «πρακτική εφαρμογή» επέλεξα το θέμα φωνητικός έλεγχος για έξυπνο σπίτι.
Γιατί ακριβώς αυτό το παράδειγμα; Επειδή δείχνει πολλά πλεονεκτήματα της εντελώς τοπικής αναγνώρισης ομιλίας έναντι της αναγνώρισης χρησιμοποιώντας λύσεις cloud. Και συγκεκριμένα:
  • Ταχύτητα- δεν εξαρτόμαστε από διακομιστές και επομένως δεν εξαρτόμαστε από τη διαθεσιμότητά τους, το εύρος ζώνης κ.λπ. παράγοντες
  • Ακρίβεια- Ο κινητήρας μας λειτουργεί μόνο με το λεξικό που ενδιαφέρει την εφαρμογή μας, αυξάνοντας έτσι την ποιότητα της αναγνώρισης
  • Τιμή- δεν χρειάζεται να πληρώνουμε για κάθε αίτημα στον διακομιστή
  • Ενεργοποίηση φωνής- ως επιπλέον μπόνους στους πρώτους πόντους - μπορούμε συνεχώς να "ακούμε την εκπομπή" χωρίς να σπαταλάμε την επισκεψιμότητα μας και χωρίς να φορτώνουμε τους διακομιστές

Σημείωση

Επιτρέψτε μου να κάνω μια κράτηση αμέσως ότι αυτά τα πλεονεκτήματα μπορούν να θεωρηθούν πλεονεκτήματα μόνο για μια συγκεκριμένη κατηγορία έργων, Που είμαστε ξέρουμε σίγουρα εκ των προτέρων, με ποιο λεξικό και ποια γραμματική θα λειτουργήσει ο χρήστης. Όταν δηλαδή δεν χρειάζεται να αναγνωρίσουμε αυθαίρετο κείμενο (για παράδειγμα, ένα μήνυμα SMS ή ένα ερώτημα αναζήτησης). Διαφορετικά, η αναγνώριση cloud είναι απαραίτητη.

Έτσι το Android μπορεί να αναγνωρίζει την ομιλία χωρίς Διαδίκτυο!
Ναι, ναι... Μόνο στο JellyBean. Και μόνο από μισό μέτρο, όχι παραπάνω. Και αυτή η αναγνώριση είναι η ίδια υπαγόρευση, χρησιμοποιώντας μόνο ένα πολύ μικρότερο μοντέλο. Επομένως, δεν μπορούμε να το διαχειριστούμε ή να το διαμορφώσουμε. Και τι θα μας επιστρέψει την επόμενη φορά είναι άγνωστο. Αν και είναι κατάλληλο για SMS!

Τι κάνουμε?

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

Οι πρακτικές εφαρμογές αφθονούν

Το πρωί, χωρίς να ανοίξεις τα μάτια σου, χτύπησες την παλάμη σου στην οθόνη του smartphone στο κομοδίνο και πρόσταξες «Καλημέρα!» - το σενάριο ξεκινά, η καφετιέρα ανάβει και βουίζει, παίζει ευχάριστη μουσική, οι κουρτίνες ανοίγουν.
Ας κρεμάσουμε ένα φτηνό (2 χιλιάδες, όχι παραπάνω) smartphone στον τοίχο σε κάθε δωμάτιο. Πηγαίνουμε σπίτι μετά τη δουλειά και κουμαντάρουμε στο κενό «Έξυπνο σπίτι! Φώτα, τηλεόραση! - Δεν νομίζω ότι χρειάζεται να πούμε τι θα συμβεί στη συνέχεια.

Μεταγραφές



Η γραμματική περιγράφει τι τι μπορεί να πει ο χρήστης. Για να ξέρει ο Pocketsphinx, Πωςθα το προφέρει, είναι απαραίτητο κάθε λέξη από τη γραμματική να γράφει πώς ακούγεται στο αντίστοιχο γλωσσικό μοντέλο. Αυτό είναι μεταγραφήκάθε λέξη. Ονομάζεται λεξικό.

Οι μεταγραφές περιγράφονται χρησιμοποιώντας μια ειδική σύνταξη. Για παράδειγμα:
έξυπνος uu m n ay j σπίτι d oo m

Κατ 'αρχήν, τίποτα περίπλοκο. Ένα διπλό φωνήεν στη μεταγραφή υποδηλώνει τονισμό. Ένα διπλό σύμφωνο είναι ένα μαλακό σύμφωνο που ακολουθείται από ένα φωνήεν. Όλοι οι δυνατοί συνδυασμοί για όλους τους ήχους της ρωσικής γλώσσας.

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

Ενεργοποίηση φωνής

Αυτή είναι η ικανότητα της μηχανής αναγνώρισης ομιλίας να «ακούει την εκπομπή» όλη την ώρα για να αντιδρά σε μια προκαθορισμένη φράση (ή φράσεις). Ταυτόχρονα, όλοι οι άλλοι ήχοι και ομιλία θα απορριφθούν. Αυτό δεν είναι το ίδιο με το να περιγράφεις τη γραμματική και να ανοίγεις απλώς το μικρόφωνο. Δεν θα παρουσιάσω εδώ τη θεωρία αυτής της εργασίας και τη μηχανική του πώς λειτουργεί. Επιτρέψτε μου απλώς να πω ότι πρόσφατα οι προγραμματιστές που εργάζονταν στο Pocketsphinx εφάρμοσαν μια τέτοια λειτουργία και τώρα είναι διαθέσιμη εκτός συσκευασίας στο API.

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

Ενεργοποίηση αισθητήρα εγγύτητας

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

Ας ξεκινήσουμε την αναγνώριση

Το Pocketsphinx παρέχει ένα βολικό API για τη διαμόρφωση και την εκτέλεση της διαδικασίας αναγνώρισης. Αυτές είναι οι τάξεις SpechRecognizerΚαι SpeechRecognizerSetup.
Έτσι φαίνεται η διαμόρφωση και η εκκίνηση της αναγνώρισης:

PhonMapper phonMapper = νέο PhonMapper(getAssets().open("dict/ru/hotwords")); Γραμματική γραμματική = νέα γραμματική (ονόματα, phonMapper); grammar.addWords(hotword); DataFiles dataFiles = νέα DataFiles(getPackageName(), "ru"); Αρχείο hmmDir = νέο Αρχείο(dataFiles.getHmm()); Αρχείο dict = νέο Αρχείο(dataFiles.getDict()); Αρχείο jsgf = νέο Αρχείο(dataFiles.getJsgf()); copyAssets(hmmDir); saveFile(jsgf, grammar.getJsgf()); saveFile(dict, grammar.getDict()); mRecognizer = SpeechRecognizerSetup.defaultSetup() .setAcousticModel(hmmDir) .setDictionary(dict) .setBoolean("-remove_noise", false) .setKeywordThreshold(1e-7f) .getRecognizer(); mRecognizer.addKeyphraseSearch(KWS_SEARCH, hotword); mRecognizer.addGrammarSearch(COMMAND_SEARCH, jsgf);

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

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

MRecognizer.startLstening(KWS_SEARCH);
Και έτσι αναγνωρίζεται ο λόγος σύμφωνα με μια δεδομένη γραμματική:

MRecognizer.startLstening(COMMAND_SEARCH, 3000);
Το δεύτερο όρισμα (προαιρετικό) είναι ο αριθμός των χιλιοστών του δευτερολέπτου μετά από τα οποία η αναγνώριση θα τερματιστεί αυτόματα εάν κανείς δεν πει τίποτα.
Όπως μπορείτε να δείτε, μπορείτε να χρησιμοποιήσετε μόνο έναν κινητήρα για να λύσετε και τα δύο προβλήματα.

Πώς να λάβετε το αποτέλεσμα αναγνώρισης

Για να λάβετε το αποτέλεσμα αναγνώρισης, πρέπει επίσης να καθορίσετε ένα πρόγραμμα ακρόασης συμβάντων που υλοποιεί τη διεπαφή RecognitionListener.
Έχει πολλές μεθόδους που καλούνται από pocketsphinx όταν συμβαίνει ένα από τα γεγονότα:
  • onBeginningOfSpeech- ο κινητήρας άκουσε κάποιο ήχο, ίσως ήταν ομιλία (ή ίσως όχι)
  • onEndOfSpeech- τελειώνει ο ήχος
  • στο Μερικό Αποτέλεσμα- υπάρχουν ενδιάμεσα αποτελέσματα αναγνώρισης. Για μια φράση ενεργοποίησης, αυτό σημαίνει ότι λειτούργησε. Διαφωνία Υπόθεση
  • στο Αποτέλεσμα- το τελικό αποτέλεσμα της αναγνώρισης. Αυτή η μέθοδος θα κληθεί μετά την κλήση της μεθόδου να σταματήσειστο Αναγνωριστής ομιλίας. Διαφωνία Υπόθεσηπεριέχει δεδομένα αναγνώρισης (συμβολοσειρά και παρτιτούρα)

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

@Override δημόσιο κενό onEndOfSpeech() ( Log.d(TAG, "onEndOfSpeech"); if (mRecognizer.getSearchName().equals(COMMAND_SEARCH)) ( mRecognizer.stop(); ) ) @Override public void ( if (hypothesis == null) επιστροφή; String text = hypothesis.getHypstr(); if (KWS_SEARCH.equals(mRecognizer.getSearchName())) (startRecognition(); ) else (Log.d(TAG, text); ) ) @Override public void onResult(Υπόθεση Υπόθεσης) ( mMicView.setBackgroundResource(R.drawable.background_big_mic); mHandler.removeCallbacks(mStopRecognitionCallback); Κείμενο συμβολοσειράς = υπόθεση != null ? hypothesis. , "onResult " + text); if (COMMAND_SEARCH.equals(mRecognizer.getSearchName())) ( if (text != null) ( Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); process(text ); ) mRecognizer.startListening(KWS_SEARCH); ) )

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

Ιδιωτικό συγχρονισμένο κενό startRecognition() ( if (mRecognizer == null || COMMAND_SEARCH.equals(mRecognizer.getSearchName())) επιστρέφει; mRecognizer.cancel(); νέο ToneGenerator(AudioManager.STREAMneGeneratoronest.MEX). TONE_CDMA_PIP, 200); post(400, new Runnable() ( @Override public void run() ( mMicView.setBackgroundResource(R.drawable.background_big_mic_green); mRecognizer.startListening(COMMAND_SEARCH, "LoListend(TAG)); εντολές"); post(4000, mStopRecognitionCallback); ) )); )
Εδώ παίζουμε πρώτα ένα μικρό σήμα για να ειδοποιήσουμε τον χρήστη ότι τον ακούσαμε και είμαστε έτοιμοι για την εντολή του. Κατά τη διάρκεια αυτής της περιόδου, το μικρόφωνο θα πρέπει να είναι απενεργοποιημένο. Επομένως, ξεκινάμε την αναγνώριση μετά από ένα μικρό χρονικό όριο (λίγο μεγαλύτερο από τη διάρκεια του σήματος, για να μην ακούμε την ηχώ του). Ξεκινά επίσης ένα νήμα που θα σταματήσει αναγκαστικά την αναγνώριση εάν ο χρήστης μιλήσει για πολύ καιρό. Σε αυτή την περίπτωση είναι 3 δευτερόλεπτα.

Πώς να μετατρέψετε την αναγνωρισμένη συμβολοσειρά σε εντολές

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

Πώς να συνθέσετε την ομιλία

Η σύνθεση του λόγου είναι η αντίστροφη λειτουργία της αναγνώρισης. Εδώ συμβαίνει το αντίστροφο - πρέπει να μετατρέψετε μια γραμμή κειμένου σε ομιλία, ώστε ο χρήστης να μπορεί να την ακούσει.
Στην περίπτωση του θερμοστάτη, πρέπει να κάνουμε τη συσκευή μας Android να μιλάει την τρέχουσα θερμοκρασία. Χρησιμοποιώντας το API Κείμενο σε ομιλίααυτό είναι πολύ εύκολο να γίνει (ευχαριστώ την Google για το υπέροχο γυναικείο TTS για τη ρωσική γλώσσα):

Ιδιωτικό void speak(Κείμενο συμβολοσειράς) ( συγχρονισμένο (mSpeechQueue) (mRecognizer.stop(); mSpeechQueue.add(text); HashMap params = νέο HashMap (2); params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, UUID.randomUUID().toString()); params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC)); params.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true"); mTextToSpeech.speak(κείμενο, TextToSpeech.QUEUE_ADD, παράμετροι); ) )

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

Ιδιωτικό τελικό TextToSpeech.OnUtteranceCompletedListener mUtteranceCompletedListener = νέο TextToSpeech.OnUtteranceCompletedListener() ( @Override public void onUtteranceCompleted(String utteranceId) (συγχρονισμένο (mSpeechQuemepeuell) mpty()) ( mRecognizer.startListening( KWS_SEARCH) ;) ) ) );

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

Και είναι όλα;

Ναί! Όπως μπορείτε να δείτε, η γρήγορη και αποτελεσματική αναγνώριση ομιλίας απευθείας στη συσκευή δεν είναι καθόλου δύσκολη, χάρη στην παρουσία τέτοιων υπέροχων έργων όπως το Pocketsphinx. Παρέχει ένα πολύ βολικό API που μπορεί να χρησιμοποιηθεί για την επίλυση προβλημάτων που σχετίζονται με την αναγνώριση φωνητικών εντολών.

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

  • φωνητικός έλεγχος
  • μηχανή φωνής
  • Προσθέστε ετικέτες

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

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

    Η μετάφραση ομιλίας σε κείμενο είναι χρήσιμη

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

    Θα περιγράψουμε τα πιο αποτελεσματικά εργαλεία που είναι διαθέσιμα σε υπολογιστές, εφαρμογές για κινητά και διαδικτυακές υπηρεσίες.

    1 Ιστότοπος speakpad.ru

    Αυτή είναι μια διαδικτυακή υπηρεσία που σας επιτρέπει να μεταφράζετε ομιλία σε κείμενο χρησιμοποιώντας το πρόγραμμα περιήγησης Google Chrome. Η υπηρεσία λειτουργεί με μικρόφωνο και έτοιμα αρχεία. Φυσικά, η ποιότητα θα είναι πολύ υψηλότερη αν χρησιμοποιήσετε εξωτερικό μικρόφωνο και υπαγορεύσετε τον εαυτό σας. Ωστόσο, η υπηρεσία κάνει καλή δουλειά ακόμη και με βίντεο YouTube.

    Κάντε κλικ στο "Ενεργοποίηση εγγραφής", απαντήστε στην ερώτηση σχετικά με τη "Χρήση μικροφώνου" - για να το κάνετε αυτό, κάντε κλικ στο "Να επιτρέπεται".

    Οι εκτενείς οδηγίες σχετικά με τη χρήση της υπηρεσίας μπορούν να συμπτυχθούν κάνοντας κλικ στο κουμπί 1 στην Εικ. 3. Μπορείτε να απαλλαγείτε από τη διαφήμιση ολοκληρώνοντας μια απλή εγγραφή.

    Ρύζι. 3. Υπηρεσία Speechpad

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

    Λίστα μαθημάτων βίντεο σχετικά με την εργασία με το speakpad:

    Μπορείτε να μεταγράψετε βίντεο από το Youtube ή από τον υπολογιστή σας, ωστόσο, θα χρειαστείτε ένα μίκτη, περισσότερες λεπτομέρειες:

    Βίντεο "ηχητική μεταγραφή"

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

    2 Υπαγόρευση υπηρεσίας.io

    Μια υπέροχη διαδικτυακή υπηρεσία που σας επιτρέπει να μεταφράζετε την ομιλία σε κείμενο δωρεάν και εύκολα.

    Ρύζι. 4. Υπαγόρευση υπηρεσίας.io

    1 στο Σχ. 4 – Η ρωσική γλώσσα μπορεί να επιλεγεί στο τέλος της σελίδας. Στο πρόγραμμα περιήγησης Google Chrome, η γλώσσα είναι επιλεγμένη, αλλά για κάποιο λόγο στο Mozilla δεν υπάρχει τέτοια επιλογή.

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

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

    3 RealSpeaker

    Αυτό το πρόγραμμα σάς επιτρέπει να μεταφράζετε εύκολα την ανθρώπινη ομιλία σε κείμενο. Έχει σχεδιαστεί για να λειτουργεί σε διαφορετικά συστήματα: Windows, Android, Linux, Mac. Με τη βοήθειά του, μπορείτε να μετατρέψετε την ομιλία που ακούγεται σε μικρόφωνο (για παράδειγμα, μπορεί να ενσωματωθεί σε φορητό υπολογιστή), καθώς και να εγγραφεί σε αρχεία ήχου.

    Μπορεί να καταλάβει 13 γλώσσες του κόσμου. Υπάρχει μια έκδοση beta του προγράμματος που λειτουργεί ως διαδικτυακή υπηρεσία:

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

    Το 2017 υπήρχε μια δωρεάν επιλογή μεταγραφής χρησιμοποιώντας το RealSpeaker, αλλά το 2018 δεν υπάρχει τέτοια επιλογή. Είναι πολύ μπερδεμένο το γεγονός ότι το αρχείο μεταγραφής είναι διαθέσιμο σε όλους τους χρήστες για λήψη· ίσως αυτό να βελτιωθεί.

    Οι επαφές του προγραμματιστή (VKontakte, Facebook, Youtube, Twitter, email, τηλέφωνο) του προγράμματος βρίσκονται στη σελίδα του ιστότοπού του (ακριβέστερα, στο υποσέλιδο του ιστότοπου):

    4 Speechlogger

    Μια εναλλακτική σε σχέση με την προηγούμενη εφαρμογή για κινητές συσκευές που εκτελούνται σε Android. Διατίθεται δωρεάν στο app store:

    Το κείμενο επεξεργάζεται αυτόματα και προστίθενται σημεία στίξης. Πολύ βολικό για να υπαγορεύετε σημειώσεις στον εαυτό σας ή να κάνετε λίστες. Ως αποτέλεσμα, το κείμενο θα είναι πολύ αξιοπρεπούς ποιότητας.

    5 Υπαγόρευση του Δράκου

    Αυτή είναι μια εφαρμογή που διανέμεται δωρεάν για φορητές συσκευές από την Apple.

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

    Η εφαρμογή Dragon Dictation χρησιμοποιείται από τους ιδιοκτήτες, για παράδειγμα, για να υπαγορεύουν μια λίστα αγορών σε ένα κατάστημα ενώ μετακινούνται στο διαμέρισμα. Όταν φτάσω εκεί, μπορώ να κοιτάξω το κείμενο στη σημείωση και δεν χρειάζεται να ακούσω.

    Όποιο πρόγραμμα κι αν χρησιμοποιείτε στην πρακτική σας, να είστε έτοιμοι να ελέγξετε ξανά τα αποτελέσματα και να κάνετε ορισμένες προσαρμογές. Αυτός είναι ο μόνος τρόπος για να αποκτήσετε ένα άψογο κείμενο χωρίς σφάλματα.

    Επίσης χρήσιμες υπηρεσίες:

    Λάβετε τα πιο πρόσφατα άρθρα παιδείας υπολογιστών απευθείας στα εισερχόμενά σας.
    Ήδη περισσότερα 3.000 συνδρομητές

    .

    Προϊόντα και τεχνολογίες:

    Visual Studio, C#, .NET Speech Libraries

    Το άρθρο συζητά:

    • προσθήκη υποστήριξης αναγνώρισης ομιλίας στην εφαρμογή της κονσόλας.
    • επεξεργασία αναγνωρισμένης ομιλίας.
    • εγκατάσταση βιβλιοθηκών αναγνώρισης ομιλίας.
    • σύγκριση των Microsoft.Speech και System.Speech.
    • Προσθήκη υποστήριξης αναγνώρισης ομιλίας σε μια εφαρμογή Windows Forms.

    Με την εμφάνιση του Windows Phone Cortana, ενός προσωπικού βοηθού που ενεργοποιείται με ομιλία (καθώς και ενός αντίστοιχου εταιρειών φρούτων για το οποίο δεν μπορούμε να μιλήσουμε μάταια), οι εφαρμογές με δυνατότητα ομιλίας γίνονται όλο και πιο εμφανείς στην ανάπτυξη λογισμικού. Σε αυτό το άρθρο, θα σας δείξω πώς να ξεκινήσετε με την αναγνώριση και τη σύνθεση ομιλίας σε εφαρμογές κονσόλας Windows, εφαρμογές φορμών Windows και Windows Presentation Foundation (WPF).

    Σημειώστε ότι μπορείτε επίσης να προσθέσετε δυνατότητες ομιλίας σε εφαρμογές Windows Phone, εφαρμογές web ASP.NET, εφαρμογές Windows Store, Windows RT και Xbox Kinect, αλλά οι τεχνικές διαφέρουν από αυτές που αναφέρονται σε αυτό το άρθρο.

    Ένας καλός τρόπος για να πάρετε μια ιδέα για το τι ακριβώς θα συζητήσει αυτό το άρθρο είναι να δείτε τα στιγμιότυπα οθόνης δύο διαφορετικών προγραμμάτων επίδειξης στο ρύζι. 1Και 2 . Μετά την εκκίνηση της εφαρμογής της κονσόλας ρύζι. 1λέει αμέσως τη φράση «Είμαι ξύπνιος». Φυσικά, δεν θα μπορείτε να ακούσετε την εφαρμογή επίδειξης ενώ διαβάζετε αυτό το άρθρο, επομένως εμφανίζει το κείμενο αυτού που λέει ο υπολογιστής. Στη συνέχεια, ο χρήστης λέει την εντολή "Ομιλία σε". Η εφαρμογή επίδειξης απαντά με αναγνωρισμένο κείμενο και στη συνέχεια ακούει εσωτερικά και απαντά σε αιτήματα για προσθήκη δύο αριθμών.

    Ρύζι. 1. Αναγνώριση και σύνθεση ομιλίας σε εφαρμογή κονσόλας


    Ρύζι. 2. Αναγνώριση ομιλίας σε μια εφαρμογή Windows Forms

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

    Στη συνέχεια, ο χρήστης είπε "Speech off", μια φωνητική εντολή που απενεργοποιεί την ακρόαση των εντολών προσθήκης, αλλά δεν απενεργοποιεί πλήρως την αναγνώριση ομιλίας. Μετά από αυτή τη λεκτική εντολή, η επόμενη εντολή για προσθήκη ενός και δύο αγνοήθηκε. Τέλος, ο χρήστης ενεργοποίησε ξανά την ακρόαση εντολών και πρόφερε την ανούσια εντολή «Klatu barada nikto», την οποία η εφαρμογή αναγνώρισε ως εντολή για την πλήρη απενεργοποίηση της αναγνώρισης ομιλίας και τον τερματισμό της.

    Επί ρύζι. 2εμφανίζει μια εφαρμογή Φόρμες Windows με ενεργοποιημένη εικονική ομιλία. Αυτή η εφαρμογή αναγνωρίζει προφορικές εντολές, αλλά δεν ανταποκρίνεται σε αυτές με έξοδο φωνής. Όταν ξεκινήσατε για πρώτη φορά την εφαρμογή, το πλαίσιο ελέγχου Speech On δεν ήταν επιλεγμένο, υποδεικνύοντας ότι η αναγνώριση ομιλίας δεν ήταν ενεργή. Ο χρήστης έλεγξε αυτό το πλαίσιο ελέγχου και στη συνέχεια είπε "Γεια". Η εφαρμογή ανταποκρίθηκε εμφανίζοντας το αναγνωρισμένο κείμενο στο στοιχείο ελέγχου ListBox στο κάτω μέρος του παραθύρου.

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

    Στη συνέχεια, ο χρήστης είπε: "Παρακαλώ ορίστε το πλαίσιο κειμένου 1 σε λευκό". Η εφαρμογή το αναγνώρισε ως "ορισμός πλαισίου κειμένου 1 λευκό" και έκανε ακριβώς αυτό. Ο χρήστης ολοκλήρωσε λέγοντας, "Αντίο" και η εφαρμογή εμφάνισε αυτό το κείμενο, αλλά δεν έκανε τίποτα με τις Φόρμες των Windows, αν και θα μπορούσε να είχε καθαρίσει το πλαίσιο ελέγχου Speech On, για παράδειγμα.

    Η χρήση του αντικειμένου συνθεσάιζερ είναι αρκετά απλή.

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

    Προσθήκη υποστήριξης αναγνώρισης ομιλίας σε μια εφαρμογή κονσόλας

    Για να δημιουργήσετε το demo που εμφανίζεται στο ρύζι. 1, ξεκίνησα το Visual Studio και δημιούργησα μια νέα εφαρμογή κονσόλας C# που ονομάζεται ConsoleSpeech. Έχω χρησιμοποιήσει επιτυχώς εργαλεία ομιλίας με το Visual Studio 2010 και 2012, αλλά οποιαδήποτε σχετικά πρόσφατη έκδοση θα είναι καλή. Μετά τη φόρτωση του κώδικα προτύπου στο πρόγραμμα επεξεργασίας, μετονόμασα το αρχείο Program.cs στο παράθυρο Εξερεύνηση λύσεων στο πιο περιγραφικό ConsoleSpeechProgram.cs και το Visual Studio μετονόμασε την κλάση Program για μένα.

    Στη συνέχεια, πρόσθεσα έναν σύνδεσμο στο αρχείο Microsoft.Speech.dll, το οποίο βρίσκεται στο C:\ProgramFiles (x86)\Microsoft SDKs\Speech\v11.0\Assembly. Αυτό το DLL έλειπε από τον υπολογιστή μου και έπρεπε να το κατεβάσω. Η εγκατάσταση των αρχείων που απαιτούνται για την προσθήκη αναγνώρισης και σύνθεσης ομιλίας σε μια εφαρμογή δεν είναι τόσο ασήμαντη. Θα εξηγήσω τη διαδικασία εγκατάστασης λεπτομερώς στην επόμενη ενότητα, αλλά προς το παρόν ας υποθέσουμε ότι το Microsoft.Speech.dll βρίσκεται στο σύστημά σας.

    Προσθέτοντας μια αναφορά στο DLL ομιλίας, αφαίρεσα όλες τις εντολές χρήσης από την κορυφή του κώδικα εκτός από αυτήν που έδειχνε τον χώρο ονομάτων συστήματος ανώτατου επιπέδου. Στη συνέχεια πρόσθεσα χρησιμοποιώντας δηλώσεις για τους χώρους ονομάτων Microsoft.Speech.Recognition, Microsoft.Speech.Synthesis και System.Globalization. Οι δύο πρώτοι χώροι ονομάτων αντιστοιχίζονται στο DLL ομιλίας. Σημειώστε ότι υπάρχουν επίσης χώροι ονομάτων όπως System.Speech.Recognition και System.Speech.Synthesis, που μπορεί να προκαλέσουν σύγχυση. Θα εξηγήσω τη διαφορά μεταξύ τους σύντομα. Ο χώρος ονομάτων της Παγκοσμιοποίησης ήταν διαθέσιμος από προεπιλογή και δεν απαιτούσε την προσθήκη νέας αναφοράς στο έργο.

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

    Ρύζι. 3. Πηγαίος κώδικας εφαρμογής κονσόλας επίδειξης

    χρησιμοποιώντας το σύστημα. χρησιμοποιώντας Microsoft.Speech.Recognition. χρησιμοποιώντας το Microsoft.Speech.Synthesis; χρησιμοποιώντας System.Globalization; namespace ConsoleSpeech ( class ConsoleSpeechProgram ( static SpeechSynthesizer ss = new SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool done = false; static bool speechOn = true; static void Main(Astring args.Wice. eLine ("\n(Speaking: είμαι ξύπνιος)"); ss.Speak("Είμαι ξύπνιος"); CultureInfo ci = νέο CultureInfo("en-us"); sre = νέο SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice( ; sre.Speechrecognized += sre_Speechrecognized; επιλογές ch_startstopcommands = Νέες Επιλογές (); ch_startstopcommands.add ("Speech on"); ch_startstopcommands.add ("S Peech Off "); ch_startstopcommands = New Choices (); StartStop = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Γραμματική g_StartStop = new Grammar(gb_StartStop); Choices ch_Numbers = new Choices(); ch_Numbers.Add("1"); ch_ddch._"Numbers. Add("3"); ch_Numbers.Add("4"); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Τι είναι"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("συν"); gb_WhatIsXplusY.Append(ch_Numbers); Γραμματική g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY); sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple); while (done == false) ( ; ) Console.WriteLine("\nHit< enter >για κλείσιμο του κελύφους\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Main static void sre_SpeechRecognized(object sender, SpeechRecognizedE ) ( συμβολοσειρά txt = e.Result.Text; float εμπιστοσύνη = e.Result.Confidence; Console.WriteLine("\nΑναγνωρίστηκε: " + txt); if (εμπιστοσύνη< 0.60) return; if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Η ομιλία είναι τώρα ΕΝΕΡΓΟΠΟΙΗΣΗ"); speakOn = true; ) if (txt.IndexOf("speech off") >= 0) ( Console.WriteLine("Η ομιλία είναι τώρα ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ"); speakOn = false; ) if (speechOn == false) return; if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) (((SpeechRecognitionEngine)sender). RecognizeAsyncCancel(); done = true; Console.WriteLine(":(Speaking) Αντίο)"); ss.Speak("Αποχαιρετισμός"); ) if (txt.IndexOf("Τι") >= 0 && txt.IndexOf("συν") >= 0) ( λέξεις συμβολοσειράς = txt.Split(" "); int num1 = int.Parse(λέξεις); int num2 = int.Parse(λέξεις); int sum = num1 + num2; Console.WriteLine("(Ομιλία: " + λέξεις + " συν " + λέξεις + " ισούται " + sum + ")"); ss.SpeakAsync(λέξεις + " συν " + λέξεις + " ισούται με " + άθροισμα); ) ) // sre_SpeechRecognized ) // Πρόγραμμα ) // ns

    Μετά τις δηλώσεις χρήσης, ο κώδικας επίδειξης ξεκινά ως εξής:

    namespace ConsoleSpeech ( class ConsoleSpeechProgram ( static SpeechSynthesizer ss = new SpeechSynthesizer(); static SpeechRecognitionEngine sre; static bool done = false; static bool speechOn = true; static void Main (args string) (...

    Το αντικείμενο SpeechSynthesizer, σε επίπεδο κλάσης, επιτρέπει σε μια εφαρμογή να συνθέτει ομιλία. Το αντικείμενο SpeechRecognitionEngine επιτρέπει σε μια εφαρμογή να ακούει και να αναγνωρίζει προφορικές λέξεις ή φράσεις. Η μεταβλητή boolean done καθορίζει πότε θα τερματιστεί ολόκληρη η εφαρμογή. Η μεταβλητή speakOn boolean ελέγχει εάν η εφαρμογή ακούει οποιεσδήποτε εντολές εκτός από την εντολή για έξοδο από το πρόγραμμα.

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

    Η κύρια μέθοδος ξεκινά ως εξής:

    try ( ss.SetOutputToDefaultAudioDevice(); Console.WriteLine("\n(Μιλώντας: είμαι ξύπνιος)"); ss.Speak("Είμαι ξύπνιος");

    Μια παρουσία του αντικειμένου SpeechSynthesizer δημιουργήθηκε όταν δηλώθηκε. Η χρήση του αντικειμένου συνθεσάιζερ είναι αρκετά απλή. Η μέθοδος SetOutputToDefaultAudioDevice στέλνει έξοδο σε ηχεία που είναι συνδεδεμένα στον υπολογιστή σας (μπορείτε επίσης να στείλετε έξοδο σε ένα αρχείο). Η μέθοδος Speak παίρνει μια συμβολοσειρά και μετά την εκφωνεί. Τόσο εύκολο είναι.

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

    CultureInfo ci = new CultureInfo("en-us"); sre = new SpeechRecognitionEngine(ci); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized;

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

    Η βασική μέθοδος για το αντικείμενο αναγνώρισης είναι ο χειριστής συμβάντων SpeechRecognized. Όταν χρησιμοποιείτε το Visual Studio, εάν πληκτρολογήσετε "sre.SpeechRecognized +=" και περιμένετε ένα κλάσμα του δευτερολέπτου, το IntelliSense θα τερματίσει αυτόματα την έκφρασή σας με το όνομα του χειριστή συμβάντων - sre_SpeechRecognized. Σας προτείνω να πατήσετε το πλήκτρο Tab για να αποδεχτείτε την πρόταση και να χρησιμοποιήσετε αυτό το όνομα ως προεπιλογή.

    Επιλογές ch_Numbers = new Choices(); ch_Numbers.Add("1"); ch_Numbers.Add("2"); ch_Numbers.Add("3"); ch_Numbers.Add("4"); // από τεχνική άποψη, // αυτό είναι Add(new string ( "4" )); GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Τι είναι"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("συν"); gb_WhatIsXplusY.Append(ch_Numbers); Γραμματική g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Τα τρία κύρια αντικείμενα εδώ είναι το σύνολο Επιλογών, το πρότυπο GrammarBuilder και το στοιχείο ελέγχου Γραμματικής. Όταν δημιουργώ μια Γραμματική για αναγνώριση, ξεκινώ αναφέροντας ορισμένα συγκεκριμένα παραδείγματα για το τι πρέπει να αναγνωρίσω. Ας πούμε, "Τι είναι το ένα συν δύο;" και "Τι είναι τρία συν τέσσερα;"

    Στη συνέχεια ορίζω το αντίστοιχο γενικό πρότυπο, για παράδειγμα «Τι είναι συν ?. Το πρότυπο είναι ένα GrammarBuilder και οι συγκεκριμένες τιμές που μεταβιβάζονται στο πρότυπο είναι ένα σύνολο Επιλογών. Το αντικείμενο Γραμματικής ενσωματώνει το πρότυπο και τις Επιλογές.

    Στο πρόγραμμα επίδειξης, περιορίζω τις προσθήκες σε 1 έως 4 και τις προσθέτω ως συμβολοσειρές στο σύνολο Επιλογών. Πιο αποτελεσματική προσέγγιση:

    αριθμοί συμβολοσειρών = νέα συμβολοσειρά ("1", "2", "3", "4"); Επιλογές ch_Numbers = new Choices(numbers);

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

    Η δημιουργία ενός συνόλου Επιλογών από διαδοχικούς αριθμούς είναι κάπως ειδική περίπτωση και επιτρέπει μια προγραμματική προσέγγιση όπως:

    Αριθμοί συμβολοσειρών = νέα συμβολοσειρά. για (int i = 0; i< 100; ++i) numbers[i] = i.ToString(); Choices ch_Numbers = new Choices(numbers);

    Μετά τη δημιουργία Επιλογών για την πλήρωση των υποδοχών του GrammarBuilder, το πρόγραμμα επίδειξης δημιουργεί ένα GrammarBuilder και στη συνέχεια μια ελεγκτική Γραμματική:

    GrammarBuilder gb_WhatIsXplusY = new GrammarBuilder(); gb_WhatIsXplusY.Append("Τι είναι"); gb_WhatIsXplusY.Append(ch_Numbers); gb_WhatIsXplusY.Append("συν"); gb_WhatIsXplusY.Append(ch_Numbers); Γραμματική g_WhatIsXplusY = new Grammar(gb_WhatIsXplusY);

    Το πρόγραμμα επίδειξης χρησιμοποιεί ένα παρόμοιο πρότυπο για τη δημιουργία της Γραμματικής για τις εντολές έναρξης και διακοπής:

    Επιλογές ch_StartStopCommands = new Choices(); ch_StartStopCommands.Add("speech on"); ch_StartStopCommands.Add("speech off"); ch_StartStopCommands.Add("klatu barada nikto"); GrammarBuilder gb_StartStop = new GrammarBuilder(); gb_StartStop.Append(ch_StartStopCommands); Γραμματική g_StartStop = νέα Γραμματική(gb_StartStop);

    Οι γραμματικές μπορούν να οριστούν πολύ ευέλικτα. Εδώ οι εντολές “speech on”, “speech off” και “klatu barada nikto” τοποθετούνται σε μία γραμματική, αφού σχετίζονται λογικά. Αυτές οι τρεις εντολές θα μπορούσαν να οριστούν σε τρεις διαφορετικές γραμματικές ή οι εντολές "speech on" και "speech off" θα μπορούσαν να τοποθετηθούν σε μία γραμματική και η εντολή "klatu barada nikto" σε μια δεύτερη.

    Αφού δημιουργήσετε όλα τα αντικείμενα Γραμματικής, τα τοποθετείτε στον αναγνωριστικό ομιλίας και ενεργοποιείται η αναγνώριση ομιλίας:

    sre.LoadGrammarAsync(g_StartStop); sre.LoadGrammarAsync(g_WhatIsXplusY); sre.RecognizeAsync(RecognizeMode.Multiple);

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

    while (done == false) ( ; ) Console.WriteLine("\nHit< enter >για κλείσιμο του κελύφους\n"); Console.ReadLine(); ) catch (Exception ex) ( Console.WriteLine(ex.Message); Console.ReadLine(); ) ) // Main

    Ένας παράξενος βρόχος κενός while σάς επιτρέπει να διατηρείτε το κέλυφος μιας εφαρμογής κονσόλας σε λειτουργία. Ο βρόχος θα ολοκληρωθεί όταν η μεταβλητή boolean σε επίπεδο κλάσης done οριστεί σε true από τον χειριστή συμβάντων αναγνώρισης ομιλίας.

    Αναγνωρισμένη επεξεργασία ομιλίας

    Ο κώδικας για το χειρισμό συμβάντων αναγνώρισης ομιλίας ξεκινά ως εξής:

    static void sre_SpeechRecognized(Αποστολέας αντικειμένου, SpeechRecognizedEventArgs e) ( συμβολοσειρά txt = e.Result.Text; float εμπιστοσύνη = e.Result.Confidence; Console.WriteLine("\nΑναγνωρίζεται: " (εμπιστοσύνη) εάν);< 0.60) return; ...

    Το αναγνωρισμένο κείμενο αποθηκεύεται στην ιδιότητα Result.Text του αντικειμένου SpeechRecognizedEventArgs. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το σύνολο Result.Words. Η ιδιότητα Result.Confidence αποθηκεύει μια τιμή μεταξύ 0,0 και 1,0, η οποία είναι μια κατά προσέγγιση εκτίμηση του πόσο καλά ταιριάζει το προφορικό κείμενο με οποιαδήποτε από τις γραμματικές που σχετίζονται με τον αναγνωριστικό. Το πρόγραμμα επίδειξης δίνει εντολή στον χειριστή συμβάντων να αγνοήσει το κείμενο με χαμηλή εμπιστοσύνη στο αναγνωρισμένο κείμενο.

    Οι τιμές εμπιστοσύνης ποικίλλουν σημαντικά ανάλογα με την πολυπλοκότητα των γραμματικών σας, την ποιότητα του μικροφώνου και άλλους παράγοντες. Για παράδειγμα, εάν το πρόγραμμα επίδειξης χρειάζεται μόνο να αναγνωρίσει τους αριθμούς 1 έως 4, οι τιμές εμπιστοσύνης στον υπολογιστή μου είναι συνήθως περίπου 0,75. Αλλά, εάν η γραμματική πρέπει να αναγνωρίσει αριθμούς από το 1 έως το 100, οι τιμές εμπιστοσύνης πέφτουν περίπου στο 0,25. Με λίγα λόγια, θα πρέπει γενικά να πειραματιστείτε με τιμές εμπιστοσύνης για να επιτύχετε καλά αποτελέσματα αναγνώρισης ομιλίας.

    if (txt.IndexOf("speech on") >= 0) ( Console.WriteLine("Speech is now ON"); speechOn = true; ) if (txt.IndexOf("speech off") >= 0) (Κονσόλα .WriteLine("Η ομιλία είναι τώρα ΑΠΕΝΕΡΓΟΠΟΙΗΜΕΝΗ"); speakOn = false; ) if (speechOn == false) return;

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

    if (txt.IndexOf("klatu") >= 0 && txt.IndexOf("barada") >= 0) ( ((SpeechRecognitionEngine)sender).RecognizeAsyncCancel(); done = true; Console.WriteLine(":(Speaking) Αντίο)"); ss.Speak("Αντίο"); )

    Σημειώστε ότι η μηχανή αναγνώρισης ομιλίας μπορεί πραγματικά να αναγνωρίσει ανοησίες. Εάν ένα αντικείμενο Γραμματικής περιέχει λέξεις που δεν βρίσκονται στο ενσωματωμένο λεξικό του αντικειμένου, η Γραμματική προσπαθεί να αναγνωρίσει αυτές τις λέξεις χρησιμοποιώντας σημασιολογική ευρετική, αν είναι δυνατόν, και συνήθως είναι αρκετά επιτυχημένη. Γι' αυτό χρησιμοποίησα το "klatu" αντί για το σωστό "klaatu" (από παλιά ταινία επιστημονικής φαντασίας).

    Σημειώστε επίσης ότι δεν απαιτείται να επεξεργαστείτε όλο το κείμενο που αναγνωρίζεται από τη Γραμματική ("klatu barada nikto") - απλά πρέπει να έχετε αρκετές πληροφορίες για να προσδιορίσετε μοναδικά τη γραμματική φράση ("klatu" και "barada").

    Αν (txt.IndexOf("Τι") >= 0 && txt.IndexOf("συν") >= 0) ( λέξεις συμβολοσειράς = txt.Split(" "); int num1 = int.Parse(λέξεις); int num2 = int.Parse(λέξεις); int sum = num1 + num2; Console.WriteLine("(Ομιλία: " + λέξεις + " συν " + λέξεις + " ισούται με " + άθροισμα + ")"); ss.SpeakAsync(λέξεις + " συν " + λέξεις + " ισούται με " + άθροισμα); ) ) // sre_SpeechRecognized ) // Πρόγραμμα ) // ns

    Σημειώστε ότι το κείμενο στο Results.Text κάνει διάκριση πεζών-κεφαλαίων ("Τι" και "τι"). Έχοντας αναγνωρίσει μια φράση, μπορεί να αναλυθεί σε συγκεκριμένες λέξεις. Σε αυτήν την περίπτωση, το αναγνωρισμένο κείμενο είναι της μορφής "Τι είναι x συν y", επομένως το "Τι" τοποθετείται σε λέξεις και οι δύο προστιθέμενοι αριθμοί (ως συμβολοσειρές) αποθηκεύονται σε λέξεις και λέξεις.

    Εγκατάσταση βιβλιοθηκών

    Η επεξήγηση του προγράμματος επίδειξης προϋποθέτει ότι όλες οι απαραίτητες βιβλιοθήκες ομιλίας είναι εγκατεστημένες στον υπολογιστή σας. Για να δημιουργήσετε και να εκτελέσετε προγράμματα επίδειξης, πρέπει να εγκαταστήσετε τέσσερα πακέτα: το SDK (παρέχει τη δυνατότητα δημιουργίας επιδείξεων στο Visual Studio), το χρόνο εκτέλεσης (εκτελεί τις επιδείξεις μετά τη δημιουργία τους) και τις γλώσσες που αναγνωρίζονται και συντίθενται (προφέρονται).

    Για να εγκαταστήσετε το SDK, αναζητήστε στο Διαδίκτυο το "Speech Platform 11 SDK". Αυτό θα σας μεταφέρει στη σωστή σελίδα στο Κέντρο λήψης της Microsoft ( ρύζι. 4). Κάνοντας κλικ στο κουμπί Λήψη θα δείτε τις επιλογές που εμφανίζονται ρύζι. 5. Το SDK διατίθεται σε εκδόσεις 32 και 64 bit. Σας συμβουλεύω ανεπιφύλακτα να χρησιμοποιήσετε την έκδοση 32-bit ανεξάρτητα από το μέγεθος bit του συστήματός σας. Η έκδοση 64-bit δεν λειτουργεί με ορισμένες εφαρμογές.


    Ρύζι. 4. Κύρια σελίδα εγκατάστασης SDK στο Κέντρο λήψης της Microsoft


    Ρύζι. 5. Εγκαταστήστε το Speech SDK

    Δεν χρειάζεστε τίποτα περισσότερο από ένα μόνο αρχείο .msi κάτω από το x86 (για συστήματα 32-bit). Επιλέγοντας αυτό το αρχείο και κάνοντας κλικ στο Επόμενο, μπορείτε να εκτελέσετε το πρόγραμμα εγκατάστασης απευθείας από εδώ. Οι βιβλιοθήκες ομιλίας δεν παρέχουν πολλά σχόλια σχετικά με το πότε ολοκληρώνεται η εγκατάσταση, επομένως μην ψάχνετε για μηνύματα επιτυχίας.


    Ρύζι. 6. Εγκατάσταση του περιβάλλοντος χρόνου εκτέλεσης

    Είναι εξαιρετικά σημαντικό να επιλέξετε την ίδια έκδοση πλατφόρμας (11 στην επίδειξη) και βάθος bit (32 ή 64) με το SDK. Και πάλι, συνιστώ ανεπιφύλακτα την έκδοση 32 bit, ακόμα κι αν εκτελείτε σύστημα 64 bit.

    Στη συνέχεια, μπορείτε να ορίσετε τη γλώσσα αναγνώρισης. Η σελίδα λήψης παρέχεται στη διεύθυνση ρύζι. 7. Το πρόγραμμα επίδειξης χρησιμοποιεί το αρχείο MSSpeech_SR_en-us_TELE.msi (Αγγλικά-ΗΠΑ). Το SR σημαίνει αναγνώριση ομιλίας και το TELE σημαίνει τηλεφωνία. Αυτό σημαίνει ότι η αναγνωρισμένη γλώσσα έχει σχεδιαστεί για να λειτουργεί με είσοδο ήχου χαμηλής ποιότητας, όπως από μικρόφωνο τηλεφώνου ή επιτραπέζιου υπολογιστή.


    Ρύζι. 7. Ορισμός αναγνωρισμένης γλώσσας

    Τέλος, μπορείτε να ορίσετε τη γλώσσα και τη φωνή για τη σύνθεση ομιλίας. Η σελίδα λήψης παρέχεται στη διεύθυνση ρύζι. 8. Το πρόγραμμα επίδειξης χρησιμοποιεί το αρχείο MSSpeech_TTS_en-us_Helen.msi. Το TTS (text-to-speech) είναι ουσιαστικά συνώνυμο με τη σύνθεση ομιλίας. Σημειώστε τις δύο διαθέσιμες φωνές English, U.S. Υπάρχουν και άλλες αγγλικές φωνές, αλλά όχι οι Η.Π.Α. Η δημιουργία αρχείων γλώσσας σύνθεσης είναι ένα πολύ δύσκολο έργο. Ωστόσο, μπορείτε να αγοράσετε και να εγκαταστήσετε άλλες φωνές από διάφορες εταιρείες.


    Ρύζι. 8. Ρύθμιση της γλώσσας φωνής και σύνθεσης

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

    Σύγκριση Microsoft.Speech με System.Speech

    Εάν είστε νέοι στην αναγνώριση και σύνθεση ομιλίας για εφαρμογές Windows, μπορείτε εύκολα να μπερδευτείτε από την τεκμηρίωση, επειδή υπάρχουν πολλές πλατφόρμες ομιλίας. Συγκεκριμένα, εκτός από τη βιβλιοθήκη Microsoft.Speech.dll που χρησιμοποιείται από τα προγράμματα επίδειξης σε αυτό το άρθρο, υπάρχει μια βιβλιοθήκη που ονομάζεται System.Speech.dll που αποτελεί μέρος του λειτουργικού συστήματος των Windows. Οι δύο βιβλιοθήκες είναι παρόμοιες με την έννοια ότι τα API τους είναι σχεδόν, αλλά όχι εντελώς πανομοιότυπα. Επομένως, εάν αναζητήσετε παραδείγματα επεξεργασίας ομιλίας στο Διαδίκτυο και δείτε αποσπάσματα κώδικα αντί για ολοκληρωμένα προγράμματα, δεν είναι καθόλου προφανές εάν το παράδειγμα είναι System.Speech ή Microsoft.Speech.

    Εάν είστε νέος στην επεξεργασία ομιλίας, χρησιμοποιήστε τη βιβλιοθήκη Microsoft.Speech αντί του System.Speech για να προσθέσετε υποστήριξη ομιλίας στην εφαρμογή σας .NET.

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

    Τραπέζι 1. Κύριες διαφορές μεταξύ Microsoft.Speech και System.Speech

    Το System.Speech DLL είναι μέρος του λειτουργικού συστήματος, επομένως εγκαθίσταται σε κάθε σύστημα Windows. Το Microsoft.Speech DLL (και ο σχετικός χρόνος εκτέλεσης και οι γλώσσες) πρέπει να ληφθούν και να εγκατασταθούν στο σύστημα. Η αναγνώριση χρησιμοποιώντας το System.Speech συνήθως απαιτεί εκπαίδευση για έναν συγκεκριμένο χρήστη, όταν ο χρήστης διαβάζει κάποιο κείμενο και το σύστημα μαθαίνει να κατανοεί τα χαρακτηριστικά της προφοράς αυτού του χρήστη. Η αναγνώριση με χρήση του Microsoft.Speech λειτουργεί άμεσα για οποιονδήποτε χρήστη. Το System.Speech μπορεί να αναγνωρίσει σχεδόν οποιαδήποτε λέξη (αυτό ονομάζεται ελεύθερη υπαγόρευση). Το Microsoft.Speech θα αναγνωρίζει μόνο λέξεις και φράσεις που βρίσκονται στο αντικείμενο Γραμματικής που ορίζεται στο πρόγραμμα.

    Προσθήκη υποστήριξης αναγνώρισης ομιλίας σε μια εφαρμογή Windows Forms

    Η διαδικασία για την προσθήκη υποστήριξης αναγνώρισης ομιλίας και σύνθεσης σε μια εφαρμογή Windows Forms ή WPF είναι παρόμοια με αυτή για μια εφαρμογή κονσόλας. Για να δημιουργήσετε το πρόγραμμα επίδειξης που εμφανίζεται στο ρύζι. 2, ξεκίνησα το Visual Studio, δημιούργησα μια νέα εφαρμογή C# Windows Forms και την μετονόμασα σε WinFormSpeech.

    Μετά τη φόρτωση του κώδικα προτύπου στο πρόγραμμα επεξεργασίας, πρόσθεσα έναν σύνδεσμο στο αρχείο Microsoft.Speech.dll στο παράθυρο του Solution Explorer - ακριβώς όπως έκανα στο πρόγραμμα της κονσόλας. Στην κορυφή του πηγαίου κώδικα, αφαίρεσα τις περιττές δηλώσεις χρήσης, αφήνοντας μόνο αναφορές στους χώρους ονομάτων System, Data, Drawing και Forms. Στη συνέχεια πρόσθεσα δύο εντολές για τους χώρους ονομάτων Microsoft.Speech.Recognition και System.Globalization.

    Η επίδειξη που βασίζεται σε φόρμες των Windows δεν χρησιμοποιεί σύνθεση ομιλίας, επομένως δεν κάνω σύνδεση με τη βιβλιοθήκη Microsoft.Speech.Synthesis. Η προσθήκη σύνθεσης ομιλίας σε μια εφαρμογή Windows Forms είναι η ίδια όπως σε μια εφαρμογή κονσόλας.

    Στο Visual Studio σε λειτουργία σχεδίασης, έσυρα ένα στοιχείο ελέγχου TextBox, CheckBox και ListBox στη φόρμα. Κάναμε διπλό κλικ στο CheckBox και το Visual Studio δημιούργησε αυτόματα μια μέθοδο χειρισμού συμβάντων CheckChanged.

    Θυμηθείτε ότι το πρόγραμμα της κονσόλας επίδειξης άρχισε αμέσως να ακούει εκφωνούμενες εντολές και συνέχισε να το κάνει μέχρι να τερματιστεί. Αυτή η προσέγγιση θα μπορούσε να χρησιμοποιηθεί σε μια εφαρμογή Windows Forms, αλλά αντ' αυτού αποφάσισα να επιτρέψω στον χρήστη να ενεργοποιεί και να απενεργοποιεί την αναγνώριση ομιλίας χρησιμοποιώντας ένα στοιχείο ελέγχου CheckBox (δηλαδή, ένα πλαίσιο ελέγχου).

    Ο πηγαίος κώδικας στο αρχείο Form1.cs του προγράμματος επίδειξης, όπου ορίζεται η μερική κλάση, εμφανίζεται στο ρύζι. 9. Ένα αντικείμενο μηχανής αναγνώρισης ομιλίας δηλώνεται και δημιουργείται ως μέλος Φόρμας. Στον κατασκευαστή της φόρμας, συνδέω τον χειριστή συμβάντων SpeechRecognized και, στη συνέχεια, δημιουργώ και φορτώνω δύο αντικείμενα Γραμματικών:

    δημόσια Form1() ( InitializeComponent(); sre.SetInputToDefaultAudioDevice(); sre.SpeechRecognized += sre_SpeechRecognized; Γραμματική g_HelloGoodbye = GetHelloGoodbyeGrammar(); Grammar g.LoadmarText Async(g_HelloGoodby e);sre.LoadGrammarAsync(g_SetTextBox) ; // sre.RecognizeAsync() είναι // στον χειριστή συμβάντων CheckBox)

    Ρύζι. 9. Προσθέστε υποστήριξη αναγνώρισης ομιλίας στις Φόρμες των Windows

    χρησιμοποιώντας το σύστημα. χρησιμοποιώντας System.Data; χρησιμοποιώντας System.Drawing; χρησιμοποιώντας System.Windows.Forms; χρησιμοποιώντας Microsoft.Speech.Recognition. χρησιμοποιώντας System.Globalization; χώρο ονομάτων WinFormSpeech ( δημόσια μερική κλάση Form1: Form ( static CultureInfo ci = new CultureInfo("en-us"); static SpeechRecognitionEngine sre = new SpeechRecognitionEngine(ci); δημόσια Form1() ( InitializeComponent(); sre.SetAultInputTo .SpeechRecognized += sre_SpeechRecognized; Γραμματική g_HelloGoodbye = GetHelloGoodbyeGrammar(); Γραμματική g_SetTextBox = GetTextBox1TextGrammar(); sre.LoadGrammarAsync(g_HelloGoodbye); / sre.Recognize Async() είναι // στον χειριστή συμβάντων CheckBox ) στατική Γραμματική GetHelloGoodbyeGrammar() ( Επιλογές ch_HelloGoodbye = new Choices(); ch_HelloGoodbye.Add("hello"); ch_HelloGoodbye.Add("αντίο"); GrammarBuilder gb_result = new GrammarGoodbye(new GrammarGoodbye). _αποτέλεσμα) ; επιστροφή g_result; ) στατική Γραμματική GetTextBox1TextGrammar() ( Επιλογές ch_Colors = new Choices(); ch_Colors.Add(new string ( "κόκκινο", "λευκό", "μπλε" )); GrammarBuilder gb_result = νέο GrammarBuilder(); gb_result.Append("set text box 1"); gb_result.Append(ch_Colors); Γραμματική g_result = new Grammar(gb_result); επιστροφή g_result; ) private void checkBox1_CheckedChanged(object sender, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); αλλιώς αν (checkBox1.Checked == false) //AsabledConnancel; void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf< 0.65) return; this.Invoke(new MethodInvoker(() =>( listBox1.Items.Add("Σε άκουσα να λες: " + txt); ))); // Ειδικά WinForm if (txt.IndexOf("text") >= 0 && txt.IndexOf("box") >= 0 && txt.IndexOf("1")>= 0) (string words = txt.Split( " "); this.Invoke(new MethodInvoker(() => ( textBox1.Text = words; ))); // Χαρακτηριστικά WinForm ) ) ) // Form ) // ns

    Θα μπορούσα να είχα δημιουργήσει δύο αντικείμενα Γραμματικής απευθείας, όπως σε ένα πρόγραμμα κονσόλας, αλλά αντ' αυτού, για να κάνω τον κώδικα λίγο πιο σαφή, όρισα δύο βοηθητικές μεθόδους (GetHelloGoodbyeGrammar και GetTextBox1TextGrammar) που κάνουν τη δουλειά.

    στατική γραμματική GetTextBox1TextGrammar() ( Επιλογές ch_Colors = new Choices(); ch_Colors.Add(new string ( "κόκκινο", "λευκό", "μπλε" )); GrammarBuilder gb_result = new GrammarBuilder(); gb_result.Append("set text πλαίσιο 1"); gb_result.Append(ch_Colors); Grammar g_result = new Grammar(gb_result); return g_result; )

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

    Ο χειριστής συμβάντων για το CheckBox ορίζεται ως εξής:

    private void checkBox1_CheckedChanged(object sender, EventArgs e) ( if (checkBox1.Checked == true) sre.RecognizeAsync(RecognizeMode.Multiple); αλλιώς εάν (checkBox1.Checked == false) // disabled sre.

    Το αντικείμενο μηχανής αναγνώρισης ομιλίας, sre (μηχανή αναγνώρισης ομιλίας), υπάρχει πάντα για όλη τη διάρκεια ζωής μιας εφαρμογής Windows Forms. Αυτό το αντικείμενο ενεργοποιείται και απενεργοποιείται με κλήσεις στις μεθόδους RecognizeAsync και RecognizeAsyncCancel όταν ο χρήστης αλλάζει το CheckBox αντίστοιχα.

    Ο ορισμός του χειριστή συμβάντων SpeechRecognized ξεκινά με:

    void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) ( string txt = e.Result.Text; float conf = e.Result.Confidence; if (conf< 0.65) return; ...

    Εκτός από τις ιδιότητες Result.Text και Result.Confidence που χρησιμοποιούνται περισσότερο ή λιγότερο συνεχώς, το αντικείμενο Result έχει πολλές άλλες χρήσιμες αλλά πιο σύνθετες ιδιότητες που μπορεί να θέλετε να εξερευνήσετε. για παράδειγμα, Homophones και ReplacementWordUnits. Επιπλέον, η μηχανή αναγνώρισης ομιλίας παρέχει πολλά χρήσιμα συμβάντα όπως το SpeechHypothesized.

    this.Invoke((Action)(() => listBox1.Items.Add("Σε άκουσα να λες: " + txt)));

    Θεωρητικά, η χρήση του πληρεξούσιου MethodInvoker είναι ελαφρώς πιο αποτελεσματική από μια ενέργεια σε αυτήν την περίπτωση, επειδή το MethodInvoker είναι μέρος του χώρου ονομάτων Windows.Forms και, επομένως, είναι ειδικό για τις εφαρμογές Φόρμες των Windows. Το Action delegate είναι πιο ευέλικτο. Αυτό το παράδειγμα δείχνει ότι μπορείτε να χειριστείτε πλήρως μια εφαρμογή Windows Forms μέσω της μηχανής αναγνώρισης ομιλίας - αυτή είναι μια απίστευτα ισχυρή και χρήσιμη δυνατότητα.

    συμπέρασμα

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

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

    Μια άλλη πιθανή χρήση της ομιλίας σε ένα πρόγραμμα κονσόλας είναι η αναγνώριση εντολών όπως το "Launch Notepad" και το "Launch Word". Με άλλα λόγια, ένα τέτοιο πρόγραμμα κονσόλας μπορεί να χρησιμοποιηθεί στον υπολογιστή σας για να εκτελέσει ενέργειες που διαφορετικά θα απαιτούσαν πολύ χειρισμό του πληκτρολογίου και του ποντικιού.

    Τζέιμς ΜακΚάφρεϊ(Δρ. James McCaffrey) εργάζεται για τη Microsoft Research στο Ρέντμοντ της Ουάσιγκτον. Συμμετείχε στη δημιουργία πολλών προϊόντων της Microsoft, συμπεριλαμβανομένων των Internet Explorer και Bing. Μπορείτε να επικοινωνήσετε μαζί του στο [email προστατευμένο].

    Ευχαριστούμε τους ειδικούς της Microsoft Research Rob Gruen, Mark Marron και Curtis von Veh για την κριτική αυτού του άρθρου.