OpenVINO hackathon: Raspberry Pi හි හඬ සහ හැඟීම් හඳුනා ගැනීම

නොවැම්බර් 30 - දෙසැම්බර් 1 වන දින Nizhny Novgorod හිදී පැවැත්විණි OpenVINO hackathon. Intel OpenVINO මෙවලම් කට්ටලය භාවිතයෙන් නිෂ්පාදන විසඳුමක මූලාකෘතියක් නිර්මාණය කිරීමට සහභාගිවන්නන්ගෙන් ඉල්ලා සිටියේය. සංවිධායකයින් විසින් කාර්යයක් තෝරාගැනීමේදී මඟ පෙන්විය හැකි ආසන්න මාතෘකා ලැයිස්තුවක් යෝජනා කළ නමුත් අවසාන තීරණය කණ්ඩායම් සතු විය. මීට අමතරව, නිෂ්පාදනයට ඇතුළත් නොවන ආකෘති භාවිතය දිරිමත් කරන ලදී.

OpenVINO hackathon: Raspberry Pi හි හඬ සහ හැඟීම් හඳුනා ගැනීම

මෙම ලිපියෙන් අපි ඔබට කියන්නෙමු නිෂ්පාදනයේ අපගේ මූලාකෘතිය අපි නිර්මාණය කළ ආකාරය ගැන, අවසානයේ අපි පළමු ස්ථානයට පත් වූවෙමු.

