OpenVINO hackathon: te mohio ki te reo me nga kare-a-roto i runga i te Raspberry Pi

Noema 30 - Hakihea 1 i Nizhny Novgorod i tu OpenVINO hackathon. I tonohia nga kaiuru ki te hanga tauira o te otinga hua ma te whakamahi i te kete taputapu Intel OpenVINO. I whakatakotohia e nga kaiwhakarite he rarangi o nga kaupapa tata ka taea te arahi i te wa e whiriwhiri ana i tetahi mahi, engari i noho tonu te whakatau whakamutunga ki nga kapa. I tua atu, i akiakihia te whakamahi i nga tauira kaore i whakauruhia ki roto i te hua.

OpenVINO hackathon: te mohio ki te reo me nga kare-a-roto i runga i te Raspberry Pi

I roto i tenei tuhinga ka korero matou ki a koe mo te pehea i hanga ai e matou to maatau tauira o te hua, i te mutunga ka eke matou ki te waahi tuatahi.

Neke atu i te 10 nga kapa i uru ki te hackathon. He pai i ahu mai etahi o ratou i etahi atu rohe. Ko te waahi mo te hackathon ko te "Kremlinsky on Pochain" matatini, i whakairihia nga whakaahua tawhito o Nizhny Novgorod i roto, i roto i te roopu! (Ka whakamahara ahau ki a koe i tenei wa ko te tari pokapū o Intel kei Nizhny Novgorod). He 26 haora i whakawhiwhia ki nga kaiuru ki te tuhi waehere, a, i te mutunga me whakaatu mai ta raatau otinga. Ko tetahi painga motuhake ko te noho mai o tetahi huihuinga demo ki te whakarite kia tino whakatinanahia nga mea katoa i whakamaheretia, kaore hoki i mau tonu nga whakaaro i roto i te whakaaturanga. Te hokohoko, te paramanawa, te kai, kei kona ano nga mea katoa!

I tua atu, ko Intel he mea whakarato kamera, Raspberry PI, Neural Compute Stick 2.

Kōwhiringa tūmahi

Ko tetahi o nga waahanga tino uaua ki te whakarite mo te hackathon koreutu ko te whiriwhiri i tetahi wero. I whakatau tonu matou ki te whakaputa i tetahi mea kaore ano i roto i te hua, na te mea i kii te panui he tino manakohia tenei.

Kua tātarihia tauira, kei roto i te hua i roto i te tukunga o naianei, ka tae mai ki te whakatau ko te nuinga o ratou e whakaoti ana i nga raruraru tirohanga rorohiko. I tua atu, he tino uaua ki te puta mai he raruraru i roto i te waahi o te tirohanga rorohiko e kore e taea te whakaoti ma te whakamahi i te OpenVINO, a, ahakoa ka taea te whakaaro, he uaua ki te kimi i nga tauira kua whakangunguhia i mua i te waahi o te iwi. Ka whakatau matou ki te keri ki tetahi atu huarahi - ki te tukatuka korero me te tātari. Kia whai whakaaro tatou ki tetahi mahi whakamere ki te mohio kare-a-roto mai i te whaikorero. Me kii kei a OpenVINO tetahi tauira e whakatau ana i nga kare a te tangata i runga i ona kanohi, engari:

  • I roto i te ariā, ka taea te hanga i tetahi algorithm whakakotahi ka mahi i runga i te oro me te ahua, ka nui ake te tika.
  • He whaiti te koki tirohanga o nga kaamera; neke atu i te kotahi nga kaamera e hiahiatia ana hei taupoki i te waahi nui; karekau he herenga o te oro.

