OpenVINO hackathon: vocem et passionem agnoscens in Raspberry Pi

Die 30 Novembris - Decembris 1 in Nizhny Novgorod habita est OpenVINO hackathon. Participes rogaverunt ut exemplar solutionis producti creare utens toolkit Intel OpenVINO. Auctores proposuerunt indicem argumentorum approximatorum qui dirigi possent cum munus eligendo, sed sententia finalis cum iugis manebat. Praeterea usus exemplorum quae producto non continentur, hortatus est.

OpenVINO hackathon: vocem et passionem agnoscens in Raspberry Pi

In hoc articulo narrabimus tibi quomodo nos creavimus exemplar productum, quo tandem primum locum cepimus.

Plus quam 10 iugis in hackathon participata est. Nonnulli ex illis ex aliis regionibus provenerunt. Visus pro hackathon complexus fuit "Kremlinsky in Pochain", ubi antiquae imagines Novogardiae Nizhny intus pendebant, in comitatu! (Admoneo te ex tempore officium centrale Intel in Nizhny Novgorod situm est). Participes datae sunt 26 horas ad codicem scribendum, et in fine solutionem suam exhibere debebant. Commodum separatum erat praesentia demoe sessionis ut efficeret ut omnia consilia in actu perficiantur et notiones in praesentatione non manerent. Merces, laborum, cibi, omnia ibi quoque!

Praeterea facultates Intel cameras, Raspberry PI, Neural Computum Stick II.

Negotium lectio

Una ex difficillimis partibus ad liberam formam gratis praeparandi hackath provocationem eligit. Statim advenire decrevimus aliquid, quod nondum erat in re, cum nuntiaretur id gratissimum esse.

Habens resolvitur exemplumquae in facto in emissione hodiernae comprehenduntur, eo concluditur quod plerique varias problemata computatrale solvent. Praeterea difficillimum est cum problematis in campo visionis computatrae, quae usu OpenVINO solvi non potest, et etiam si quis fingi potest, difficile est invenire praevia exempla in regione publica. Statuimus in aliam partem fodere - versus orationem processus et analytica. Prae oculis simus an studium cognoscendi motus ex oratione. Dicendum est OpenVINO exemplar iam habere quod affectus hominis in facie nituntur, sed:

  • In theoria, algorithmum coniunctum efficere potest qui tam sonus quam imago operabitur, quae accurate augere debet.
  • Camerae plerumque angulum angustum habent, plus quam una camera requiritur ad magnam aream operiendam: sonus talem limitationem non habet.

Ideam augeamus: ideam de segmento grosso sumamus ut basis. Metiri potes satisfactionem emptoris in copia checkouts. Si unus ex clientibus displicuit officio et coepit suum sonum movere, statim administratorem vocare potes auxilium.
In hoc casu, necesse est ut recognitionem vocis humanae addere, hoc sinit nos a clientibus thesauros distinguere et singulis analyticis singula praebere. Bene, praeterea, poterit exponere mores copia conductorum se, aestimare aerem in theam, sonat bonum!

requisita ad solutionem nostram exprimimus;

  • Moles parva scopum fabrica
  • Verus tempus operandi
  • low price
  • Securus scalability

Quam ob rem eligimus RUBUS IDAEUS PI 3 c ut scopum fabrica Intel NCS 2.

Hic interest notare unum momentum in NCS - optima cum norma rhoncus architecturae operatur, sed si exemplum currere debes cum stratis consuetudinibus in ea, ipsum exspectes humili gradu.

Una parva res est: tortor ligula, eget tortor. USB tortor ligula, ordinarius faciet, sed bonum cum RPI non respiciet. Sed hic etiam solutio proprie "prope jacet." Vocem referre, decernimus uti Tabula Voice Bonnet e ornamento Google AIY Voice Kit, in qua monophonum microphonicum est wired.

Download Raspbian from AIY incepta repositio eamque ad mico coegi imposuisti, proba ut tortor ligula, sequenti mandato utens operetur (sicut audias 5 secundas longas recordabit et ad limam servabit);

arecord -d 5 -r 16000 test.wav

Statim notandum est tortorem valde sensibilem esse et sonum bene capere. Hoc ut figat, ad alsamixer eamus, machinis capiendis selectis ac initus signo dato gradu ad 50-60% reducas.

OpenVINO hackathon: vocem et passionem agnoscens in Raspberry Pi
Nos corpus lima et omnia vicia temperare, illud operculo vel claudere potes

Addit ad indicator button

Dum AIY Vocem Kit seorsum accipimus, meminimus globulum RGB esse, cuius backlight potest programmate moderari. Quaerimus "Google AIY Duci" et documenta invenimus: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Cur non utimur hac conjunctione ad motum agnitum exhibendum, tantum VII classes habemus, et globulum octo colores tantum satis habemus!