Hackathon සඳහා කණ්ඩායම් 10කට අධික සංඛ්‍යාවක් සහභාගී විය. ඔවුන්ගෙන් සමහරක් වෙනත් ප්‍රදේශවලින් පැමිණීම සතුටක්. Hackathon සඳහා ස්ථානය වූයේ "Kremlinsky on Pochain" සංකීර්ණය වන අතර, නිශ්නි නොව්ගොරොඩ්ගේ පුරාණ ඡායාරූප පිරිවරක එල්ලා තිබුණි! (මේ මොහොතේ 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 හඬ කට්ටලය, එහි රැහැන්ගත ස්ටීරියෝ මයික්‍රෆෝනයක් ඇත.

Raspbian වෙතින් බාගන්න AIY ව්‍යාපෘති ගබඩාව සහ එය ෆ්ලෑෂ් ඩ්‍රයිව් එකකට උඩුගත කරන්න, පහත විධානය භාවිතා කර මයික්‍රොෆෝනය ක්‍රියා කරන දැයි පරීක්ෂා කරන්න (එය තත්පර 5 ක ශ්‍රව්‍ය පටිගත කර ගොනුවකට සුරකිනු ඇත):

arecord -d 5 -r 16000 test.wav

මයික්රොෆෝනය ඉතා සංවේදී වන අතර ශබ්දය හොඳින් ලබා ගන්නා බව මම වහාම සටහන් කළ යුතුය. මෙය නිවැරදි කිරීම සඳහා, අපි alsamixer වෙත ගොස්, Capture උපාංග තෝරා, ආදාන සංඥා මට්ටම 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 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 hackathon: Raspberry Pi හි හඬ සහ හැඟීම් හඳුනා ගැනීම
බොත්තම, පුළුස්සා දමන්න!

හඬ සමඟ වැඩ කිරීම

අපි ශබ්ද පෙරීමට සහ හඬ හඳුනා ගැනීමට මයික්‍රෆෝනය සහ webrtcvad වෙතින් ප්‍රවාහය ග්‍රහණය කර ගැනීමට pyaudio භාවිතා කරන්නෙමු. ඊට අමතරව, අපි හඬ උද්ධෘත අසමමුහුර්තව එකතු කර ඉවත් කරන පෝලිමක් සාදන්නෙමු.

webrtcvad සපයා ඇති කොටසෙහි ප්‍රමාණයට සීමාවක් ඇති බැවින් - එය 10/20/30ms ට සමාන විය යුතු අතර, හැඟීම් හඳුනාගැනීම සඳහා ආකෘතිය පුහුණු කිරීම (අපි පසුව ඉගෙන ගන්නා පරිදි) 48kHz දත්ත කට්ටලයක් මත සිදු කරන ලදී. 48000×20ms/1000×1(mono)=960 bytes ප්‍රමාණයේ කුට්ටි ග්‍රහණය කරන්න. Webrtcvad මෙම එක් එක් කුට්ටි සඳහා සත්‍ය/අසත්‍යය ලබා දෙනු ඇත, එය කුට්ටියෙහි ඡන්දයක් තිබීම හෝ නොපැවතීමට අනුරූප වේ.

පහත තර්කය ක්‍රියාත්මක කරමු.

  • අපි ලයිස්තුවට ඡන්දයක් ඇති කුට්ටි එකතු කරන්නෙමු; ඡන්දයක් නොමැති නම්, අපි හිස් කුට්ටි කවුන්ටරය වැඩි කරන්නෙමු.
  • හිස් කුට්ටි කවුන්ටරය >=30 (මිලිස් 600) නම්, අපි සමුච්චිත කුට්ටි ලැයිස්තුවේ ප්‍රමාණය දෙස බලමු; එය > 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 (අතරමැදි නියෝජනය). අපි github වෙතින් විවිධ විසඳුම් 5-7 ක් පමණ උත්සාහ කළ අතර, හැඟීම් හඳුනාගැනීමේ ආකෘතිය වහාම ක්‍රියාත්මක වූයේ නම්, හඬ හඳුනාගැනීමෙන් අපට වැඩි කාලයක් බලා සිටීමට සිදු විය - ඔවුන් වඩාත් සංකීර්ණ ගෘහ නිර්මාණ ශිල්පය භාවිතා කරයි.

අපි පහත සඳහන් කරුණු කෙරෙහි අවධානය යොමු කරමු:

  • හඬින් හැඟුම් - https://github.com/alexmuhr/Voice_Emotion
    එය පහත සඳහන් මූලධර්මය අනුව ක්‍රියා කරයි: ශ්‍රව්‍ය යම් ප්‍රමාණයේ ඡේදවලට කපා ඇත, මෙම එක් එක් ඡේදය සඳහා අපි තෝරා ගනිමු MFCC ඉන්පසු ඒවා CNN වෙත ආදානය ලෙස ඉදිරිපත් කරන්න
  • හඬ හඳුනාගැනීම - https://github.com/linhdvu14/vggvox-speaker-identification
    මෙන්න, MFCC වෙනුවට, අපි වර්ණාවලීක්ෂයක් සමඟ වැඩ කරන්නෙමු, FFT ට පසුව අපි CNN වෙත සංඥා පෝෂණය කරමු, ප්රතිදානයේදී අපට හඬෙහි දෛශික නිරූපණයක් ලැබේ.

මීළඟට අපි න්‍යායෙන් පටන් ගෙන ආකෘති පරිවර්තනය කිරීම ගැන කතා කරමු. OpenVINO මොඩියුල කිහිපයක් ඇතුළත් වේ:

  • විවෘත ආදර්ශ සත්වෝද්‍යානය, භාවිතා කළ හැකි සහ ඔබේ නිෂ්පාදනයට ඇතුළත් කළ හැකි ආකෘති
  • Model Optimzer, ඔබට විවිධ රාමු ආකෘතිවලින් (Tensorflow, ONNX etc) ආකෘතියක් අතරමැදි නියෝජන ආකෘතියට පරිවර්තනය කළ හැකි ස්තුතිය, ඒ සමඟ අපි තවදුරටත් වැඩ කරන්නෙමු.
  • Inference Engine ඔබට Intel ප්‍රොසෙසර, Myriad chips සහ Neural Compute Stick ත්වරණකාරක මත IR ආකෘතියෙන් ආකෘති ධාවනය කිරීමට ඉඩ සලසයි.
  • OpenCV හි වඩාත්ම කාර්යක්ෂම අනුවාදය (Inference Engine සහාය ඇතිව)
    IR ආකෘතියේ සෑම ආකෘතියක්ම ගොනු දෙකකින් විස්තර කෙරේ: .xml සහ .bin.
    පහත දැක්වෙන ආකාරයට Model Optimizer හරහා මාදිලි IR ආකෘතියට පරිවර්තනය වේ:

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

    ඊළඟට, අපි සියලු කවුළු සඳහා වඩාත් පොදු පන්තිය ගනිමු. සරල විසඳුමක්, නමුත් hackathon සඳහා ඔබට ඕනෑවට වඩා වියුක්ත දෙයක් ඉදිරිපත් කිරීමට අවශ්‍ය නැත, ඔබට කාලය තිබේ නම් පමණි. අපට තව කිරීමට බොහෝ වැඩ ඇත, එබැවින් අපි ඉදිරියට යමු - අපි හඬ හඳුනාගැනීම සමඟ කටයුතු කරන්නෙමු. පූර්ව පටිගත කරන ලද හඬ වර්ණාවලි ගබඩා කරන යම් ආකාරයක දත්ත සමුදායක් සෑදිය යුතුය. තව සුළු කාලයක් ඉතිරිව ඇති බැවින්, අපි මෙම ගැටළුව අපට හැකි උපරිමයෙන් විසඳා ගනිමු.

    එනම්, අපි හඬ උපුටනයක් පටිගත කිරීම සඳහා ස්ක්‍රිප්ට් එකක් සාදන්නෙමු (එය ඉහත විස්තර කර ඇති ආකාරයටම ක්‍රියා කරයි, යතුරුපුවරුවෙන් බාධා කළ විට පමණක් එය ගොනුවකට හඬ සුරකිනු ඇත).

    අපි උත්සාහ කරමු:

    python3 voice_db/record_voice.py test.wav

    අපි කිහිප දෙනෙකුගේ කටහඬ පටිගත කරමු (අපගේ නඩුවේදී, කණ්ඩායම් සාමාජිකයින් තිදෙනෙකු)
    ඊළඟට, පටිගත කරන ලද සෑම හඬක් සඳහාම අපි වේගවත් හතරේ පරිවර්තනයක් සිදු කර, වර්ණාවලීක්ෂයක් ලබාගෙන එය nmpy 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 ක් ගත විය). අපට තවදුරටත් නව මාදිලි එකතු කිරීමට කාලය නොමැති අතර වෙබ් යෙදුමේ මූලාකෘතියක් ලිවීමට අවධානය යොමු කළෙමු.

    වෙබ් යෙදුම

    වැදගත් කරුණක්: අපි නිවසේ සිට රවුටරයක් ​​රැගෙන අපගේ දේශීය ජාලය සකසන්නෙමු, එය ජාලය හරහා උපාංගය සහ ලැප්ටොප් සම්බන්ධ කිරීමට උපකාරී වේ.

    පසුපෙළ යනු websocket තාක්ෂණය මත පදනම් වූ (http over tcp protocol) ඉදිරිපස සහ Raspberry Pi අතර අන්තයේ සිට අගට පණිවිඩ නාලිකාවකි.

    පළමු අදියර වන්නේ රාස්ප්බෙරි වෙතින් සකසන ලද තොරතුරු ලබා ගැනීමයි, එනම් json හි ඇසුරුම් කර ඇති අනාවැකිකරුවන්, ඔවුන්ගේ ගමනේ අඩක් දත්ත ගබඩාවේ සුරකින අතර එමඟින් කාලසීමාව සඳහා පරිශීලකයාගේ චිත්තවේගීය පසුබිම පිළිබඳ සංඛ්‍යාලේඛන ජනනය කළ හැකිය. මෙම පැකට්ටුව පසුව ඉදිරිපස වෙත යවනු ලැබේ, එය දායකත්වය භාවිතා කරන අතර වෙබ්සොකට් අන්ත ලක්ෂ්‍යයෙන් පැකට් ලබා ගනී. සම්පූර්ණ පසුපෙළ යාන්ත්‍රණය ගොලාං භාෂාවෙන් ගොඩනගා ඇත; එය තෝරාගෙන ඇත්තේ එය goroutines හොඳින් හසුරුවන අසමමුහුර්ත කාර්යයන් සඳහා හොඳින් ගැලපෙන බැවිනි.
    අවසාන ලක්ෂ්‍යයට ප්‍රවේශ වන විට, පරිශීලකයා ලියාපදිංචි වී ව්‍යුහයට ඇතුළු වන අතර පසුව ඔහුගේ පණිවිඩය ලැබේ. පරිශීලකයා සහ පණිවිඩය යන දෙකම පොදු කේන්ද්‍රස්ථානයකට ඇතුළත් කර ඇති අතර, එයින් පණිවිඩ දැනටමත් (දායක වූ ඉදිරිපසට) යවා ඇති අතර, පරිශීලකයා සම්බන්ධතාවය (රාස්ප්බෙරි හෝ ඉදිරිපස) වසා දැමුවහොත්, ඔහුගේ දායකත්වය අවලංගු කර ඔහු ඉවත් කරනු ලැබේ. කේන්ද්රය.

    OpenVINO hackathon: Raspberry Pi හි හඬ සහ හැඟීම් හඳුනා ගැනීම
    අපි පිටුපස සිට සම්බන්ධතාවයක් බලා සිටිමු

    Front-end යනු සංවර්ධන ක්‍රියාවලිය වේගවත් කිරීමට සහ සරල කිරීමට ප්‍රතික්‍රියා පුස්තකාලය භාවිතයෙන් JavaScript හි ලියා ඇති වෙබ් යෙදුමකි. මෙම යෙදුමේ පරමාර්ථය වන්නේ පසුපස කෙළවරේ සහ කෙලින්ම Raspberry Pi මත ධාවනය වන ඇල්ගොරිතම භාවිතයෙන් ලබාගත් දත්ත දෘශ්‍යමාන කිරීමයි. පිටුවෙහි ප්‍රතික්‍රියා-රවුටරය භාවිතයෙන් ක්‍රියාත්මක කර ඇති අංශ මාර්ගගත කිරීම් ඇත, නමුත් උනන්දුවක් දක්වන ප්‍රධාන පිටුව ප්‍රධාන පිටුව වේ, එහිදී WebSocket තාක්ෂණය භාවිතයෙන් සේවාදායකයෙන් තත්‍ය කාලීන දත්ත ප්‍රවාහයක් ලැබේ. Raspberry Pi හඬක් හඳුනාගෙන, එය ලියාපදිංචි දත්ත ගබඩාවෙන් නිශ්චිත පුද්ගලයෙකුට අයත් දැයි තීරණය කරයි, සහ සේවාදායකයාට සම්භාවිතා ලැයිස්තුවක් යවයි. සේවාදායකයා නවතම අදාළ දත්ත ප්‍රදර්ශනය කරයි, බොහෝ විට මයික්‍රොෆෝනයට කතා කළ පුද්ගලයාගේ අවතාරය මෙන්ම ඔහු වචන උච්චාරණය කරන හැඟීම් පෙන්වයි.

    OpenVINO hackathon: Raspberry Pi හි හඬ සහ හැඟීම් හඳුනා ගැනීම
    යාවත්කාලීන අනාවැකි සහිත මුල් පිටුව

    නිගමනය

    සැලසුම් කළ පරිදි සෑම දෙයක්ම සම්පූර්ණ කිරීමට නොහැකි විය, අපට සරලව කාලය නොතිබුණි, එබැවින් ප්රධාන බලාපොරොත්තුව demo හි විය, සියල්ල ක්රියාත්මක වනු ඇත. ඉදිරිපත් කිරීමේදී ඔවුන් සෑම දෙයක්ම ක්‍රියාත්මක වන ආකාරය, ඔවුන් ගත් ආකෘති මොනවාද, ඔවුන් මුහුණ දුන් ගැටළු මොනවාද යන්න ගැන කතා කළහ. ඊළඟට demo කොටස විය - විශේෂඥයන් අහඹු ලෙස කාමරය වටා ඇවිද ගිය අතර වැඩ කරන මූලාකෘතිය දෙස බැලීමට එක් එක් කණ්ඩායම වෙත ළඟා විය. ඔවුන් අපෙන් ද ප්‍රශ්න ඇසුවා, සෑම කෙනෙකුම ඔවුන්ගේ කොටසට පිළිතුරු දුන්නා, ඔවුන් ලැප්ටොප් පරිගණකයෙන් වෙබයෙන් ඉවත් වූ අතර, සියල්ල බලාපොරොත්තු වූ ආකාරයටම ක්‍රියාත්මක විය.

    අපගේ විසඳුමේ මුළු පිරිවැය ඩොලර් 150 ක් බව මම සටහන් කරමි:

    • Raspberry Pi 3 ~ $35
    • Google AIY Voice Bonnet (ඔබට ප්‍රකාශක ගාස්තුවක් ගත හැක) ~ 15$
    • Intel NCS 2 ~ 100$

    වැඩිදියුණු කරන්නේ කෙසේද:

    • සේවාලාභියාගෙන් ලියාපදිංචිය භාවිතා කරන්න - අහඹු ලෙස ජනනය වන පෙළ කියවීමට අසන්න
    • තවත් ආකෘති කිහිපයක් එකතු කරන්න: ඔබට කටහඬින් ලිංගභේදය සහ වයස තීරණය කළ හැකිය
    • එකවර ශබ්ද කරන හඬ වෙන් කරන්න (දිරාකරණය)

    ගබඩාව: https://github.com/vladimirwest/OpenEMO

    OpenVINO hackathon: Raspberry Pi හි හඬ සහ හැඟීම් හඳුනා ගැනීම
    මහන්සි වුනාට අපි සතුටින්

    අවසාන වශයෙන්, සංවිධායකයින්ට සහ සහභාගී වූවන්ට මම ස්තූති කිරීමට කැමතියි. වෙනත් කණ්ඩායම්වල ව්‍යාපෘති අතර, නොමිලේ වාහන නැවැත්වීමේ ස්ථාන නිරීක්ෂණය කිරීමේ විසඳුමට අපි පෞද්ගලිකව කැමති විය. අපට, එය නිෂ්පාදනයේ සහ සංවර්ධනයේ ගිල්වීමේ අපූරු අත්දැකීමක් විය. AI මාතෘකා ඇතුළුව කලාපවල වැඩි වැඩියෙන් රසවත් සිදුවීම් පවත්වනු ඇතැයි මම බලාපොරොත්තු වෙමි.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න