OpenVINO hackathon: αναγνώριση φωνής και συναισθημάτων στο Raspberry Pi

30 Νοεμβρίου - 1 Δεκεμβρίου πραγματοποιήθηκε στο Νίζνι Νόβγκοροντ OpenVINO hackathon. Ζητήθηκε από τους συμμετέχοντες να δημιουργήσουν ένα πρωτότυπο μιας λύσης προϊόντος χρησιμοποιώντας την εργαλειοθήκη Intel OpenVINO. Οι διοργανωτές πρότειναν μια λίστα με κατά προσέγγιση θέματα που θα μπορούσαν να καθοδηγηθούν κατά την επιλογή μιας εργασίας, αλλά η τελική απόφαση παρέμεινε στις ομάδες. Επιπλέον, ενθαρρύνθηκε η χρήση μοντέλων που δεν περιλαμβάνονται στο προϊόν.

OpenVINO hackathon: αναγνώριση φωνής και συναισθημάτων στο Raspberry Pi

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

Περισσότερες από 10 ομάδες συμμετείχαν στο hackathon. Είναι ωραίο που κάποιοι από αυτούς ήρθαν από άλλες περιοχές. Ο χώρος διεξαγωγής του hackathon ήταν το συγκρότημα «Kremlinsky on Pochain», όπου κρέμονταν αρχαίες φωτογραφίες του Nizhny Novgorod, σε συνοδεία! (Θυμίζω ότι αυτή τη στιγμή το κεντρικό γραφείο της Intel βρίσκεται στο Nizhny Novgorod). Δόθηκαν στους συμμετέχοντες 26 ώρες για να γράψουν κώδικα και στο τέλος έπρεπε να παρουσιάσουν τη λύση τους. Ένα ξεχωριστό πλεονέκτημα ήταν η παρουσία μιας συνεδρίας επίδειξης για να βεβαιωθείτε ότι όλα όσα σχεδιάζονταν εφαρμόστηκαν πραγματικά και δεν παρέμειναν ιδέες στην παρουσίαση. Εμπορεύματα, σνακ, φαγητό, όλα ήταν εκεί επίσης!

Επιπλέον, η Intel παρείχε προαιρετικά κάμερες, Raspberry PI, Neural Compute Stick 2.

Επιλογή εργασιών

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

Έχοντας αναλύσει μοντέλα, τα οποία περιλαμβάνονται στο προϊόν στην τρέχουσα έκδοση, καταλήγουμε στο συμπέρασμα ότι τα περισσότερα από αυτά επιλύουν διάφορα προβλήματα όρασης υπολογιστή. Επιπλέον, είναι πολύ δύσκολο να βρεθεί ένα πρόβλημα στον τομέα της όρασης υπολογιστή που δεν μπορεί να λυθεί χρησιμοποιώντας το OpenVINO, και ακόμη κι αν μπορεί να εφευρεθεί, είναι δύσκολο να βρεθούν προεκπαιδευμένα μοντέλα στο δημόσιο τομέα. Αποφασίζουμε να σκάψουμε προς μια άλλη κατεύθυνση - προς την επεξεργασία ομιλίας και την ανάλυση. Ας εξετάσουμε ένα ενδιαφέρον έργο της αναγνώρισης συναισθημάτων από την ομιλία. Πρέπει να πούμε ότι το OpenVINO έχει ήδη ένα μοντέλο που καθορίζει τα συναισθήματα ενός ατόμου με βάση το πρόσωπό του, αλλά:

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

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

Διατυπώνουμε τις απαιτήσεις για τη λύση μας:

  • Μικρό μέγεθος της συσκευής στόχου
  • Λειτουργία σε πραγματικό χρόνο
  • Χαμηλή τιμή
  • Εύκολη επεκτασιμότητα

Ως αποτέλεσμα, επιλέγουμε το Raspberry Pi 3 c ως συσκευή-στόχο Intel NCS 2.

Εδώ είναι σημαντικό να σημειώσετε ένα σημαντικό χαρακτηριστικό του NCS - λειτουργεί καλύτερα με τυπικές αρχιτεκτονικές CNN, αλλά αν χρειάζεται να εκτελέσετε ένα μοντέλο με προσαρμοσμένα επίπεδα σε αυτό, τότε περιμένετε βελτιστοποίηση χαμηλού επιπέδου.