Coniungimus pyga per GPIO ad Vocem Bonnet, necessarias bibliothecas onerate (iam in ornamento ab AIY inceptis distribuendis installantur)

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

Dictum faciamus in quo quaelibet passio congruentem colorem habebit in forma RGB Tuple et obiectum classis aiy.leds.Leds, per quod colorem renovabimus:

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()

Ac denique, post unumquodque novum passionis praedictum, colorem globuli renovabimus secundum illud (per clavem).

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

OpenVINO hackathon: vocem et passionem agnoscens in Raspberry Pi
Button, ardent!

Operantes cum voce

Nos pyaudio utemur ad excipiendum rivum e tortore et webrcvad ad strepitum eliquandum et vocem deprehendendam. Praeterea quenam creabimus, cui excerpta vocis asynchrone addimus et removebimus.

Cum webrtcvad limitationem in fragmenti suppleti magnitudine habet β€” aequari debet 10/20/30ms, et institutio exemplaris ad passiones cognoscendas (ut postea discemus) peractam in 48kHz dataset, volumus. captis chunkis quantitatis 48000Γ—20ms/1000Γ—1(mono)=960 bytes. Webrtcvad pro unoquoque horum chunkorum Verus/Falsus reddet, qui praesentiae vel absentiae suffragii in FRUSTUM correspondet.

Sequitur logicam deducendi rationem:

  • Nos ad catalogum illas addebimus ubi suffragium est: si suffragium non est, tum contra vanorum chunkarum incrementabimus.
  • Si contrarium chunks inanes est >=30 (600 ms), consideremus magnitudinem rerum congestarum, si est >250, addimus queue, sin minus, consideremus longitudinem de censu non satis est pascere ad exemplar cognoscendi oratorem.
  • Si contrarium chunks inanes adhuc <30, et magnitudo indici chunkorum congestorum CCC excedit, tum fragmentum queue ad accuratiorem vaticinium adiiciemus. (Quia motus tendunt ad mutationem in tempore)

 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 = []

Tempus est quaerere exempla praecognita in dominio publico, github Google ire, sed memento nos limitationem habere in architectura adhibitam. Haec pars difficilior est, quia exempla in inputatione data tua probare debes, et praeterea ea in forma interna OpenVINO - IR (Repraesentatio Intermediata) converte. De diversis solutionibus e github 5-7 conati sumus, et si exemplar ad motus agnoscendos statim laboraverunt, tum voce agnitionis diutius expectare debebamus - architecturae implicatiores utuntur.

Nos sequenti intendunt:

