ááá¯áááºáá¬á 30 áááºáá±á·á០áá®áááºáá¬á 1 áááºáá±á·á¡áá Nizhny Novgorod ááœáẠáá»ááºážáááŒá¯áá¯ááºáá²á·áá«áááºá
á€áá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááá¯ááºáá¯ááºá ááŸá±á·ááŒá±ážáá¯á¶á á¶ááᯠáááºááá¯á·áááºáá®ážáá²á·ááŒá±á¬ááºážá áá±á¬ááºáá¯á¶ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠááááá±áá¬ááᯠáááŸáááœá¬ážááŒá±á¬ááºáž ááá·áºá¡á¬áž ááŒá±á¬ááŒáá«áááºá
áááºáá¬ááœááºááœáẠá¡áááºáž 10 áá»á±á¬áº áá«áááºáá²á·áááºá ááá»áá¯á·á áááŒá¬ážáá±áá áá¬ááŒáᬠáá±á¬ááºážáá«áááºá áááºáá¬ááœááºááœá²áá»ááºážáááá·áºáá±áá¬ááẠâKremlinsky on Pochainâ á¡áá±á¬ááºá¡á¡á¯á¶ááŒá áºááŒá®ážá á¡áá²ááœáẠNizhny Novgorod á ááŸá±ážáá±ááºáá¬ááºáá¯á¶áá»á¬ážááᯠá¡áá±á¬áºááá¯ááºáá»áááºááœá²áá¬ážááá·áº áá±áá¬ááŒá áºáááºá (ááá¯á¡áá»áááºááœáẠIntel ááááá¯áá¯á¶ážááẠNizhny Novgorod ááœááºáááºááŸáááŒá±á¬ááºážááá·áºá¡á¬ážáá«ááááá±ážáá«áááºá áá«áááºáá°áá»á¬ážááᯠáá¯ááºáá±ážááẠ26 áá¬áá®áá±ážáá¬ážááŒá®áž á¡áá¯á¶ážááœáẠáááºážááá¯á·áá¡ááŒá±ááᯠáááºááŒááááºááŒá áºáááºá áá®ážááŒá¬ážá¡á¬ážáá¬áá»ááºááŸá¬ á á®á ááºáá¬ážááá·áºá¡áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááŸááºááááºá¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®áž áááºáááºááŸá¯ááœáẠá áááºáá°ážáá»á¬ážááá»ááºááŸáá á±ááẠáá±áá»á¬á á±ááẠááá¯ááºááŒá ááºááŸááºáá áºáá¯ááŸááá±ááŒááºážááŒá áºáááºá á á»á±ážá á¡áá¬ááŒá±á á¡á á¬ážá¡á á¬á á¡á¬ážáá¯á¶ážáááºáž ááá¯áá±áá¬ááœáẠááŸááá±áá«áááºá
ááá¯á·á¡ááŒáẠIntel ááẠáááºááá¬áá»á¬ážá Raspberry PIá Neural Compute Stick 2 ááᯠááœá±ážáá»ááºááá¯ááºáááºá
á¡áá¯ááºááœá±ážáá»ááºááŸá¯
free-form hackathon á¡ááœáẠááŒááºáááºááŒááºážá á¡áááºáá²áá¯á¶áž á¡á áááºá¡ááá¯ááºážáá áºáá¯ááŸá¬ á áááºáá±á«áºááŸá¯áá áºáá¯ááᯠááœá±ážáá»ááºááŒááºážááŒá áºáááºá ááŒá±ááŒá¬áá»ááºááœáẠá€á¡áá¬ááẠá¡ááœááºááŒáá¯ááá¯ááŒá±á¬ááºáž ááŒá±ááŒá¬áá¬ážáá±á¬ááŒá±á¬áá·áº áá¯ááºáá¯ááºááœááºáááá±ážááá·áºá¡áá¬áá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á·áá»ááºáá»ááºážáááºááŒááẠáá¯á¶ážááŒááºáá²á·áááºá
ááœá²ááŒááºážá
áááºááŒá¬ááŒá®áž
- áá®á¡áá¯áá®á¡áá á¡áá¶ááŸáá·áºáá¯ááºáá¯á¶ááŸá áºáá¯áá¯á¶ážááœááºá¡áá¯ááºáá¯ááºááá·áºáá±á«ááºážá áẠalgorithm ááá¯áááºáá®ážááá¯ááºáááºá áááºážáááºáááá»ááŸá¯ááá¯ááá¯ážááœá¬ážá á±ááá·áºáááºá
- áááºááá¬áá»á¬ážááẠá¡áá»á¬ážá¡á¬ážááŒáá·áº áá»ááºážááŒá±á¬ááºážáá±á¬ ááŸá¯áá±á¬áá·áºááŸááááºá ááŒá®ážáá¬ážáá±á¬á§áááá¬ááᯠáá¯á¶ážá¡á¯ááºááẠáááºááá¬áá áºáá¯á¶ážáááºááá¯á ááá¯á¡ááºáááºá á¡áá¶ááẠááá¯áá²á·ááá¯á· ááá·áºáááºáá»ááºáááŸááá«á
á
áááºáá°ážááᯠáá®ááœááºááŒáá«á
áá¯á·- áááºáá®áá±á¬ááºážáá»ááŸá¯á¡ááá¯ááºážá¡ááœáẠá
áááºáá°ážááᯠá¡ááŒá±áá¶á¡ááŒá
Ạáá°ááŒáá«á
áá¯á·á á
ááá¯ážááá¯ááºááœáẠááœá±ááŸááºážáá¬ááœáẠáá±á¬ááºáááºá
áááºáá»á±áááºááŸá¯ááᯠááá¯ááºážáá¬ááá¯ááºáááºá áá±á¬ááºáááºáá
áºáŠážááẠáááºáá±á¬ááºááŸá¯ááᯠááá»á±áááºá á¡áá¶ááá¯ážáá¬áá«áá áááºááẠáá»ááºáá»ááºážá¡áá°á¡áá®áá±á¬ááºážááẠá
á®áá¶ááá·áºááœá²áá°ááᯠáá¯ááºážáááºááá¯ááºáááºá
á€ááá
á¹á
ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá°áá¬ážáá¡áá¶ááᯠá¡ááá¡ááŸááºááŒá¯ááŸá¯ááᯠááá·áºááœááºážáááºááá¯á¡ááºáááºá áááºážá áá»áœááºá¯ááºááá¯á·á¡á¬áž á
ááá¯ážááá¯ááºáááºáááºážáá»á¬ážá¡á¬áž áá±á¬ááºáááºáá»á¬ážááŸáá·áº ááœá²ááŒá¬ážááá¯ááºááŒá®áž áá
áºáŠážáá»ááºážá
á®á¡ááœáẠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯áá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºááŒá
áºáááºá áá±á¬ááºážááŒá®á ááá¯á·á¡ááŒááºá á
ááá¯ážááá¯ááºáááºáááºážáá»á¬ážááá¯ááºááá¯ááºáá¡ááŒá¯á¡áá°ááá¯ááœá²ááŒááºážá
áááºááŒá¬áááºá á¡ááœá²á·á¡ááœááºážááŸááá±áá¯ááá¯á¡áá²ááŒááºáááºá á¡áá¶áá±á¬ááºážáááºá
áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áááŒá±ááŸááºážáá»ááºá¡ááœáẠááá¯á¡ááºáá»ááºáá»á¬ážááᯠáá¯á¶áá±á¬áºáá«áááºá
- áá áºááŸááºáááááá¬ááá±ážáááºáá±á¬á¡ááœááºá¡á á¬áž
- á¡áá»áááºááŸáá·áºáááŒá±ážáá®áá¯ááºáá±á¬ááºááŒááºážá
- á á»á±ážáááá·áº
- áá»á²á·ááœááºááẠááœááºáá°áááºá
ááááºá¡áá±ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠRaspberry Pi 3 c ááᯠáá
áºááŸááºáááááá¬á¡ááŒá
Ạááœá±ážáá»ááºáááºá
á€áá±áá¬ááœáẠNCS á á¡áá±ážááŒá®ážáá±á¬á¡ááºá¹áá«áááºáá áºáá¯ááᯠááŸááºáá¬ážáá¬ážááẠá¡áá±ážááŒá®ážááẠ- áááºážááẠá ᶠCNN áááá¯áá¬áá»á¬ážááŸáá·áº á¡áá±á¬ááºážáá¯á¶ážá¡áá¯ááºáá¯ááºáááºá ááá¯á·áá±á¬áº áááºážááœáẠá áááºááŒáá¯ááºá¡ááœáŸá¬áá»á¬ážáá«ááá·áº áá±á¬áºáááºáá áºáá¯ááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá«áá á¡ááá·áºáááá·áº optimization ááᯠáá»áŸá±á¬áºááá·áºáá«á
áá¯ááºá
áá¬áá±ážáá
áºáá¯áá²ááŸááá«áááº- ááá¯ááºáááá¯áá¯ááºážáá
áºáá¯áááẠááá¯á¡ááºáá«áááºá áá¯á¶ááŸáẠUSB ááá¯ááºáááá¯áá¯ááºážááẠáá¯ááºáá±á¬ááºááá¯ááºáá±á¬áºáááºáž RPI ááŸáá·áº ááœá²áááá±á¬ááºážáá«á ááá¯á·áá±á¬áº á€áá±áá¬ááœááºááẠááŒá±ááŸááºážáá»ááºááẠá
á¬áá¬ážá¡á âá¡áá®ážá¡áá¬ážááœáẠááŸááá±áááºâá á¡áá¶áááºážáááºá á¡á
á¯á¶ááá¯ááºá០Voice Bonnet áá¯ááºááᯠáá¯á¶ážááẠáá¯á¶ážááŒááºáááºá
Raspbian ááŸáá±á«ááºážáá¯ááºáá¯ááºáá«á
arecord -d 5 -r 16000 test.wav
ááá¯ááºáááá¯áá¯ááºážááẠá¡ááœááºááááá¯ááºááœááºááŒá®áž áá°áá¶áá¶ááᯠáá±á¬ááºážá áœá¬áááºážáá°ááá¯ááºáááºááᯠáá»áœááºá¯ááºáá»ááºáá»ááºážáááááŒá¯ááá·áºáááºá áááºážááá¯ááŒá±ááŸááºážáááºá alsamixer ááá¯á·ááœá¬ážá Capture devices ááá¯ááœá±ážáá»ááºááŒá®áž input signal á¡ááá·áºááᯠ50-60% ááá¯á·áá»áŸá±á¬á·áá»ááŒáá«á áá¯á·á
áá»áœááºá¯ááºááá¯á·ááẠááá¹áá¬ááá¯ááºááᯠááá¯ááºáá
áºáá¯ááŒáá·áº ááœááºážáá¶ááŒááºáááºááŒá®áž á¡áá¬á¡á¬ážáá¯á¶áž á¡á¶áááºááœááºáá»ááŒá
áºááŒá®áž áááºážááᯠá¡áá¯á¶ážááŒáá·áºááẠááááºááá¯ááºáááºá
á¡áá»ááºááŒááá¯ááºáá áºáá¯ááá·áºááŒááºážá
AIY Voice Kit ááᯠááœá²áá¯ááºá
ááºááœááºá áá±á¬á·ááºáá²ááºááŒáá·áº ááááºážáá»á¯ááºááá¯ááºááá·áº áá±á¬ááºáá¶á¡áááºážááᯠRGB ááá¯ááºáá
áºáᯠáá«ááŸááááºááᯠáá»áœááºá¯ááºááá¯á· áááááá«á áá»áœááºá¯ááºááá¯á·ááẠâGoogle AIY Ledâ ááá¯ááŸá¬ááœá±ááŒá®áž á
á¬ááœááºá
á¬áááºážáá»á¬ážááᯠááŸá¬ááœá±áá«-
á¡ááá¡ááŸááºááŒá¯áá¬ážáá±á¬ á
áááºáá¶á
á¬ážáá»ááºááá¯ááŒáááẠá€ááá¯ááºááᯠá¡áááºááŒá±á¬áá·áºááá¯á¶ážáááááºážá áá»áœááºá¯ááºááá¯á·ááœáẠá¡áááºážá¡á
á¬áž 7 áá¯áá¬ááŸáááŒá®áž ááá¯ááºááœáẠá¡áá±á¬áẠ8 áá±á¬ááºááŸááááºá áá¯á¶áá±á¬ááºáá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠGPIO ááŸáá áºááá·áº ááá¯ááºááᯠVoice Bonnet ááá¯á· áá»áááºáááºááŒá®ážá ááá¯á¡ááºáá±á¬ á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠáááºáá« (áááºážááá¯á·ááᯠAIY ááá±á¬áá»ááºáá»á¬ážá០ááŒáá·áºáá»á®áá±ážáááááá¬ááœáẠááá·áºááœááºážáá¬ážááŒá®ážááŒá áºáááº)
from aiy.leds import Leds, Color
from aiy.leds import RgbLeds
á áááºáá¶á á¬ážááŸá¯áá áºáá¯á á®ááœáẠRGB Tuple ááŸáá·áº class aiy.leds.Leds áá¡áá¬ááá¹áá¯áá áºáá¯á¡ááŒá Ạá áááºáá¶á á¬ážááŸá¯áá áºáá¯á á®ááœáẠáááºááá¯ááºáá±á¬á¡áá±á¬ááºááŸáááá·áº dict áá áºáá¯áááºáá®ážááŒáá«á áá¯á·á
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])))
ááá¯ááºá áá®ážááŸáá¯á·á
á¡áá¶ááŒáá·áºá¡áá¯ááºáá¯ááºáááºá
áá°áá¶áá¶áá»á¬ážááᯠá á áºáá¯ááºááŒá®áž á¡áá¶ááᯠááááŸáááá¯ááºááẠááá¯ááºáááá¯áá¯ááºážááŸáá·áº webrtcvad á០ááá¯ááºááá¯ááºáá¯ááºááœáŸáá·áºááŸá¯ááᯠáááºážáá°ááẠpyaudio ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¶á០áá±á¬ááºáá¯ááºáá»ááºáá»á¬ážááᯠá¡áá»áááºáááœá±áž áááºááá·áºáᬠáááºááŸá¬ážááá·áº áááºážá á®áá áºáá¯ááᯠáááºáá®ážáá«áááºá
webrtcvad ááœáẠáá±á¬ááºáá¶á·áá±ážáá¬ážáá±á¬á¡ááá¯ááºážá á¡ááœááºá¡á á¬ážááŸá¬ ááá·áºáááºáá»ááºááŸááá±á¬ááŒá±á¬áá·áº - áááºážááẠ10/20/30ms ááŸáá·áº áá®áá»áŸááááºááŒá áºááŒá®áž á áááºáá¶á á¬ážááŸá¯áá»á¬ážááᯠá¡ááá¡ááŸááºááŒá¯ááŒááºážá¡ááœáẠáá±á¬áºáááºáááºáááºážááᯠ(áá±á¬ááºááŸáá±á·áá¬áááºááá¯áá«á) 48kHz dataset áá±á«áºááœáẠáá¯ááºáá±á¬ááºááœá¬ážáááºááŒá áºáá«áááºá á¡ááœááºá¡á á¬áž 48000Ã20ms/1000Ã1(ááá¯ááá¯)=960 bytes á¡ááá¯ááºážáá»á¬ážááᯠáááºážáá°áá«á 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 (á¡áááºá¡áááºááá¯ááºá á¬ážááŒá¯ááŸá¯) á¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áá±ážáá±á¬ááŒá±á¬áá·áº áááºážááẠá¡áá±á¬áºáá±ážáááºáá²áá±á¬á¡ááá¯ááºážááŒá áºáááºá áá»áœááºá¯ááºááá¯á·ááẠgithub á០ááá°áá®áá±á¬ ááŒá±ááŸááºážáá»ááºáá±á«ááºáž 5-7 áá¯ááá·áºááᯠááŒáá¯ážá á¬ážáá²á·ááŒááŒá®áž á áááºáá¶á á¬ážááŸá¯áá»á¬ážááᯠá¡ááá¡ááŸááºááŒá¯ááŒááºážá¡ááœáẠá á¶ááá°áá¬ááẠáá»ááºáá»ááºáž á¡áá¯ááºááŒá áºáá«áá á¡áá¶ááŒáá·áº á¡ááá¡ááŸááºááŒá¯ááŸá¯ááŒáá·áº á¡áá»áááºááŒá¬ááŒáá·áºá áœá¬ á á±á¬áá·áºááá«ááẠ- áááºážááá¯á·ááẠááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬ áááá¯áá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
áá»áœááºá¯ááºááá¯á·ááẠá¡á±á¬ááºáá«ááá¯á·ááᯠá¡á¬áá¯á¶á áá¯ááºáááº-
- á¡áá¶á áá¶á
á¬ážáá»ááº-
https://github.com/alexmuhr/Voice_Emotion
áááºážááẠá¡á±á¬ááºáá«áááá¬áá¡á á¡áá¯ááºáá¯ááºáááº- áá»áœááºá¯ááºááá¯á·ááœá±ážáá»ááºáá¬ážáá±á¬ á€á á¬ááá¯ááºáá áºáá¯á á®á¡ááœáẠá¡áá¶ááᯠá¡ááœááºá¡á á¬ážáá áºáá¯á á®ááá¯á· ááŒááºáá±á¬ááºáá¬ážáááºáMFCC ááá¯á·áá±á¬áẠáááºážááá¯á·ááᯠCNN ááá¯á· ááá·áºááœááºážááŸá¯á¡ááŒá ẠáááºááŒáá«á - á¡áá¶ááŸááºááááŒááºáž -
https://github.com/linhdvu14/vggvox-speaker-identification
á€ááœááºá MFCC á¡á á¬ážá FFT ááŒá®ážáá±á¬áẠáá»áœááºá¯ááºááá¯á·ááẠá¡áá¶á áá¯á¶ááááºááᯠááá¯ááºá á¬ážááŒá¯ááá·áº CNN ááá¯á· á¡áá»ááºááŒáá±ážááŒá®ážáá±á¬áẠá€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠspectrogram áá áºáá¯ááŒáá·áº áá¯ááºáá±á¬ááºáá«áááºá
áá±á¬ááºáá áºáá¯ááá±á¬á· áá®á¡áá¯áá®ááá±á ááŒá®áž áá±á¬áºáááºááœá±ááᯠáá°ážááŒá±á¬ááºážááŒááºážá¡ááŒá±á¬ááºáž ááœá±ážááœá±ážáá«áááºá OpenVINO ááœáẠmodule áá»á¬ážá áœá¬áá«áááºáááº-
- Open Model Zooá ááá·áºáá¯ááºáá¯ááºááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº áá±á¬áºáááºáá»á¬áž
- áá±á¬áºáááºááᯠáá±á¬ááºáá±á¬áºáááºá¡áá»áá¯ážáá»áá¯áž (Tensorflowá ONNX á áááºááŒáá·áº) á០áá±á¬áºáááºááᯠá¡áááºá¡áááºááá¯ááºá á¬ážááŒá¯áá±á¬áºáááºááá¯á· ááŒá±á¬ááºážááá¯ááºááá·áºá¡ááœááºááŒá±á¬áá·áºá Model Optimzerá
- Inference Engine ááẠááá·áºá¡á¬áž Intel áááá¯áááºáá¬áá»á¬ážá Myriad áá»á áºááºáá»á¬ážááŸáá·áº Neural Compute Stick á¡ááŸáááºááŒáŸáá·áºá ááºáá»á¬ážáá±á«áºááœáẠIR áá±á¬áºáááºááŒáá·áº áá±á¬áºáááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááº
- OpenCV á á¡áááá±á¬ááºáá¯á¶ážáá¬ážááŸááºáž (Inference Engine áá¶á·ááá¯ážááŸá¯ááŒáá·áº)
IR áá±á¬áºáááºááŸá áá±á¬áºáááºáá áºáá¯á á®ááᯠááá¯ááºááŸá áºáá¯- .xml ááŸáá·áº .bin ááŒáá·áº áá±á¬áºááŒáá¬ážáá«áááºá
Model Optimizer ááá¯á¡á±á¬ááºáá«á¡ááá¯ááºáž 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
input data áá¡ááá¯ááºážá¡áá¬ááá¯ááœáŸááºááŒáááºá ááá¯ááºážááá áºááŒáá·áºááŒá±á¬ááºážáá²ááá¯ááºáá±á¬á áœááºážáááºááẠC++ API ááœááºááŸááá±áá¯á¶ááááºá ááá¯á·áá±á¬áºáá»áœááºá¯ááºááá¯á·áááºá€áá»áŸáá±á¬ááºáá±ážáá±ážááá°ážáá²á·áá²áá±á¬áºáááºáá»á¬ážáá²ááŸáá áºáá¯á¡ááœááºááá¯ážááŸááºážá áœá¬ááŒááºáááºáá²á·áááºá
ááá¯á·áá±á¬ááºá DNN module ááŸáá áºááá·áº OpenCV ááá¯á· ááŒá±á¬ááºážáá²ááŒá®ážáá±á¬ áá±á¬áºáááºááᯠIR áá±á¬áºáááºááŒáá·áº áááºááẠááŒáá¯ážá á¬ážááŒáá«á áá¯á·á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 ááœááºáááºážáááºá¡áá¯ááºááá¯ááºáá«á áááºáá»á±á¬ááºážáá áºáá¯ááá¯á¡ááºáááá·áºáááºá
ááá¯á·áá±á¬ááºá áá¯áá¹áááá±áááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááº- áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áá¡áá¶á¡á¬áž á¡áá»áá¯á·áá±á¬á¡ááœááºá¡á á¬ážááŸá windows áá»á¬ážá¡ááŒá Ạááá¯ááºážááŒá¬ážáá¬ážááẠ(áá»áœááºá¯ááºááá¯á·á¡ááœáẠáááºážááẠ0.4 s)á áá»áœááºá¯ááºááá¯á·ááẠá€áááºážááá¯ážáá áºáá¯á á®ááᯠMFCC ááá¯á· ááŒá±á¬ááºážáá¬á ááá¯á·áá±á¬ááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠááá¬ážááœááºááá¯á· ááŒáá·áºááœááºážáááº-
emotionsNet.setInput(MFCC_from_window) result = emotionsNet.forward()
áá±á¬ááºáá áºáá¯á windows á¡á¬ážáá¯á¶ážá¡ááœáẠá¡áá¯á¶ážá¡áá»á¬ážáá¯á¶áž class ááᯠáá°ááŒáá·áºáá¡á±á¬ááºá ááá¯ážááŸááºážáá±á¬ááŒá±ááŸááºážáá»ááºá ááá¯á·áá±á¬áº hackathon á¡ááœáẠáááºááẠá¡áá»áááºááŸáááŸáᬠááœá²ááŸá¬ážááœááºážááá·áºá¡áá¬áá áºáá¯ááᯠáá±á«áºáá¬áááºáááá¯á¡ááºáá«á áá»áœááºáá±á¬áºááá¯á·ááŸá¬ áá¯ááºá áá¬ááœá± á¡áá»á¬ážááŒá®áž áá»ááºáá±áá±ážáá¬ááá¯á· áááºááœá¬ážááŒáá¡á±á¬áẠ- á¡áá¶ááᯠá¡ááá¡ááŸááºááŒá¯ááŒááºážáá²á· ááá¯ááºááœááºáá«áááºá ááŒáá¯áááºááŸááºáááºážáááºáá¬ážáá±á¬ á¡áá¶áá»á¬ážááᯠááááºážáááºážááá·áº áá±áá¬áá±á·á áºá¡áá»áá¯ážá¡á á¬ážá¡áá»áá¯á·ááᯠáááºáá®ážááẠááá¯á¡ááºáá«áááºá á¡áá»áááºááááºááá»ááºáá±á¬á·áá²á·á¡ááœáẠáá®ááŒá¿áá¬ááᯠá¡áááºááá¯ááºáá¯á¶áž ááŒá±ááŸááºážááœá¬ážááŸá¬áá«á
ááá¯ááá¯áááºááŸá¬á áá»áœááºá¯ááºááá¯á·ááẠá¡áá¶áá±á¬ááºáá¯ááºáá»ááºáá áºáá¯ááᯠááŸááºáááºážáááºáááºá¡ááœáẠscript áá áºáá¯ááᯠáááºáá®ážááẠ(áááºážááẠá¡áááºááœááºáá±á¬áºááŒáá¬ážááá·áºá¡ááá¯ááºáž á¡áá¯ááºáá¯ááºáááºá áá®ážáá¯ááºá០ááŒááºáá±á¬ááºááœá¬ážáá±á¬á¡áá«ááŸáᬠáááºážááẠá¡áá¶ááᯠááá¯ááºáá áºáá¯ááá¯á· ááááºážáááºážáááá·áºáááº)á
ááŒáá¯ážá á¬ážááŒááºá·áá¡á±á¬ááº:
python3 voice_db/record_voice.py test.wav
áá»áœááºá¯ááºááá¯á·ááẠáá°áá»á¬ážá áœá¬áá¡áá¶áá»á¬ážááᯠááŸááºáááºážáááºáá«ááẠ(áá»áœááºá¯ááºááá¯á·ááá á¹á ááœááºá á¡ááœá²á·áááºáá¯á¶ážáŠáž)á
ááá¯á·áá±á¬ááºá ááŸááºáááºážáááºáá¬ážáá±á¬ á¡áá¶áá áºáá¯á á®á¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááá¯ááá¯ááŒááºáááºáá±á¬ á¡ááœááºááŒá±á¬ááºážááŸá¯ááᯠáá¯ááºáá±á¬ááºááŒá®ážá spectrogram áá áºáá¯ááá°ááŒá®áž áááºážááᯠ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
ááááºá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠáááºááá¬ááºááœáŸááºážááᯠáá¯ááºáá±á¬ááºáá±á¬á¡áá«á á¡á ááá¯ááºážááœáẠဠspectrograms áá»á¬ážá០ááŒáŸááºááŸá¶ááŸá¯áá»á¬ážááᯠáááŸááá«áááº-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)
á¡áá¶ááœááºážáá¬ážááá·áºá¡ááá¯ááºážá០ááŒáŸááºááœááºážááŒááºážááᯠáááºáá¶áááŸáááŒá®ážáá±á¬ááºá áá±áá¬áá±á·á áºááŸá á¡áá¶áá»á¬ážá¡á¬ážáá¯á¶ážááá¯á· ááá¯sine á¡ááœá¬á¡áá±ážááᯠáááºážááŒá±á¬ááºážá០(ááá¯áá±ážá ááá¯ááŒá áºááá¯ááºáá»á±) áá®ááá¯á· ááá¯sine á¡ááœá¬á¡áá±ážááᯠáá°ááŒááºážááŒáá·áº áááºážááᯠáááºáá°ááá¯ááºááŒá±á¬ááºáž áá¯á¶ážááŒááºááá¯ááºáá«áááºá 0.3 ááá¯á·):
dist_list = cdist(emb, enroll_embs, metric="cosine") distances = pd.DataFrame(dist_list, columns = df.speaker)
áááá¯á¶ážáá»á¯ááºá¡áá±ááŒáá·áºá áá±á¬ááºáá»ááºáá»ááŸá¯ááºážááẠááŒááºáááºááŒá®áž áá±á¬ááºáááºáá±á¬áºááẠá-á áá¯ááᯠáááºááá·áºááá¯ááºá á±ááŒá±á¬ááºáž áááááŒá¯á á±ááá¯áá«ááẠ(ááá°áᬠá á áá¹ááá·áºá¡ááœáẠáá±á¬ááºáá»ááºá¡ááœáẠá.á ááŒá¬áááº)á áá»áœááºá¯ááºááá¯á·ááẠáá±á¬áºáááºá¡áá áºáá»á¬ážááᯠááá·áºááœááºážááẠá¡áá»áááºáááŸááá±á¬á·áá² áááºá¡ááºááá®áá±ážááŸááºážá ááŸá±á·ááŒá±ážáá¯á¶á á¶ááᯠáá±ážáá¬ážááẠá¡á¬áá¯á¶á áá¯ááºáá²á·áááºá
áááºáá»áŸá±á¬ááºááœáŸá¬
á¡áá±ážááŒá®ážáá±á¬á¡áá»ááº- áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áá¡áááºá០Router ááá¯áá°áᬠáá»áœááºá¯ááºááá¯á·áááŒááºááœááºážááœááºáááºááᯠá áá áºááá·áºááœááºážáá«á áááºážááẠááœááºáááºáá±á«áºááŸá á ááºááŸáá·áº áááºááºáá±á¬á·áá»á¬ážááᯠáá»áááºáááºááẠáá°áá®áá±ážáááºá
áá±á¬ááºáá¶ááá¯ááºááẠwebsocket áááºážááᬠ(http over tcp áááá¯ááá¯áá±á¬) ááá¯á¡ááŒá±áá¶á ááŸá±á·ááŸáá·áº Raspberry Pi ááŒá¬ážááŸá á¡áá¯á¶ážááŸá¡áá¯á¶áž áááºáá±á·áá»áºáá»ááºáááºáá áºáá¯ááŒá áºáááºá
áááá¡ááá·áºááŸá¬ json ááœáẠáá¯ááºááá¯ážáá¬ážáá±á¬ ááá·áºááŸááºážáá»ááºáá»á¬ážááᯠáá±áá¬áá±á·á áºááœáẠááááºážáááºážáá¬ážááá·áº Raspberry á០á á®áá¶áá±á¬ááºááœááºáá¬ážáá±á¬ á¡áá»ááºá¡áááºáá»á¬ážááᯠáááºáá¶áááŸááááºááŒá áºááŒá®ážá áááºážááá¯á·ááẠáááºážááá¯á·á ááá®ážáá áºáááºááœáẠá¡áá¯á¶ážááŒá¯áá°á á áááºáá¶á á¬ážááŸá¯ áá±á¬ááºáá¶á¡ááŒá±á¬ááºáž ááááºážááááºážáá»á¬ážááᯠá¡áá»áááºá¡áá±á¬áºááŒá¬ áá¯ááºáá±ážááá¯ááºááẠááŒá áºáááºá ááá¯á·áá±á¬áẠá á¬áááºážááœááºážááŸá¯ááᯠá¡áá¯á¶ážááŒá¯á websocket á¡áá¯á¶ážá¡ááŸááºá០áááºáá±á·ááºá»áá»á¬ážááᯠáááºáá¶áááŸáááá·áº á€áááºáááºááᯠááŸá±á·áááºážááá¯á· áá±ážááá¯á·áááºá áá±á¬ááºáá¶ááá¹ááá¬ážáá áºáá¯áá¯á¶ážááᯠgolang áá¬áá¬á áá¬ážááŒáá·áº áááºáá±á¬ááºáá¬ážáá±á¬ááŒá±á¬áá·áº áááºážááᯠáá±á«áºáá®ááá¯ážáááºáá»á¬áž áá±á¬ááºážááœááºá áœá¬ááá¯ááºááœááºááá¯ááºááá·áº á¡ááŒáá¯ááºá¡ááá¯ááºáá¯ááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠáá±á¬ááºážá áœá¬ááá·áºáá»á±á¬áºáá±á¬ááŒá±á¬áá·áº áááºážááᯠááœá±ážáá»ááºáá²á·ááŒááºážááŒá áºáááºá
á¡áá¯á¶ážááŸááºááᯠáááºáá±á¬ááºááá·áºá¡áá«á á¡áá¯á¶ážááŒá¯áá°ááẠááŸááºáá¯á¶áááºááŒá®áž ááœá²á·á ááºážáááºáá±á¬ááºáá¯á¶ááá¯á· áááºáá±á¬ááºááŒá®ážáá±á¬áẠáá°ááááºáá±á·áá»áºááᯠáááºáá¶áááŸááááºááŒá áºáááºá á¡áá¯á¶ážááŒá¯áá°ááŸáá·áº áááºáá±á·áá»áº ááŸá áºáá¯á áá¯á¶ážááᯠáá¯á¶áááá¯áá áºáá¯áá²ááá¯á· ááá·áºááœááºážáá¬ážááŒá®ážá áááºážá០áááºáá±á·áá»áºáá»á¬ážááᯠáááºáá¶áá±ážááá¯á·ááŒá®áž (á á¬áááºážááœááºážáá¬ážááá·áº ááŸá±á·ááá¯á·)á á¡áá¯á¶ážááŒá¯áá°ááẠáá»áááºáááºááŸá¯ááᯠááááºáá«á (áááºá áºáááºáá® ááá¯á·ááá¯áẠá¡ááŸá±á·áááº) ááœáẠáááºážá á á¬áááºážááœááºážááŸá¯ááᯠáááºáá»ááºááŒá®áž áááºážááᯠáááºááŸá¬ážááá¯ááºáá«áááºá áááá¯á
á¡áá±á¬ááºááá± áááºááœááºááŸá¯ááᯠá á±á¬áá·áºáá±áá«áááºáFront-end ááẠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá¯ááºáááºážá ááºááᯠá¡ááŸáááºááŒáŸáá·áºáááºááŸáá·áº ááá¯ážááŸááºážá á±áááºá¡ááœáẠReact á á¬ááŒáá·áºááá¯ááºááᯠá¡áá¯á¶ážááŒá¯á JavaScript ááŒáá·áº áá±ážáá¬ážáá¬ážáá±á¬ áááºá¡ááºááºáá áºáá¯ááŒá áºáááºá á€á¡ááá®áá±ážááŸááºážááááºááœááºáá»ááºááŸá¬ back-end side ááŸáá·áº Raspberry Pi áá±á«áºááœáẠááá¯ááºááá¯ááºáááºáááºáá±áá±á¬ algorithms áá»á¬ážááá¯á¡áá¯á¶ážááŒá¯á áááŸááá±á¬áá±áá¬áá»á¬ážááᯠááŒááºáá±á¬ááºá á±áááºááŒá áºáááºá á á¬áá»ááºááŸá¬ááœáẠreact-router ááᯠá¡áá¯á¶ážááŒá¯á ááá¹áá¡ááá¯áẠáááºážááŒá±á¬ááºážáááºááŸááºááŒááºáž áá«ááŸááá±á¬áºáááºáž á áááºáááºá á¬ážááœáẠáááºáá á¬áá»ááºááŸá¬ááŸá¬ WebSocket áááºážááá¬ááᯠá¡áá¯á¶ážááŒá¯á áá¬áá¬á០áá±áᬠá ááºáááºáááŒáẠá á®ážááŒá±á¬ááºážááᯠá¡áá»áááºááŸáá·áºáááŒá±ážáá® áááºáá¶áááŸáááá·áº áááºáá á¬áá»ááºááŸá¬ ááŒá áºáá«áááºá Raspberry Pi ááẠá¡áá¶ááᯠáá±á¬ááºááŸááºážááŒá®áž áááºážááẠááŸááºáá¯á¶áááºáá¬ážáá±á¬ áá±áá¬áá±á·á áºá០áá®ážááŒá¬ážáá°áá áºáŠážááŸáá·áº áááºááá¯ááºááŒááºážááŸááááŸá áá¯á¶ážááŒááºáᬠááŒá áºááá¯ááºááŒá±á á¬áááºážááᯠáá¯á¶ážá áœá²áá°áᶠáá±ážááá¯á·áááºá áááá¯ááºážááá·áºááẠáá±á¬ááºáá¯á¶ážááááºááá¯ááºáá¬áá±áá¬ááá¯ááŒááááºá ááá¯ááºáááá¯áá¯ááºážááá¯á·ááŒá±á¬ááá¯ááá¯ááºááŒá±á¡ááŸááá¯á¶ážáá°áááá¯ááºááœá¬ážááá¯ááŒáááá·áºá¡ááŒáẠá áá¬ážáá¯á¶ážáá»á¬ážááᯠá¡áá¶ááœááºááá·áºá áááºáá¶á á¬ážáá»ááºááá¯áááºážááŒááááºá
á¡ááºááááºááá·áºááŸááºážáá»ááºáá»á¬ážááŸáá·áºá¡áá° áááºáá á¬áá»ááºááŸá¬áá±á¬ááºáá»ááº
á á®á ááºáá¬ážááá·áºá¡ááá¯ááºáž á¡áá¬á¡á¬ážáá¯á¶ážááᯠááŒá®ážááŒá±á¬ááºááẠáááŒá áºááá¯ááºáá«á áá»áœááºá¯ááºááá¯á·ááœáẠá¡áá»áááºáááŸááá«á ááá¯á·ááŒá±á¬áá·áº á¡áá¬á¡á¬ážáá¯á¶áž á¡áááºááŒá±á á±áááºá¡ááœáẠá¡ááááá»áŸá±á¬áºááá·áºáá»ááºááŸá¬ áá®ááá¯ááœááºááŒá áºáááºá áááºáááºááŸá¯ááŸá¬ áá°ááá¯á·á¡á¬ážáá¯á¶áž áááºááá¯á¡áá¯ááºáá¯ááºááá²á áááºááá¯áá¯á¶á á¶ááœá±áá°áá²á·ááŒááá²á áá°ááá¯á·ááŒá¯á¶ááœá±á·áá²á·ááá²á· ááŒá¿áá¬ááœá±ááᯠááœá±ážááœá±ážáá²á·ááŒáá«áááºá áá±á¬ááºáá áºáá¯ááá±á¬á· áá®ááá¯á¡ááá¯ááºáž- áá»áœááºážáá»ááºáá°ááœá±á á¡áááºážáááá¯ááºááŸá¬ áá»áááºážá áá áºááá» áááºážáá»áŸá±á¬ááºááŒá®áž á¡áá¯ááºáá¯ááºáá²á· ááá°áá¬áá¯á¶á á¶ááᯠááŒáá·áºááá¯á· á¡ááœá²á·áá áºáá¯á á®áá® áá»ááºážáááºááŒáá«áááºá áá°ááá¯á·áááºáž áá»áœááºáá±á¬áºááá¯á·ááᯠáá±ážááœááºážááœá± áá±ážáááºá áá°ááá¯ááºážá áá°ááá¯á·á¡ááá¯ááºážááᯠááŒá±áááºá ââáá°ááá¯á·á áááºáá±á¬á·ááºáá±á«áºááá± áááºááᯠáá¬ážáá²á·áááºá á¡á¬ážáá¯á¶ážá áá»áŸá±á¬áºááá·áºáá¬ážáá²á·á¡ááá¯ááºáž ááááºáá² á¡áá¯ááºááŒá áºáá²á·áááºá
áá»áœááºá¯ááºááá¯á·áááŒá±ááŸááºážáá»ááºáá á¯á á¯áá±á«ááºážáá¯ááºáá»á ááááºááŸá¬ $150 ááŒá áºáááº-
- Raspberry Pi 3 ~ $35
- Google AIY Voice Bonnet (á áá®áá¬á¡áááŒá±ážááœá±áá°ááá¯ááºáááº) ~ 15$
- Intel NCS 2 ~ 100$
ááŒáŸáá·áºáááºáááºáž-
- áá¯á¶ážá áœá²áá°áá¶á០ááŸááºáá¯á¶áááºááŒááºážááᯠá¡áá¯á¶ážááŒá¯áá« - áá»áááºážáá¯ááºáá±ážáá±á¬ á á¬áá¬ážááᯠáááºááá¯ááºážáá«á
- áá±á¬ááºááẠáá±á¬áºáááºá¡áá»áá¯á·ááᯠááá·áºáá«- áááºááẠááááºááŸáá·áº á¡áááºááᯠá¡áá¶ááŒáá·áº áá¯á¶ážááŒááºááá¯ááºáááºá
- áááŒáá¯ááºáááºáááºáž á¡áá¶ááœááºááŒááºáž (ááá¯ááºáá¬áá®ááŸááºáž)
ááá¯ááŸá±á¬ááºááŸá¯-
https://github.com/vladimirwest/OpenEMO
áááºáááºážáá±ááá·áº áá»á±á¬áºáááºááááá¯á¶ážáá»á¯ááºá¡áá±áá²á· ááœá²á á®á ááºáá°ááœá±áá²á· áá«áááºáá°ááœá±ááᯠáá»á±ážáá°ážáááºááŒá±á¬ááºáž ááŒá±á¬ááŒá¬ážááá¯áá«áááºá á¡ááŒá¬ážá¡ááœá²á·áá»á¬ážá ááá±á¬áá»ááºáá»á¬ážááŒá¬ážááœááºá á¡ááá²á·áá¬ážáá«áááºáá±áá¬áá»á¬ážááᯠá á±á¬áá·áºááŒáá·áºááŒááºážá¡ááœáẠááŒá±ááŸááºážáá»ááºááᯠáá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯áẠááŸá áºáááºáá«áááºá áá»áœááºá¯ááºááá¯á·á¡ááœááºá áááºážááẠáá¯ááºáá¯ááºááŸáá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááœáẠááŸá áºááŒáŸá¯ááºááŒááºážá á¡ááœááºá¡á±ážááŒáá±á¬ á¡ááœá±á·á¡ááŒá¯á¶áá áºáá¯ááŒá áºáááºá AI áá±á«ááºážá ááºáá»á¬ážá¡áá«á¡ááẠáá±ááá»á¬ážááœáẠááá¯ááá¯á áááºáááºá á¬ážááœááºáá±á¬ááºážáá±á¬ ááœá²áá»á¬ážááᯠáá»ááºážáááá¯ááºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá
source: www.habr.com