Υπάρχει μόνο ένα μικρό πράγμα που πρέπει να κάνετε: πρέπει να πάρετε ένα μικρόφωνο. Ένα κανονικό μικρόφωνο USB θα κάνει, αλλά δεν θα φαίνεται καλό μαζί με το RPI. Αλλά ακόμη και εδώ η λύση κυριολεκτικά «βρίσκεται κοντά». Για την εγγραφή φωνής, αποφασίζουμε να χρησιμοποιήσουμε την πλακέτα Voice Bonnet από το κιτ Google AIY Voice Kit, στο οποίο υπάρχει ενσύρματο στερεοφωνικό μικρόφωνο.

Κατεβάστε το Raspbian από Αποθετήριο έργων AIY και ανεβάστε το σε μια μονάδα flash, ελέγξτε ότι το μικρόφωνο λειτουργεί χρησιμοποιώντας την ακόλουθη εντολή (θα εγγράψει ήχο για 5 δευτερόλεπτα και θα τον αποθηκεύσει σε ένα αρχείο):

arecord -d 5 -r 16000 test.wav

Να σημειώσω αμέσως ότι το μικρόφωνο είναι πολύ ευαίσθητο και συλλαμβάνει καλά τον θόρυβο. Για να το διορθώσετε, ας πάμε στο alsamixer, επιλέξτε Capture devices και μειώστε το επίπεδο σήματος εισόδου στο 50-60%.

OpenVINO hackathon: αναγνώριση φωνής και συναισθημάτων στο Raspberry Pi
Τροποποιούμε το σώμα με λίμα και χωράνε όλα, μπορείτε να το κλείσετε ακόμα και με καπάκι

Προσθήκη κουμπιού ένδειξης

Καθώς χωρίζουμε το AIY Voice Kit, θυμόμαστε ότι υπάρχει ένα κουμπί RGB, ο οπίσθιος φωτισμός του οποίου μπορεί να ελεγχθεί από λογισμικό. Αναζητούμε το "Google AIY Led" και βρίσκουμε τεκμηρίωση: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Γιατί να μην χρησιμοποιήσετε αυτό το κουμπί για να εμφανίσετε το αναγνωρισμένο συναίσθημα, έχουμε μόνο 7 κατηγορίες και το κουμπί έχει 8 χρώματα, αρκετά!

Συνδέουμε το κουμπί μέσω GPIO στο Voice Bonnet, φορτώνουμε τις απαραίτητες βιβλιοθήκες (είναι ήδη εγκατεστημένες στο κιτ διανομής από έργα AIY)

from aiy.leds import Leds, Color
from aiy.leds import RgbLeds

Ας δημιουργήσουμε μια εντολή στην οποία κάθε συναίσθημα θα έχει ένα αντίστοιχο χρώμα με τη μορφή μιας πλειάδας RGB και ένα αντικείμενο της κλάσης aiy.leds.Leds, μέσω της οποίας θα ενημερώσουμε το χρώμα:

led_dict = {'neutral': (255, 255, 255), 'happy': (0, 255, 0), 'sad': (0, 255, 255), 'angry': (255, 0, 0), 'fearful': (0, 0, 0), 'disgusted':  (255, 0, 255), 'surprised':  (255, 255, 0)} 
leds = Leds()

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

leds.update(Leds.rgb_on(led_dict.get(classes[prediction])))

OpenVINO hackathon: αναγνώριση φωνής και συναισθημάτων στο Raspberry Pi
Κουμπί, κάψτε!

Εργασία με φωνή

Θα χρησιμοποιήσουμε το pyaudio για να καταγράψουμε τη ροή από το μικρόφωνο και το webrtcvad για να φιλτράρουμε το θόρυβο και να ανιχνεύσουμε τη φωνή. Επιπλέον, θα δημιουργήσουμε μια ουρά στην οποία θα προσθέτουμε και θα αφαιρούμε ασύγχρονα φωνητικά αποσπάσματα.

Δεδομένου ότι το webrtcvad έχει περιορισμό στο μέγεθος του παρεχόμενου τμήματος - πρέπει να είναι ίσο με 10/20/30ms και η εκπαίδευση του μοντέλου για την αναγνώριση συναισθημάτων (όπως θα μάθουμε αργότερα) πραγματοποιήθηκε σε ένα σύνολο δεδομένων 48 kHz, θα λήψη κομματιών μεγέθους 48000×20ms/1000×1(μονο)=960 byte. Το Webrtcvad θα επιστρέψει True/False για καθένα από αυτά τα κομμάτια, το οποίο αντιστοιχεί στην παρουσία ή απουσία ψήφου στο κομμάτι.