Kia whakawhanake tatou i te whakaaro: me tango te whakaaro mo te wahanga hokohoko hei turanga. Ka taea e koe te ine i te pai o nga kaihoko ki nga utu hokohoko. Mena kaore tetahi o nga kaihoko e pai ki te ratonga ka timata ki te whakanui i to reo, ka taea e koe te karanga tonu i te kaiwhakahaere mo te awhina.
I roto i tenei take, me taapiri atu i te mohiotanga reo tangata, ma tenei ka taea e tatou te wehewehe i nga kaimahi toa mai i nga kaihoko me te whakarato i nga tātaritanga mo ia tangata. Ana, hei taapiri, ka taea te tātari i te whanonga o nga kaimahi toa, te arotake i te hau o te roopu, he pai te tangi!

Ka whakatakotohia e matou nga whakaritenga mo to maatau otinga:

  • Rahi iti o te pūrere ūnga
  • Te mahi i te wa tuturu
  • He utu iti
  • Tauineine ngawari

Ko te mutunga, ka tohua e matou te Raspberry Pi 3 c hei taputapu whaainga Intel NCS 2.

I konei he mea nui kia kite koe i tetahi ahuatanga nui o te NCS - he pai ake te mahi me nga hoahoanga CNN paerewa, engari ki te hiahia koe ki te whakahaere i tetahi tauira me nga paparanga ritenga ki runga, katahi ka tatari kia iti ake te arotautanga.

Kotahi noa te mea iti hei mahi: me tiki he hopuoro. Ka mahi te hopuoro USB auau, engari kare e pai te ahua me te RPI. Engari i konei ko te otinga "kei te tata." Ki te tuhi i te reo, ka whakatau matou ki te whakamahi i te papa Pouaka Reo mai i te kete Google AIY Reo Kit, kei runga he hopuoro hiko waea.

Tikiake Raspbian mai Pupuri kaupapa AIY ka tuku atu ki te puku kohiko, whakamatauria kei te mahi te hopuoro ma te whakamahi i te whakahau e whai ake nei (ka hopu i te oro mo te 5 hēkona te roa ka penapena ki te konae):

arecord -d 5 -r 16000 test.wav

Me mahara tonu ahau he tino tairongo te hopuoro, he pai te hopu haruru. Hei whakatika i tenei, me haere ki te alsamixer, tohua nga taputapu Hopu me te whakaiti i te taumata tohu whakauru ki te 50-60%.

OpenVINO hackathon: te mohio ki te reo me nga kare-a-roto i runga i te Raspberry Pi
Ka whakarereketia e matou te tinana me te konae ka uru nga mea katoa, ka taea e koe te kati me te taupoki

Te taapiri i te paatene tohu

I te wa e wehea ana te AIY Voice Kit, ka maumahara matou he paatene RGB, ko te rama o muri ka taea te whakahaere ma te rorohiko. Ka rapua e matou "Google AIY Led" ka kitea nga tuhinga: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
He aha e kore ai e whakamahi i tenei paatene hei whakaatu i te kare-a-roto e mohiotia ana, e 7 noa nga karaehe, e 8 nga tae o te paatene, he nui noa iho!

Ka honoa e matou te paatene ma te GPIO ki te Voice Bonnet, ka utaina nga whare pukapuka e tika ana (kua whakauruhia ki roto i te kete tohatoha mai i nga kaupapa AIY)

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

Me hanga he korero e whai tae ai ia kare-a-roto i roto i te ahua o te RGB Tuple me tetahi mea o te akomanga aiy.leds.Leds, ma reira ka whakahouhia te tae:

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

Ka mutu, i muri i ia matapae hou mo tetahi kare-a-roto, ka whakahouhia e matou te tae o te paatene kia rite ki a ia (ma te ki).

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

OpenVINO hackathon: te mohio ki te reo me nga kare-a-roto i runga i te Raspberry Pi
Patene, tahuna!

Te mahi me te reo

Ka whakamahi matou i te pyaudio ki te hopu i te awa mai i te hopuoro me te webrtcvad ki te tātari haruru me te kite i te reo. I tua atu, ka hangaia e matou he rarangi hei taapiri me te tango i nga waahanga reo.