Deinde de conversione exempla loquemur, a theore incipientes. OpenVINO plures moduli includit:

  • Aperi exemplar Tesserae, exempla e quibus adhiberi et includi in producto tuo
  • Exemplar Optimzer, cuius exemplum ex variis compage formatis (Tensorflow, ONNX etc.) in forma media repraesentationis convertere potes, cum quo amplius laborabimus.
  • Consequens Engine permittit te ut exempla in IR format de processoribus Intel, Myriad chippis et in Computo Neural Stick acceleratores
  • Efficacissima versionem OpenCV (cum Conference Engine firmamentum)
    Unumquodque exemplar in IR forma duobus fasciculis descriptum est: .xml et .bin.
    Exempla convertuntur ad IR format per Model Optimizer sic:

    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 sino vos eligere datas formas quibus exemplar operabitur. FP32, FP16, INT8 sustentantur. Eligens meliorem notitiarum genus potest bonum facere boost.
    --input_shape indicat rationem initus data. Facultas dynamice mutandi in C++ API adesse videtur, sed illud longe et simpliciter unum exemplorum non fodimus.
    Deinde, exemplar iam correctum in IR forma per DNN moduli in OpenCV onerare conetur et ad eam transmittat.

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

    Ultima linea in hoc casu permittit te calculas redirectas ad Computum Neural Stick, computationes fundamentales in processu peraguntur, sed in casu Raspberry Pi hoc opus non erit, baculo opus erit.

    Deinde logica talis est: auditum nostrum dividimus in fenestras magnitudinis cuiusdam (nobis est 0.4s), singulas has fenestras convertimus in MFCC, quas tunc pascimus ad craticulam:

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

    Deinde sumamus genus commune omnium fenestrarum. Simplex solutio, sed pro hackathon non debes aliquid nimis abstrusum venire, si tempus est. Adhuc multum laboris est facere, ut in moveamur - vocis recognitionem agemus. Necessarium est aliquod genus database in quo spectrogrammata vocum praenotatarum reconderentur. Cum parum temporis sit relictum, hanc constitutionem, quantum possumus, expediemus.

    Nempe scripturam ad vocem excerpendam conficimus (eo modo quo supra dictum est operatur, cum e claviaturae interpellatus vocem ad limam servabit).

    Experiamur:

    python3 voice_db/record_voice.py test.wav

    Commemoramus voces plurium hominum (in nostro casu, tria membra iugis)
    Deinde, pro unaquaque exposita voce quam celeriter transmutatio quadrupliciter exhibemus, spectrogramma obtinemus et ut numpy aciem servemus (.npy);

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

    Plura in tabella create_base.py
    Quam ob rem, cum scriptorum principale curritur, ab his spectrogrammatibus initiis habebimus;

    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)

    Recepta e segmento soni emplicationi, determinare poterimus quis sit, sumendo cosinam distantiam ab transitu ad omnes voces datorum (minores, magis verisimile) - demo limen ponimus. ad 0.3);

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

    In fine, notare velim velocitatem illationem velocitatem fuisse, ac fieri posse ut exempla plura 1-2 addere (nam specimen 7 secundis longis 2.5 pro consequenti sumpsit). Non iam tempus erat exemplaria nova addere et scribere exemplar interretialis applicationis intentum.

    Web application

    Magni momenti punctum: iter nobiscum ab domo accipimus et retis localibus constituimus, adiuvat machinam et laptop per retia coniungere.

    Tergum est finis-ad-finis nuntius canalis inter frontem et Raspberry Pi, innixus technologiae websocket (http super tcp protocollo).

    Primus gradus est informationes processus accipere ex amet, id est, predictors refertum in json, qui salvantur in media via datorum ut statistica generari possint de curriculo motus usoris per tempus. Hic fasciculus tunc missus est ad frontem, qui subscriptione utitur et fasciculos a termino interretitorio accipit. Tota mechanismus backendi fabricatur in lingua golanga, electa est quia bene convenit operibus asynchronis, quae bene tractant goroutines.
    Cum ad terminum accessum, usor inscriptus est et in structuram intravit, nuntium suum recipitur. Uterque utens et nuntius in centrum commune ineunt, e quibus nuntii longius missi sunt (ante subscriptum), et si usor nexum (raspberry vel anteriorem claudit), tunc subscriptionis eius aboletur et ab eo removetur. centrum.

    OpenVINO hackathon: vocem et passionem agnoscens in Raspberry Pi
    Expectamus nexum a tergo

    Ante-finis est applicatione interretialis scripta in JavaScript usus React bibliotheca ad accelerandum et simpliciorem reddendam processum evolutionis. Propositum huius applicationis est notitias visualisare consecutas utentes algorithmos in parte posteriori currendo et directe in RUBUS IDAEUS PI. Pagina sectionis fuso in usu react-iterum perficienda est, sed praecipua pagina usurarum est pagina principalis, ubi continuus amnis notitiarum reali tempore recipitur a servo technicae artis WebSocket. Raspberry Pi vocem detegit, decernit an ad certam personam e datorum genealogia pertineat, et album probabilitatem clienti mittit. Cliens recentissimas notitias pertinentes ostendit, avatarem ostendit eius qui maxime in tortor ligula, in tortoribus verisimiliter locutus est, necnon affectum cum quo verba profert.

    OpenVINO hackathon: vocem et passionem agnoscens in Raspberry Pi
    Pagina pagina cum vaticiniis updated

    conclusio,

    Non potuit omnia perficere sicut destinatum est, tempus simpliciter non erat, ideo spes maxima in demo erat ut omnia operarentur. In praesentatione loquebantur quomodo omnia opera, quae exempla ceperunt, quid difficultates offenderint. Proxima erat pars demo - periti circa cubiculum in temere ordine ambulaverunt et singulas turmas appropinquaverunt ut prototypum operantes viderent. Interrogaverunt etiam nos, omnes suas partes responderunt, telam in laptop reliquerunt, omniaque ut expectata revera operata sunt.

    Mihi notandum est summam solutionis nostrae sumptus $ 150 fuisse;

    • RUBUS IDAEUS Pi 3 ~ $35
    • Google AIY Voice Bonnet (can respeaker fee) ~ 15$
    • Intel NES 2 ~ 100$

    Quam emendare:

    • Utere adnotatione ex client - roga textum legere passim generatum
    • Pauca plura exempla adde: Potes voce et sexum et aetatem determinare
    • Separate voces simul sonantiae (diarization)

    Repositorium: https://github.com/vladimirwest/OpenEMO

    OpenVINO hackathon: vocem et passionem agnoscens in Raspberry Pi
    Fessus sed beati sumus

    Demum, auctoribus et participibus gratias velim dicere. Inter incepta aliarum iunctionum, personaliter probaverunt solutionem spatii vigilantiae liberae raedae. Pro nobis, in facto et progressu baptismi experientia refrigeret. Spero plus magisque interesting eventus in regionibus, etiam in AI argumentis, habebuntur.

Source: www.habr.com