Ας εφαρμόσουμε την εξής λογική:

  • Θα προσθέσουμε στη λίστα εκείνα τα κομμάτια όπου υπάρχει ψηφοφορία· εάν δεν υπάρχει ψήφος, τότε θα αυξήσουμε τον μετρητή των κενών κομματιών.
  • Εάν ο μετρητής των κενών κομματιών είναι >=30 (600 ms), τότε εξετάζουμε το μέγεθος της λίστας των συσσωρευμένων κομματιών· εάν είναι >250, τότε το προσθέτουμε στην ουρά· εάν όχι, θεωρούμε ότι το μήκος της εγγραφής δεν αρκεί για να την τροφοδοτήσει στο μοντέλο για να αναγνωρίσει το ηχείο.
  • Εάν ο μετρητής των κενών κομματιών εξακολουθεί να είναι < 30 και το μέγεθος της λίστας των συσσωρευμένων κομματιών υπερβαίνει τα 300, τότε θα προσθέσουμε το τμήμα στην ουρά για πιο ακριβή πρόβλεψη. (επειδή τα συναισθήματα τείνουν να αλλάζουν με την πάροδο του χρόνου)

 def to_queue(frames):
    d = np.frombuffer(b''.join(frames), dtype=np.int16)
    return d

framesQueue = queue.Queue()
def framesThreadBody():
    CHUNK = 960
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 48000

    p = pyaudio.PyAudio()
    vad = webrtcvad.Vad()
    vad.set_mode(2)
    stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)
    false_counter = 0
    audio_frame = []
    while process:
        data = stream.read(CHUNK)
        if not vad.is_speech(data, RATE):
            false_counter += 1
            if false_counter >= 30:
                if len(audio_frame) > 250:              
                    framesQueue.put(to_queue(audio_frame,timestamp_start))
                    audio_frame = []
                    false_counter = 0

        if vad.is_speech(data, RATE):
            false_counter = 0
            audio_frame.append(data)
            if len(audio_frame) > 300:                
                    framesQueue.put(to_queue(audio_frame,timestamp_start))
                    audio_frame = []

Ήρθε η ώρα να αναζητήσετε προεκπαιδευμένα μοντέλα στον δημόσιο τομέα, μεταβείτε στο github, στο Google, αλλά να θυμάστε ότι έχουμε περιορισμό στην αρχιτεκτονική που χρησιμοποιείται. Αυτό είναι ένα αρκετά δύσκολο κομμάτι, γιατί πρέπει να δοκιμάσετε τα μοντέλα στα δεδομένα εισόδου σας και επιπλέον, να τα μετατρέψετε στην εσωτερική μορφή του OpenVINO - IR (Intermediate Representation). Δοκιμάσαμε περίπου 5-7 διαφορετικές λύσεις από το github και αν το μοντέλο για την αναγνώριση συναισθημάτων λειτούργησε αμέσως, τότε με την αναγνώριση φωνής έπρεπε να περιμένουμε περισσότερο - χρησιμοποιούν πιο σύνθετες αρχιτεκτονικές.