I te mea he herenga to webrtcvad mo te rahi o te kongakonga kua tukuna - me rite ki te 10/20/30ms, a ko te whakangungu o te tauira mo te mohio kare-a-roto (ka akohia i muri mai) i mahia i runga i te huingararaunga 48kHz, ka kapohia nga wahanga 48000×20ms/1000×1(mono)=960 paita. Ka hoki mai a Webrtcvad i te Tika/Haka mo ia o enei wahanga, e rite ana ki te aroaro, te kore ranei o te pooti i roto i te wahanga.

Kia whakatinanahia te arorau e whai ake nei:

  • Ka apitihia e matou ki te rarangi nga wahanga he pooti, ​​ki te kore he pooti, ​​katahi ka whakanuia e matou te porotiti o nga kongakonga kau.
  • Mēnā he >=30 (600 ms) te porotiti o ngā mongamonga putua, ka tirohia te rahi o te rārangi o ngā mongamonga kua whakaemihia; mena he >250, ka tāpirihia ki te tūtira; ki te kore, ka whakaarohia ko te roa o te rekoata kaore e ranea hei whangai ki te tauira hei tautuhi i te kaikorero.
  • Mena kei te <30 tonu te porotiti o nga kongakonga putua, me te rahi o te rarangi o nga kongakonga kua kohia ake i te 300, katahi ka taapirihia te kongakonga ki te rarangi kia tika ake te matapae. (na te mea ka huri haere nga kare-a-roto i roto i te waa)

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

Kua tae ki te wa ki te rapu tauira kua whakangungua i mua i te waahi whanui, haere ki te github, Google, engari kia mahara he here to tatou mo te hoahoanga e whakamahia ana. He waahanga uaua tenei, na te mea me whakamatau koe i nga tauira i runga i o raraunga whakaurunga, me te taapiri, hurihia ki te whakatakotoranga o roto o OpenVINO - IR (Whakaahua Takawaenga). I whakamatauhia e matou mo te 5-7 nga otinga rereke mai i te github, a mena ka mahi tonu te tauira mo te mohio kare-a-roto, na me te mohio o te reo me tatari roa - ka whakamahia e ratou nga hoahoanga uaua ake.

Ka arotahi matou ki nga mea e whai ake nei:

I muri mai ka korero tatou mo te huri tauira, timata mai i te ariā. He maha nga waahanga o OpenVINO:

  • Tuwhera Model Zoo, nga tauira ka taea te whakamahi me te whakauru ki to hua
  • Tauira Optimzer, na reira ka taea e koe te huri i tetahi tauira mai i nga momo anga (Tensorflow, ONNX me etahi atu) ki te whakatakotoranga Whakaaturanga Takawaenga, ka mahi ano matou.
  • Inference Engine ka taea e koe te whakahaere tauira i roto i te whakatakotoranga IR i runga i nga tukatuka Intel, Myriad chips and Neural Compute Stick accelerators
  • Ko te putanga tino pai o OpenCV (me te tautoko Inference Engine)
    Ko ia tauira i roto i te whakatakotoranga IR e whakaahuahia ana e nga konae e rua: .xml me .bin.
    Ka hurihia nga tauira ki te whakatakotoranga IR ma te Tauira Arotauira penei:

    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 ka taea e koe te kowhiri i te whakatakotoranga raraunga e mahi ai te tauira. FP32, FP16, INT8 e tautokohia ana. Ko te whiriwhiri i te momo raraunga tino pai ka taea te whakanui i te mahi pai.
    --input_shape e tohu ana i te rahi o nga raraunga whakauru. Ko te kaha ki te whakarereke i te ahua kei roto i te C ++ API, engari kaore matou i keri i tera tawhiti ka whakatika noa mo tetahi o nga tauira.
    Muri iho, me ngana ki te uta i te tauira kua hurihia ki te whakatakotoranga IR ma te DNN module ki OpenCV ka tuku atu ki a ia.

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

    Ko te rarangi whakamutunga i tenei keehi ka taea e koe te huri i nga tatauranga ki te Neural Compute Stick, ka mahia nga tatauranga taketake i runga i te tukatuka, engari mo te Raspberry Pi kaore tenei e mahi, ka hiahia koe ki te rakau.

    I muri mai, ko te arorau e whai ake nei: ka wehewehea o tatou oro ki nga matapihi o tetahi rahi (mo matou ko te 0.4 s), ka hurihia enei matapihi ki te MFCC, ka whangaia e matou ki te matiti:

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

    I muri mai, me tango e tatou te akomanga tino noa mo nga matapihi katoa. He otinga ngawari, engari mo te hackathon kaore koe e hiahia ki te whakaputa mai i tetahi mea tino maamaa, mena he wa koe. He nui tonu nga mahi hei mahi, no reira me haere tonu tatou - ka mahi tatou i te mohiotanga reo. He mea tika ki te hanga i etahi momo putunga korero hei penapena i nga momo reo i tuhia i mua i te rekoata. I te mea he iti te wa e toe ana, ka whakatauhia e matou tenei take i runga i te pai ka taea.

    Ara, ka hangaia he tuhinga mo te tuhi i tetahi waahanga reo (he rite tonu te mahi ki te korero i runga ake nei, ka haukotia mai i te papapātuhi ka tiakina te reo ki tetahi konae).

    Kia tamata tatou:

    python3 voice_db/record_voice.py test.wav

    Ka tuhi matou i nga reo o te tini o nga tangata (i ta matou keehi, e toru nga mema o te roopu)
    I muri mai, mo ia reo kua rekotia ka mahia e matou he huringa tere e wha, ka whiwhi i te spectrogram ka penapena hei huranga numpy (.npy):

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

    Ētahi atu kōrero i roto i te kōnae create_base.py
    Ko te mutunga mai, ka whakahaere tatou i te tuhinga matua, ka whiwhi tatou i nga whakaurunga mai i enei spectrograms i te timatanga:

    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)

    I muri i te whiwhinga o te whakaurunga mai i te wahanga oro, ka taea e tatou te whakatau ko wai no tena ma te tango i te tawhiti o te cosine mai i te whiti ki nga reo katoa i roto i te papaa raraunga (te iti ake, ka kaha ake) - mo te demo ka whakatauhia e matou te paepae. ki te 0.3):

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

    I te mutunga, e hiahia ana ahau ki te mohio he tere te tere o te whakatau ka taea te taapiri i etahi atu tauira 1-2 (mo te tauira 7 hēkona te roa ka 2.5 mo te whakatau). Kua kore matou i whai taima ki te taapiri tauira hou me te aro ki te tuhi tauira o te tono tukutuku.

    Taupānga Tukutuku

    He mea nui: ka mau matou i te pouara mai i te kaainga me te whakarite i to maatau whatunga rohe, ka awhina i te hono i te taputapu me nga pona ki runga i te whatunga.

    Ko te tuara he hongere karere mutunga-ki-mutunga i waenga i te mua me te Raspberry Pi, i runga i te hangarau tukutuku (http over tcp protocol).

    Ko te waahi tuatahi ko te tango i nga korero tukatuka mai i te raspberry, ara, ko nga kaikorero kua whakakiia ki roto i te json, ka tiakina ki roto i te papaaarangi i te haurua o to raatau haerenga kia taea ai te whakaputa tatauranga mo te ahuatanga o te kare a te kaiwhakamahi mo te waa. Ka tukuna tenei kete ki te pito o mua, e whakamahi ana i te ohaurunga me te tango i nga paatete mai i te pito mutunga. Ko te katoa o nga mahi o muri he mea hanga ki te reo golang; i whiriwhiria na te mea he pai mo nga mahi tukutahi, he pai te whakahaere a nga goroutine.
    I te wa e uru ana ki te waahi mutunga, ka rehitatia te kaiwhakamahi ka uru ki roto i te hanganga, katahi ka tae mai tana karere. Ko te kaiwhakamahi me te karere ka uru ki roto i te tari kotahi, ka tukuna atu ano nga karere (ki te ohaurunga o mua), a ki te kati te kaiwhakamahi i te hononga (rōperepere, mua ranei), ka whakakorehia tana ohaurunga ka tangohia mai i a ia. te puku.

    OpenVINO hackathon: te mohio ki te reo me nga kare-a-roto i runga i te Raspberry Pi
    Kei te tatari matou mo te hononga mai i muri

    Ko te pito-mua he tono tukutuku kua tuhia ki te JavaScript ma te whakamahi i te whare pukapuka React hei tere me te whakangwari i te tukanga whanaketanga. Ko te kaupapa o tenei tono ko te tiro i nga raraunga i whiwhi ma te whakamahi i nga algorithm e rere ana i te taha ki muri me te tika ki te Raspberry Pi. Ko te wharangi kua whakatinanahia te ararere-waahanga ma te whakamahi i te react-router, engari ko te wharangi matua o te paanga ko te wharangi matua, kei reira te rerenga o nga raraunga ka whiwhi i te waa tuuturu mai i te kaimau ma te whakamahi i te hangarau WebSocket. Ka kitea e te Raspberry Pi he reo, ka whakatau mena no tetahi tangata motuhake mai i te papaa raraunga kua rehitatia, ka tukuna he rarangi tupono ki te kiritaki. Ka whakaatu te kiritaki i nga raraunga hou e tika ana, ka whakaatu i te avatar o te tangata i korero ki te hopuoro, me te kare-a-roto e whakahua ana ia i nga kupu.

    OpenVINO hackathon: te mohio ki te reo me nga kare-a-roto i runga i te Raspberry Pi
    Whārangi Kāinga me ngā matapae kua whakahoutia

    mutunga

    Kaore i taea te whakaoti i nga mea katoa i whakaritea, karekau he wa, no reira ko te tino tumanako kei roto i te demo, ka pai nga mea katoa. I roto i te whakaaturanga i korero ratou mo te mahi o nga mea katoa, he aha nga tauira i tangohia e ratou, he aha nga raruraru i pa ki a ratou. I muri mai ko te wahanga demo - ka hikoi nga tohunga i te ruuma i runga i te raupapa ohorere ka whakatata atu ki ia kapa ki te titiro ki te tauira mahi. I patai ano ratou ki a matou, i whakautu nga tangata katoa ki a raatau waahanga, i waiho e ratou te paetukutuku i runga i te pona, a ka tino mahi nga mea katoa i runga i te tumanako.

    Kia mahara ahau ko te tapeke utu mo ta matou otinga he $150:

    • Rahipere Pi 3 ~ $35
    • Google AIY Voice Bonnet (ka taea e koe te tango i te utu korero) ~ 15$
    • Intel NCS 2 ~ 100$

    Me pehea te whakapai ake:

    • Whakamahia te rehitatanga mai i te kiritaki - tono kia panuihia te tuhinga ka mahia matapōkeretia
    • Tāpirihia etahi tauira: ka taea e koe te whakatau i te ira tangata me te tau ma te reo
    • Wehea nga reo tangi kotahi (diaarization)

    Pūtaka: https://github.com/vladimirwest/OpenEMO

    OpenVINO hackathon: te mohio ki te reo me nga kare-a-roto i runga i te Raspberry Pi
    Kua ngenge engari kei te koa matou

    Hei whakamutunga, ka mihi au ki nga kaiwhakarite me nga kaiuru. I roto i nga kaupapa o etahi atu kapa, i pai ki a matou te otinga mo te aro turuki i nga waahi waka kore utu. Ki a matou, he wheako tino hauhautanga o te rumaki ki te hua me te whanaketanga. Kei te tumanako ahau ka nui ake nga huihuinga whakamere ki nga rohe, tae atu ki nga kaupapa AI.

Source: will.com

Tāpiri i te kōrero