OpenVINO հաքաթոն. ձայնի և զգացմունքների ճանաչում Raspberry Pi-ում

Նոյեմբերի 30-ից դեկտեմբերի 1-ը Նիժնի Նովգորոդում կայացել է OpenVINO հաքաթոն. Մասնակիցներին խնդրել են ստեղծել արտադրանքի լուծման նախատիպ՝ օգտագործելով Intel OpenVINO գործիքակազմը: Կազմակերպիչները առաջարկել են մոտավոր թեմաների ցանկ, որոնցով կարելի է առաջնորդվել առաջադրանք ընտրելիս, սակայն վերջնական որոշումը մնացել է թիմերին: Բացի այդ, խրախուսվել է մոդելների օգտագործումը, որոնք ներառված չեն արտադրանքի մեջ։

OpenVINO հաքաթոն. ձայնի և զգացմունքների ճանաչում Raspberry Pi-ում

Այս հոդվածում մենք ձեզ կպատմենք այն մասին, թե ինչպես ստեղծեցինք արտադրանքի մեր նախատիպը, որով մենք ի վերջո գրավեցինք առաջին տեղը։

Հեքըթոնին մասնակցել է ավելի քան 10 թիմ։ Հաճելի է, որ նրանցից մի քանիսը եկել են այլ մարզերից։ Հեքըթոնի անցկացման վայրը «Կրեմլինսկին Պոչայնի վրա» համալիրն էր, որտեղ ներսում՝ շքախմբով կախված էին Նիժնի Նովգորոդի հնագույն լուսանկարները: (Հիշեցնում եմ, որ այս պահին Intel-ի կենտրոնական գրասենյակը գտնվում է Նիժնի Նովգորոդում): Մասնակիցներին տրվել է 26 ժամ կոդ գրելու համար, իսկ վերջում նրանք պետք է ներկայացնեին իրենց լուծումը։ Առանձին առավելություն էր ցուցադրական սեսիայի առկայությունը՝ համոզվելու համար, որ այն ամենը, ինչ ծրագրված էր, իրականում իրականացվել է և ներկայացման մեջ գաղափարներ չեն մնացել։ Ապրանքներ, խորտիկներ, սնունդ, ամեն ինչ նույնպես այնտեղ էր:

Բացի այդ, Intel-ն ընտրովի տրամադրեց տեսախցիկներ, Raspberry PI, Neural Compute Stick 2:

Առաջադրանքների ընտրություն

Ազատ ձևի հաքաթոնին պատրաստվելու ամենադժվար մասերից մեկը մարտահրավեր ընտրելն է: Մենք անմիջապես որոշեցինք հանդես գալ մի բանով, որը դեռ չկար ապրանքի մեջ, քանի որ հայտարարության մեջ ասվում էր, որ սա շատ ողջունելի է:

Վերլուծելով մոդելներ, որոնք ներառված են արտադրանքի ընթացիկ թողարկման մեջ, մենք գալիս ենք այն եզրակացության, որ դրանցից շատերը լուծում են համակարգչային տեսողության տարբեր խնդիրներ։ Ավելին, համակարգչային տեսողության ոլորտում շատ դժվար է այնպիսի խնդիր առաջացնել, որը հնարավոր չէ լուծել OpenVINO-ի միջոցով, և եթե նույնիսկ կարելի է հորինել, դժվար է հանրության մեջ նախապես պատրաստված մոդելներ գտնել: Մենք որոշում ենք փորել այլ ուղղությամբ՝ դեպի խոսքի մշակում և վերլուծություն: Դիտարկենք խոսքից զգացմունքները ճանաչելու հետաքրքիր առաջադրանք. Պետք է ասել, որ OpenVINO-ն արդեն ունի մոդել, որը որոշում է մարդու հույզերը՝ հիմնվելով նրա դեմքի վրա, սակայն.

  • Տեսականորեն հնարավոր է ստեղծել համակցված ալգորիթմ, որը կաշխատի և՛ ձայնի, և՛ պատկերի վրա, որը պետք է ճշգրտության բարձրացում տա։
  • Տեսախցիկները սովորաբար ունեն դիտման նեղ անկյուն, մեծ տարածք ծածկելու համար պահանջվում է մեկից ավելի տեսախցիկ, ձայնը նման սահմանափակում չունի:

Եկեք զարգացնենք գաղափարը. հիմք ընդունենք մանրածախ սեգմենտի գաղափարը: Դուք կարող եք չափել հաճախորդների գոհունակությունը խանութների վաճառակետերում: Եթե ​​հաճախորդներից մեկը դժգոհ է ծառայությունից և սկսում է բարձրաձայնել, կարող եք անմիջապես զանգահարել ադմինիստրատորին օգնության համար:
Այս դեպքում մենք պետք է ավելացնենք մարդու ձայնի ճանաչումը, դա թույլ կտա մեզ տարբերել խանութի աշխատակիցներին հաճախորդներից և տրամադրել վերլուծություն յուրաքանչյուր անհատի համար։ Դե, բացի այդ, հնարավոր կլինի վերլուծել հենց խանութի աշխատակիցների պահվածքը, գնահատել թիմում տիրող մթնոլորտը, լավ է հնչում:

Մենք ձևակերպում ենք մեր լուծման պահանջները.

  • Թիրախային սարքի փոքր չափը
  • Իրական ժամանակի շահագործում
  • Ցածր գին
  • Հեշտ մասշտաբայնություն

Արդյունքում մենք ընտրում ենք Raspberry Pi 3 c որպես թիրախային սարք Intel NCS 2.

Այստեղ կարևոր է նշել NCS-ի մեկ կարևոր առանձնահատկությունը. այն լավագույնս աշխատում է ստանդարտ CNN ճարտարապետության հետ, բայց եթե ձեզ հարկավոր է գործարկել հատուկ շերտերով մոդել, ապա սպասեք ցածր մակարդակի օպտիմալացում:

Միայն մի փոքր բան կա անելու՝ պետք է խոսափող ձեռք բերել: Սովորական USB խոսափողը լավ կլինի, բայց RPI-ի հետ միասին լավ տեսք չի ունենա: Բայց նույնիսկ այստեղ լուծումը բառացիորեն «մոտ է կանգնած»: Ձայնը ձայնագրելու համար մենք որոշում ենք օգտագործել Voice Bonnet տախտակը հավաքածուից Google AIY Voice Kit, որի վրա տեղադրված է լարային ստերեո խոսափող։

Ներբեռնեք Raspbian-ը AIY նախագծերի պահոց և վերբեռնեք այն ֆլեշ կրիչի վրա, ստուգեք, որ խոսափողը աշխատում է հետևյալ հրամանով (այն ձայնագրելու է 5 վայրկյան տևողությամբ և այն կպահի ֆայլում).

arecord -d 5 -r 16000 test.wav

Անմիջապես պետք է նշեմ, որ խոսափողը շատ զգայուն է և լավ է ընդունում աղմուկը: Դա շտկելու համար եկեք գնանք alsamixer, ընտրենք Capture devices և իջեցնենք մուտքային ազդանշանի մակարդակը մինչև 50-60%:

OpenVINO հաքաթոն. ձայնի և զգացմունքների ճանաչում 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 Tuple-ի և 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 հաքաթոն. ձայնի և զգացմունքների ճանաչում Raspberry Pi-ում
Կոճակ, այրի՛ր:

Ձայնի հետ աշխատելը

Մենք կօգտագործենք pyaudio-ն՝ ձայնագրման հոսքը խոսափողից և webrtcvad-ից՝ աղմուկը զտելու և ձայնը հայտնաբերելու համար: Բացի այդ, մենք կստեղծենք հերթ, որին ասինխրոն կերպով կավելացնենք և կհեռացնենք ձայնային հատվածներ։

Քանի որ webrtcvad-ն ունի մատակարարված հատվածի չափի սահմանափակում. այն պետք է հավասար լինի 10/20/30 մվ, իսկ հույզերի ճանաչման մոդելի ուսուցումը (ինչպես հետագայում կիմանանք) իրականացվել է 48 կՀց տվյալների բազայի վրա, մենք գրավել 48000×20ms/1000×1(մոնո)=960 բայթ չափի կտորներ: 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 (միջանկյալ ներկայացուցչություն): Մենք փորձեցինք մոտ 5-7 տարբեր լուծումներ github-ից, և եթե հույզերի ճանաչման մոդելն անմիջապես աշխատեց, ապա ձայնի ճանաչման դեպքում մենք ստիպված էինք ավելի երկար սպասել. նրանք օգտագործում են ավելի բարդ ճարտարապետություններ:

Մենք կենտրոնանում ենք հետևյալի վրա.

  • Զգացմունքներ ձայնից - https://github.com/alexmuhr/Voice_Emotion
    Այն աշխատում է հետևյալ սկզբունքով. աուդիոն կտրվում է որոշակի չափի հատվածների, այս հատվածներից յուրաքանչյուրի համար մենք ընտրում ենք MFCC և այնուհետև դրանք ներկայացնել որպես մուտքագրում CNN-ին
  • Ձայնի ճանաչում - https://github.com/linhdvu14/vggvox-speaker-identification
    Այստեղ MFCC-ի փոխարեն աշխատում ենք սպեկտրոգրամով, FFT-ից հետո ազդանշանը սնուցում ենք CNN-ին, որտեղ ելքի վրա ստանում ենք ձայնի վեկտորային ներկայացում։

Հաջորդիվ կխոսենք մոդելների փոխակերպման մասին՝ սկսած տեսությունից։ OpenVINO-ն ներառում է մի քանի մոդուլներ.

  • Բաց մոդելային կենդանաբանական այգի, մոդելներ, որոնցից կարող են օգտագործվել և ներառվել ձեր արտադրանքի մեջ
  • Model Optimzer, որի շնորհիվ դուք կարող եք մոդելը փոխարկել տարբեր շրջանակային ձևաչափերից (Tensorflow, ONNX և այլն) միջանկյալ ներկայացման ձևաչափի, որի հետ մենք կաշխատենք հետագա:
  • 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-ի դեպքում դա չի աշխատի, ձեզ կպահանջվի փայտիկ:

    Հաջորդը, տրամաբանությունը հետևյալն է. մենք բաժանում ենք մեր ձայնը որոշակի չափի պատուհանների (մեզ համար դա 0.4 վ է), մենք այս պատուհաններից յուրաքանչյուրը վերածում ենք MFCC-ի, որն այնուհետև կերակրում ենք ցանցին.

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

    Հաջորդը, եկեք վերցնենք ամենատարածված դասը բոլոր պատուհանների համար: Պարզ լուծում, բայց հեքըթոնի համար պետք չէ շատ անհեթեթ բան հորինել, միայն եթե ժամանակ ունեք: Մենք դեռ շատ աշխատանք ունենք անելու, այնպես որ եկեք առաջ շարժվենք՝ մենք կզբաղվենք ձայնի ճանաչմամբ: Պետք է ստեղծել տվյալների բազա, որտեղ կպահվեն նախապես ձայնագրված ձայների սպեկտրոգրամները։ Քանի որ քիչ ժամանակ է մնացել, մենք հնարավորինս կլուծենք այս հարցը։

    Մասնավորապես, մենք ստեղծում ենք ձայնային հատված ձայնագրելու սցենար (այն աշխատում է նույն կերպ, ինչպես նկարագրված է վերևում, միայն ստեղնաշարից ընդհատվելիս այն կփրկի ձայնը ֆայլում):

    Արի փորձենք:

    python3 voice_db/record_voice.py test.wav

    Մենք ձայնագրում ենք մի քանի հոգու (մեր դեպքում՝ թիմի երեք անդամների) ձայները.
    Այնուհետև, յուրաքանչյուր ձայնագրված ձայնի համար մենք կատարում ենք արագ ֆուրիեր փոխակերպում, ստանում ենք սպեկտրոգրամ և պահպանում այն ​​որպես անփայլ զանգված (.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 արձանագրություն):

    Առաջին փուլը ազնվամորուից մշակված տեղեկատվություն ստանալն է, այսինքն՝ json-ով փաթեթավորված կանխագուշակները, որոնք պահվում են տվյալների բազայում իրենց ճանապարհի կեսին, որպեսզի կարողանան վիճակագրություն ստեղծել տվյալ ժամանակահատվածի համար օգտագործողի էմոցիոնալ ֆոնի մասին: Այս փաթեթն այնուհետև ուղարկվում է ճակատային մաս, որն օգտագործում է բաժանորդագրությունը և փաթեթներ ստանում վեբսոկետի վերջնակետից: Backend-ի ամբողջ մեխանիզմը կառուցված է գոլանգ լեզվով, այն ընտրվել է, քանի որ այն լավ հարմարեցված է ասինխրոն առաջադրանքների համար, որոնք գորուտինները լավ են կատարում:
    Վերջնական կետ մուտք գործելիս օգտվողը գրանցվում և մուտքագրվում է կառուցվածք, այնուհետև ստացվում է նրա հաղորդագրությունը: Ե՛վ օգտատերը, և՛ հաղորդագրությունը մուտքագրվում են ընդհանուր հանգույց, որտեղից հաղորդագրություններն արդեն ուղարկվում են հետագա (դեպի բաժանորդագրված ճակատ), և եթե օգտատերը փակում է կապը (ազնվամորի կամ առջևի), ապա նրա բաժանորդագրությունը չեղարկվում է և նա հեռացվում է։ հանգույցը։

    OpenVINO հաքաթոն. ձայնի և զգացմունքների ճանաչում Raspberry Pi-ում
    Սպասում ենք թիկունքից միացման

    Front-end-ը JavaScript-ով գրված վեբ հավելված է՝ օգտագործելով React գրադարանը՝ մշակման գործընթացը արագացնելու և պարզեցնելու համար: Այս հավելվածի նպատակն է պատկերացնել ստացված տվյալները՝ օգտագործելով ալգորիթմներ, որոնք աշխատում են հետևի մասում և անմիջապես Raspberry Pi-ի վրա: Էջն ունի սեկցիոն երթուղավորում, որն իրականացվում է react-router-ի միջոցով, սակայն հետաքրքրության հիմնական էջը գլխավոր էջն է, որտեղ տվյալների շարունակական հոսքը իրական ժամանակում ստացվում է սերվերից՝ օգտագործելով WebSocket տեխնոլոգիան: Raspberry Pi-ն հայտնաբերում է ձայն, որոշում, թե արդյոք այն պատկանում է կոնկրետ անձին գրանցված տվյալների բազայից, և հաճախորդին ուղարկում է հավանականության ցուցակը: Հաճախորդը ցուցադրում է վերջին համապատասխան տվյալները, ցուցադրում է խոսափողի մեջ ամենայն հավանականությամբ խոսող մարդու ավատարը, ինչպես նաև այն էմոցիան, որով նա արտասանում է բառերը:

    OpenVINO հաքաթոն. ձայնի և զգացմունքների ճանաչում Raspberry Pi-ում
    Գլխավոր էջ՝ թարմացված կանխատեսումներով

    Ամփոփում

    Հնարավոր չեղավ ամեն ինչ ավարտել այնպես, ինչպես պլանավորված էր, մենք պարզապես ժամանակ չունեինք, ուստի հիմնական հույսը ցուցադրման վրա էր, որ ամեն ինչ կաշխատի: Շնորհանդեսում նրանք խոսեցին, թե ինչպես է ամեն ինչ աշխատում, ինչ մոդելներ են վերցրել, ինչ խնդիրների են հանդիպել։ Հաջորդը ցուցադրական մասն էր. փորձագետները պատահական կարգով շրջեցին սենյակում և մոտեցան յուրաքանչյուր թիմին՝ աշխատանքային նախատիպը նայելու համար: Նրանք մեզ նույնպես հարցեր տվեցին, բոլորը պատասխանեցին իրենց մասով, նրանք թողեցին ցանցը նոութբուքի վրա, և ամեն ինչ իսկապես աշխատեց այնպես, ինչպես սպասվում էր:

    Նշեմ, որ մեր լուծման ընդհանուր արժեքը 150 դոլար էր.

    • Raspberry Pi 3 ~ 35 դոլար
    • Google AIY Voice Bonnet (կարող եք վճարել խոսնակի վճար) ~ 15$
    • Intel NCS 2 ~ 100$

    Ինչպես բարելավել.

    • Օգտագործեք գրանցում հաճախորդից. խնդրեք կարդալ պատահականորեն ստեղծված տեքստը
    • Ավելացրե՛ք ևս մի քանի մոդելներ. կարող եք ձայնով որոշել սեռը և տարիքը
    • Առանձնացնել միաժամանակ հնչող ձայները (դիարիզացիա)

    Պահեստ: https://github.com/vladimirwest/OpenEMO

    OpenVINO հաքաթոն. ձայնի և զգացմունքների ճանաչում Raspberry Pi-ում
    Հոգնած, բայց երջանիկ ենք

    Եզրափակելով՝ ուզում եմ շնորհակալություն հայտնել կազմակերպիչներին և մասնակիցներին։ Մյուս թիմերի նախագծերից մեզ անձամբ դուր եկավ անվճար կայանատեղերի մոնիտորինգի լուծումը: Մեզ համար դա արտադրանքի մեջ ընկղմվելու և մշակման ահավոր զիլ փորձ էր: Հուսով եմ, որ մարզերում ավելի ու ավելի հետաքրքիր միջոցառումներ կանցկացվեն, այդ թվում՝ AI թեմաներով։

Source: www.habr.com

Добавить комментарий