Εστιάζουμε στα εξής:

  • Συναισθήματα από τη φωνή - https://github.com/alexmuhr/Voice_Emotion
    Λειτουργεί σύμφωνα με την ακόλουθη αρχή: ο ήχος κόβεται σε αποσπάσματα συγκεκριμένου μεγέθους, για καθένα από αυτά τα αποσπάσματα που επιλέγουμε MFCC και στη συνέχεια να τα υποβάλουν ως στοιχεία εισόδου στο CNN
  • Αναγνώριση φωνής - https://github.com/linhdvu14/vggvox-speaker-identification
    Εδώ, αντί για MFCC, δουλεύουμε με ένα φασματόγραμμα, μετά το FFT τροφοδοτούμε το σήμα στο CNN, όπου στην έξοδο παίρνουμε μια διανυσματική αναπαράσταση της φωνής.

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

  • Open Model Zoo, μοντέλα από τα οποία θα μπορούσαν να χρησιμοποιηθούν και να συμπεριληφθούν στο προϊόν σας
  • Model Optimzer, χάρη στο οποίο μπορείτε να μετατρέψετε ένα μοντέλο από διάφορες μορφές πλαισίου (Tensorflow, ONNX κ.λπ.) στη μορφή Intermediate Representation, με την οποία θα εργαστούμε περαιτέρω
  • Το Inference Engine σάς επιτρέπει να εκτελείτε μοντέλα σε μορφή IR σε επεξεργαστές Intel, τσιπ Myriad και επιταχυντές Neural Compute Stick
  • Η πιο αποτελεσματική έκδοση του OpenCV (με υποστήριξη Inference Engine)
    Κάθε μοντέλο σε μορφή IR περιγράφεται από δύο αρχεία: .xml και .bin.
    Τα μοντέλα μετατρέπονται σε μορφή IR μέσω του Model Optimizer ως εξής:

    python /opt/intel/openvino/deployment_tools/model_optimizer/mo_tf.py --input_model speaker.hdf5.pb --data_type=FP16 --input_shape [1,512,1000,1]

    --data_type σας επιτρέπει να επιλέξετε τη μορφή δεδομένων με την οποία θα λειτουργεί το μοντέλο. Υποστηρίζονται FP32, FP16, INT8. Η επιλογή του βέλτιστου τύπου δεδομένων μπορεί να δώσει μια καλή ώθηση στην απόδοση.
    --input_shape υποδεικνύει τη διάσταση των δεδομένων εισόδου. Η δυνατότητα δυναμικής αλλαγής φαίνεται να υπάρχει στο C++ API, αλλά δεν ψάξαμε τόσο μακριά και απλώς το διορθώσαμε για ένα από τα μοντέλα.
    Στη συνέχεια, ας προσπαθήσουμε να φορτώσουμε το μοντέλο που έχει ήδη μετατραπεί σε μορφή IR μέσω της μονάδας DNN στο OpenCV και να το προωθήσουμε σε αυτό.

    import cv2 as cv
    emotionsNet = cv.dnn.readNet('emotions_model.bin',
                              'emotions_model.xml')
    emotionsNet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

    Η τελευταία γραμμή σε αυτήν την περίπτωση σάς επιτρέπει να ανακατευθύνετε τους υπολογισμούς στο Neural Compute Stick, οι βασικοί υπολογισμοί εκτελούνται στον επεξεργαστή, αλλά στην περίπτωση του Raspberry Pi αυτό δεν θα λειτουργήσει, θα χρειαστείτε ένα stick.

    Στη συνέχεια, η λογική είναι η εξής: χωρίζουμε τον ήχο μας σε παράθυρα συγκεκριμένου μεγέθους (για εμάς είναι 0.4 s), μετατρέπουμε καθένα από αυτά τα παράθυρα σε MFCC, το οποίο στη συνέχεια τροφοδοτούμε στο πλέγμα:

    emotionsNet.setInput(MFCC_from_window)
    result = emotionsNet.forward()

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

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

    Ας δοκιμάσουμε:

    python3 voice_db/record_voice.py test.wav

    Ηχογραφούμε τις φωνές πολλών ατόμων (στην περίπτωσή μας, τριών μελών της ομάδας)
    Στη συνέχεια, για κάθε ηχογραφημένη φωνή εκτελούμε έναν γρήγορο μετασχηματισμό Fourier, λαμβάνουμε ένα φασματόγραμμα και το αποθηκεύουμε ως numpy array (.npy):

    for file in glob.glob("voice_db/*.wav"):
            spec = get_fft_spectrum(file)
            np.save(file[:-4] + '.npy', spec)

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

    for file in glob.glob("voice_db/*.npy"):
        spec = np.load(file)
        spec = spec.astype('float32')
        spec_reshaped = spec.reshape(1, 1, spec.shape[0], spec.shape[1])
        srNet.setInput(spec_reshaped)
        pred = srNet.forward()
        emb = np.squeeze(pred)

    Αφού λάβουμε την ενσωμάτωση από το τμήμα που ακούγεται, θα είμαστε σε θέση να προσδιορίσουμε σε ποιον ανήκει παίρνοντας την απόσταση συνημιτόνου από το απόσπασμα σε όλες τις φωνές στη βάση δεδομένων (όσο μικρότερη, τόσο πιο πιθανή) - για την επίδειξη ορίσαμε το όριο έως 0.3):

            dist_list = cdist(emb, enroll_embs, metric="cosine")
            distances = pd.DataFrame(dist_list, columns = df.speaker)

    Στο τέλος, θα ήθελα να σημειώσω ότι η ταχύτητα συμπερασμάτων ήταν γρήγορη και επέτρεψε την προσθήκη 1-2 ακόμη μοντέλων (για ένα δείγμα διάρκειας 7 δευτερολέπτων χρειάστηκαν 2.5 για συμπέρασμα). Δεν είχαμε πλέον χρόνο να προσθέσουμε νέα μοντέλα και επικεντρωθήκαμε στη σύνταξη ενός πρωτοτύπου της διαδικτυακής εφαρμογής.

    εφαρμογή ιστού

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

    Το backend είναι ένα κανάλι μηνυμάτων από άκρο σε άκρο μεταξύ του μπροστινού και του Raspberry Pi, που βασίζεται στην τεχνολογία websocket (http over tcp protocol).

    Το πρώτο στάδιο είναι η λήψη επεξεργασμένων πληροφοριών από το raspberry, δηλαδή, προγνωστικά συσκευασμένα σε json, τα οποία αποθηκεύονται στη βάση δεδομένων στα μισά του ταξιδιού τους, ώστε να μπορούν να δημιουργηθούν στατιστικά στοιχεία σχετικά με το συναισθηματικό υπόβαθρο του χρήστη για την περίοδο. Αυτό το πακέτο αποστέλλεται στη συνέχεια στο frontend, το οποίο χρησιμοποιεί συνδρομή και λαμβάνει πακέτα από το τελικό σημείο του websocket. Ολόκληρος ο μηχανισμός backend είναι χτισμένος στη γλώσσα golang· επιλέχθηκε επειδή είναι κατάλληλος για ασύγχρονες εργασίες, τις οποίες χειρίζονται καλά οι goroutine.
    Κατά την πρόσβαση στο τελικό σημείο, ο χρήστης εγγράφεται και εισάγεται στη δομή και στη συνέχεια λαμβάνεται το μήνυμά του. Τόσο ο χρήστης όσο και το μήνυμα εισάγονται σε έναν κοινό κόμβο, από τον οποίο τα μηνύματα αποστέλλονται ήδη περαιτέρω (στο εγγεγραμμένο μέτωπο) και εάν ο χρήστης κλείσει τη σύνδεση (ράμπμπερι ή μπροστινή), τότε η συνδρομή του ακυρώνεται και αφαιρείται από το κέντρο.

    OpenVINO hackathon: αναγνώριση φωνής και συναισθημάτων στο Raspberry Pi
    Περιμένουμε σύνδεση από πίσω

    Το Front-end είναι μια εφαρμογή Ιστού γραμμένη σε JavaScript χρησιμοποιώντας τη βιβλιοθήκη React για να επιταχύνει και να απλοποιήσει τη διαδικασία ανάπτυξης. Ο σκοπός αυτής της εφαρμογής είναι να οπτικοποιήσει δεδομένα που λαμβάνονται χρησιμοποιώντας αλγόριθμους που τρέχουν στην πίσω πλευρά και απευθείας στο Raspberry Pi. Η σελίδα έχει τμηματική δρομολόγηση που υλοποιείται με τη χρήση του react-router, αλλά η κύρια σελίδα ενδιαφέροντος είναι η κύρια σελίδα, όπου μια συνεχής ροή δεδομένων λαμβάνεται σε πραγματικό χρόνο από τον διακομιστή χρησιμοποιώντας την τεχνολογία WebSocket. Το Raspberry Pi ανιχνεύει μια φωνή, καθορίζει αν ανήκει σε ένα συγκεκριμένο άτομο από την καταχωρημένη βάση δεδομένων και στέλνει μια λίστα πιθανοτήτων στον πελάτη. Ο πελάτης εμφανίζει τα πιο πρόσφατα σχετικά δεδομένα, εμφανίζει το avatar του ατόμου που πιθανότατα μίλησε στο μικρόφωνο, καθώς και το συναίσθημα με το οποίο προφέρει τις λέξεις.

    OpenVINO hackathon: αναγνώριση φωνής και συναισθημάτων στο Raspberry Pi
    Αρχική σελίδα με ενημερωμένες προβλέψεις

    Συμπέρασμα

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

    Επιτρέψτε μου να σημειώσω ότι το συνολικό κόστος της λύσης μας ήταν 150 $:

    • Raspberry Pi 3 ~ 35 $
    • Google AIY Voice Bonnet (μπορείτε να πληρώσετε ένα τέλος ομιλητή) ~ 15$
    • Intel NCS 2 ~ 100$

    Πως να βελτιωθεί:

    • Χρησιμοποιήστε την εγγραφή από τον πελάτη - ζητήστε να διαβάσετε το κείμενο που δημιουργείται τυχαία
    • Προσθέστε μερικά ακόμη μοντέλα: μπορείτε να προσδιορίσετε το φύλο και την ηλικία με φωνή
    • Διαχωρίστε τις ταυτόχρονες φωνές (diarization)

    Αποθήκη: https://github.com/vladimirwest/OpenEMO

    OpenVINO hackathon: αναγνώριση φωνής και συναισθημάτων στο Raspberry Pi
    Κουρασμένοι αλλά χαρούμενοι είμαστε

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

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο