30 ืื ืืืืืจ - 1 ืืืฆืืืจ ืื ืื'ื ื ื ืืืืืจืื ืืชืงืืื
ืืืืืจ ืื ื ืกืคืจ ืืื ืืืฆื ืืฆืจื ื ืืช ืื ืืืืคืืก ืฉืื ื ืืืืฆืจ, ืืืชื ืชืคืกื ื ืืกืืคื ืฉื ืืืจ ืืช ืืืงืื ืืจืืฉืื.
ืืืชืจ ื-10 ืฆืืืชืื ืืฉืชืชืคื ืืืืงืชืื. ืื ื ืืื ืฉืืืงื ืืืืขื ืืืืืจืื ืืืจืื. ืืงืื ืืืืงืชืื ืืื ืืชืื "ืงืจืืืื ืกืงื ืขื ืคืืฆ'ืืื", ืฉืื ื ืชืื ืืคื ืื ืชืฆืืืืื ืขืชืืงืื ืฉื ื ืื'ื ื ื ืืืืืจืื, ืืคืืืื! (ืื ื ืืืืืจ ืืื ืฉืืจืืข ืืืฉืจื ืืืจืืื ืฉื ืืื ืื ื ืืฆื ืื ืื'ื ื ื ืืืืืจืื). ืืืฉืชืชืคืื ืงืืืื 26 ืฉืขืืช ืืืชืื ืงืื, ืืืกืืคื ืืื ืขืืืื ืืืฆืื ืืช ืืคืชืจืื ืฉืืื. ืืชืจืื ื ืคืจื ืืื ืื ืืืืืช ืฉื ืกืฉื ืืืืื ืืื ืืืืื ืฉืื ืื ืฉืชืืื ื ืืื ืืืืฉื ืืื ื ืฉืืจ ืจืขืืื ืืช ืืืฆืืช. ืกืืืจื, ืืืืคืื, ืืืื, ืื ืืื ืืื ืฉื!
ืื ืืกืฃ, ืืื ืื ืกืืคืงื ืืืคืฆืืื ืืืช ืืฆืืืืช, Raspberry PI, Neural Compute Stick 2.
ืืืืจืช ืืฉืืืืช
ืืื ืืืืงืื ืืงืฉืื ืืืืชืจ ืืืื ื ืืืืงืชืื ืืฆืืจื ืืืคืฉืืช ืืื ืืืืจืช ืืชืืจ. ืืืืื ื ืืื ืืืืฆืื ืืฉืื ืฉืขืืืื ืื ืืื ืืืืฆืจ, ืฉืื ืืืืืขื ื ืืืจ ืฉืื ืืืื ืืืืจื.
ืืืืจ ื ืืชืื
- ืืชืืืืจืื, ืืคืฉืจ ืืืฆืืจ ืืืืืจืืชื ืืฉืืื ืฉืืขืืื ืื ืขื ืืกืืื ื ืืื ืขื ืืชืืื ื, ืื ืฉืืืืจ ืืชืช ืขืืืื ืืจืืช ืืืืืง.
- ืืืฆืืืืช ืืฉ ืืืจื ืืื ืืืืืช ืฆืคืืื ืฆืจื; ื ืืจืฉืช ืืืชืจ ืืืฆืืื ืืืช ืืื ืืืกืืช ืฉืื ืืืื; ืืฆืืื ืืื ืืืืื ืืื.
ืืืื ืืคืชื ืืช ืืจืขืืื: ืืืื ื ืืงื ืืช ืืจืขืืื ืืืืืจ ืืงืืขืื ืื ืืืกืืก. ืืชื ืืืื ืืืืื ืืช ืฉืืืขืืช ืจืฆืื ืืืงืืืืช ืืงืืคืืช ืืื ืืช. ืื ืืื ืืืงืืืืช ืื ืืจืืฆื ืืืฉืืจืืช ืืืชืืื ืืืจืื ืืช ืืืื ืฉืื, ืืชื ืืืื ืืื ืืืชืงืฉืจ ืืื ืื ืืขืืจื.
ืืืงืจื ืื, ืขืืื ื ืืืืกืืฃ ืืืืื ืงืืื ืื ืืฉื, ืื ืืืคืฉืจ ืื ื ืืืืืื ืืื ืขืืืื ืื ืืช ืืืงืืืืช ืืืกืคืง ืื ืืืืืงื ืืื ืืื. ืืืื, ืื ืืกืฃ, ื ืืชื ืืืื ืื ืชื ืืช ืืชื ืืืืช ืขืืืื ืืื ืืช ืขืฆืื, ืืืขืจืื ืืช ืืืืืืจื ืืฆืืืช, ื ืฉืืข ืืื!
ืื ื ืืืืฉืื ืืช ืืืจืืฉืืช ืืคืชืจืื ืฉืื ื:
- ืืืื ืงืื ืฉื ืืืฉืืจ ืืืขื
- ืชืคืขืื ืืืื ืืืช
- ืืืืจ ื ืืื
- ืืืจืืืืช ืงืื
ืืชืืฆืื ืืื, ืื ื ืืืืจืื ืืช Raspberry Pi 3 c ืืืืฉืืจ ืืืขื
ืืื ืืฉืื ืืฆืืื ืชืืื ื ืืืช ืืฉืืื ืฉื NCS - ืื ืขืืื ืืื ืืื ืขื ืืจืืืืงืืืจืืช CNN ืกืื ืืจืืืืช, ืืื ืื ืืชื ืฆืจืื ืืืจืืฅ ืืืื ืขื ืฉืืืืช ืืืชืืืืช ืืืฉืืช ืขืืื, ืื ืฆืคื ืืืืคืืืืืืฆืื ืืจืื ื ืืืื.
ืืฉ ืจืง ืืืจ ืืื ืงืื ืืขืฉืืช: ืืชื ืฆืจืื ืืืฉืื ืืืงืจืืคืื. ืืืงืจืืคืื USB ืจืืื ืืชืืื, ืืื ืืื ืื ืืืจืื ืืื ืืื ืขื ื-RPI. ืืื ืื ืืื ืืคืชืจืื ืืืฉ "ืืืื ืืงืจืืช ืืงืื". ืืื ืืืงืืื ืงืื, ืื ื ืืืืืืื ืืืฉืชืืฉ ืืืื ืงืื ืืืกื ืืื ืืข ืืืขืจืื
ืืืจื ืืช Raspbian ื
arecord -d 5 -r 16000 test.wav
ืขืื ืืฆืืื ืืื ืฉืืืืงืจืืคืื ืจืืืฉ ืืืื ืืงืืื ืจืขืฉืื ืืืื. ืืื ืืชืงื ืืืช, ืืื ื ืขืืืจ ืื alsamixer, ื ืืืจ ืืืชืงื ื ืืืืืช ืื ืคืืืช ืืช ืจืืช ืืืช ืืื ืืกื ื-50-60%.
ืื ื ืืฉื ืื ืืช ืืืืฃ ืขื ืงืืืฅ ืืืื ืืชืืื, ืืชื ืืืื ืืคืืื ืืกืืืจ ืืืชื ืขื ืืืกื
ืืืกืคืช ืืคืชืืจ ืืืืื
ืืขืืื ื ืืคืจืงืื ืืช ืขืจืืช ืืงืื ืฉื AIY, ืื ื ืืืืจืื ืฉืืฉ ืืคืชืืจ RGB, ืฉืืชืืืจื ืืืืืจืืช ืฉืื ื ืืชื ืช ืืฉืืืื ืืืืฆืขืืช ืชืืื ื. ืื ื ืืืคืฉืื "Google AIY Led" ืืืืฆืืื ืชืืขืื:
ืืื ืื ืืืฉืชืืฉ ืืืคืชืืจ ืืื ืืื ืืืฆืื ืืช ืืจืืฉ ืืืืืจ, ืืฉ ืื ื ืจืง 7 ืืืืงืืช, ืืืืคืชืืจ ืืฉ 8 ืฆืืขืื, ืืกืคืืง!
ืื ื ืืืืจืื ืืช ืืืคืชืืจ ืืืืฆืขืืช GPIO ืืืืกื ืงืืืืช, ืืืขื ืื ืืช ืืกืคืจืืืช ืืืจืืฉืืช (ืื ืืืจ ืืืชืงื ืืช ืืขืจืืช ืืืคืฆื ืืคืจืืืงืื 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])))
ืืคืชืืจ, ืืฉืจืืฃ!
ืขืืืื ืขื ืงืื
ื ืฉืชืืฉ ื-pyaudio ืืื ืืืืื ืืช ืืืจื ืืืืืงืจืืคืื ืื-webrtcvad ืืื ืืกื ื ืจืขืฉืื ืืืืืืช ืงืื. ืื ืืกืฃ, ื ืืฆืืจ ืชืืจ ืืืื ื ืืกืืฃ ืื ืกืืจ ืงืืขืื ืงืืืืื ืืืืคื ืืกืื ืืจืื ื.
ืืืืืื ืฉื-webrtcvad ืืฉ ืืืืื ืขื ืืืื ืืคืจืืื ื ืฉืกืืคืง - ืื ืืืื ืืืืืช ืฉืืื ื-10/20/30ms, ืืืืืฉืจื ืฉื ืืืืื ืืืืืื ืจืืฉืืช (ืืคื ืฉื ืืื ืืืืฉื) ืืืฆืขื ืขื ืืขืจื ื ืชืื ืื ืฉื 48kHz, ืืืืื ื ืชืืื ืืืืื 48000ร20ms/1000ร1(ืืื ื)=960 ืืชืื. Webrtcvad ืืืืืจ True/False ืขืืืจ ืื ืืื ืืื ืชืืื ืืืื, ืื ืฉืืชืืื ืื ืืืืืช ืื ืืืขืืจ ืืฆืืขื ืื ืชื.
ืืืื ืืืืฉื ืืช ืืืืืืื ืืื:
- ื ืืกืืฃ ืืจืฉืืื ืืช ืื ืชืืื ืฉืืื ืืฉ ืืฆืืขื; ืื ืืื ืืฆืืขื, ื ืืืื ืืช ืืืื ื ืฉื ืื ืชืืื ืืจืืงืื.
- ืื ืืืื ื ืฉื ื ืชืืื ืจืืงืื ืืื >=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 (ืืืฆืื ืืื ืืื). ื ืืกืื ื ืืขืจื 5-7 ืคืชืจืื ืืช ืฉืื ืื ื-github, ืืื ืืืืื ืืืืืื ืจืืฉืืช ืขืื ืืื, ืื ืขื ืืืืื ืงืืื ื ืืืฆื ื ืืืืืช ืืืชืจ โ ืื ืืฉืชืืฉืื ืืืจืืืืงืืืจืืช ืืืจืืืืช ืืืชืจ.
ืื ื ืืชืืงืืื ืืืืจืื ืืืืื:
- ืจืืฉืืช ืืืงืื -
https://github.com/alexmuhr/Voice_Emotion
ืื ืขืืื ืืคื ืืขืืงืจืื ืืื: ืืืืื ื ืืชื ืืงืืขืื ืืืืื ืืกืืื, ืขืืืจ ืื ืืื ืืืงืืขืื ืืืื ืื ื ืืืืจืืMFCC ืืืืืจ ืืื ืฉืื ืืืชื ืืงืื ื-CNN - ืืืืื ืงืืื -
https://github.com/linhdvu14/vggvox-speaker-identification
ืืื, ืืืงืื MFCC, ืื ื ืขืืืืื ืขื ืกืคืงืืจืืืจืื, ืืืืจ FFT ื ืืื ืืช ืืืืช ื-CNN, ืืืฉืจ ืืืืฆื ื ืงืื ืืืฆืื ืืงืืืจ ืฉื ืืงืื.
ืืฉืื ืืื ื ืืืจ ืขื ืืืจืช ืืืืืื, ืืื ืืชืืืืจืื. OpenVINO ืืืื ืืกืคืจ ืืืืืืื:
- Open Model Zoo, ืืืืื ืืื ื ืืชื ืืืฉืชืืฉ ืืืืืื ืืืืฆืจ ืฉืื
- Model Optimzer, ืฉืืืืืชื ื ืืชื ืืืืืจ ืืืื ืืคืืจืืืื ืฉืื ืื ืฉื ืืกืืจืช (Tensorflow, ONNX ืืื') ืืคืืจืื ืืืฆืื ืืื ืืื, ืืืชื ื ืขืืื ืืืืฉื
- Inference Engine ืืืคืฉืจ ืื ืืืจืืฅ ืืืืื ืืคืืจืื IR ืขื ืืขืืื ืืื ืื, ืฉืืืื ืจืืื ืืืืืฆื Neural Compute Stick
- ืืืจืกื ืืืขืืื ืืืืชืจ ืฉื OpenCV (ืขื ืชืืืื ืืื ืืข Inference)
ืื ืืื ืืคืืจืื IR ืืชืืืจ ืขื ืืื ืฉื ื ืงืืฆืื: .xml ื-.bin.
ืืืืืื ืืืืจืื ืืคืืจืื 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()
ืืืืจ ืืื, ื ืืงื ืืช ืืืืืงื ืื ืคืืฆื ืืืืชืจ ืขืืืจ ืื ืืืืื ืืช. ืคืชืจืื ืคืฉืื, ืืื ืืืืงืชืื ืืชื ืื ืฆืจืื ืืืืฆืื ืืฉืื ืืืคืจื ืืื, ืจืง ืื ืืฉ ืื ืืื. ืืฉ ืื ื ืขืื ืืจืื ืขืืืื, ืื ืืืื ื ืืฉืื ืืืื โ ื ืขืกืืง ืืืืืื ืงืืื. ืืฉ ืฆืืจื ืืืฆืืจ ืืืืฉืื ืืกื ื ืชืื ืื ืฉืื ืืืืืกื ื ืกืคืงืืจืืืจืืืช ืฉื ืงืืืืช ืืืงืืืื ืืจืืฉ. ืืืืจ ืฉื ืืชืจ ืืขื ืืื, ื ืคืชืืจ ืืช ืืืขืื ืืืืื ืืืืืชื ื.
ืืืืืจ, ืื ื ืืืฆืจืื ืกืงืจืืคื ืืืงืืืช ืงืืข ืงืืื (ืื ืคืืขื ืืืืชื ืืืคื ืืคื ืฉืชืืืจ ืืขืื, ืจืง ืืืฉืจ ืืืคืกืง ืืืืงืืืช ืืื ืืฉืืืจ ืืช ืืงืื ืืงืืืฅ).
ืืื ื ื ืกื:
python3 voice_db/record_voice.py test.wav
ืื ื ืืงืืืืื ืงืืืืช ืฉื ืืกืคืจ ืื ืฉืื (ืืืงืจื ืฉืื ื, ืฉืืืฉื ืืืจื ืฆืืืช)
ืืืืจ ืืื, ืขืืืจ ืื ืงืื ืืืงืื ืื ื ืืืฆืขืื ืืจื ืกืคืืจืืฆืื ืคืืจืืื ืืืืจื, ืืฉืืืื ืกืคืงืืจืืืจืื ืืฉืืืจืื ืืืชื ืืืขืจื numpy (.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). ืืืจ ืื ืืื ืื ื ืืื ืืืืกืืฃ ืืืืื ืืืฉืื ืืืชืืงืื ื ืืืชืืืช ืื ืืืคืืก ืฉื ืืคืืืงืฆืืืช ืืืื ืืจื ื.
ืืคืืืงืฆืืืช ืจืฉืช
ื ืงืืื ืืฉืืื: ืื ืื ื ืืืงืืื ืืืชื ื ืจืืืืจ ืืืืืช ืืืืืืจืื ืืช ืืจืฉืช ืืืงืืืืช ืฉืื ื, ืื ืขืืืจ ืืืืจ ืืช ืืืืฉืืจ ืืืืืฉืืื ืื ืืืืื ืืจื ืืจืฉืช.
ืืงืฆื ืืืืืจื ืืื ืขืจืืฅ ืืืืขืืช ืืงืฆื ืืงืฆื ืืื ืืืืืช ื-Raspberry Pi, ืืืืืกืก ืขื ืืื ืืืืืืืช websocket (ืคืจืืืืงืื http over tcp).
ืืฉืื ืืจืืฉืื ืืื ืงืืืช ืืืืข ืืขืืื ืืคืื, ืืืืืจ ืื ืืืื ืืจืืืื ื-json, ืฉื ืฉืืจืื ืืืกื ืื ืชืื ืื ืืืืฆืข ืืืจื ืฉืืื, ืื ืฉื ืืชื ืืืคืืง ืกืืืืกืืืงืืช ืขื ืืจืงืข ืืจืืฉื ืฉื ืืืฉืชืืฉ ืืชืงืืคื. ืืืืื ืื ื ืฉืืืช ืืืืจ ืืื ื-frontend, ืืืฉืชืืฉ ืืื ืื ืืืงืื ืื ืืช ืื ืงืืืช ืืงืฆื ืฉื websocket. ืื ืื ืื ืื ืืงืฆื ืืืืืจื ืื ืื ืืฉืคืช ืืืืื ื; ืืื ื ืืืจ ืืืื ืฉืืื ืืชืืื ืืืฉืืืืช ืืกืื ืืจืื ืืืช, ืฉืืืืจืืืื ืื ืืชืืืืืื ืืื ืืืื.
ืืื ืืกื ืื ืงืืืช ืืงืฆื ืืืฉืชืืฉ ื ืจืฉื ืื ืื ืก ืืืื ื ืืื ืืชืงืืืช ืืืืขืชื. ืื ืืืฉืชืืฉ ืืื ืืืืืขื ืืืื ืกืื ืืจืืืช ืืฉืืชืคืช, ืฉืืื ื ืืืจ ื ืฉืืืืช ืืืืขืืช ืืืื (ืืืืืช ืืื ืื), ืืื ืืืฉืชืืฉ ืกืืืจ ืืช ืืืืืืจ (ืคืื ืื ืืืืช), ืืื ืืื ืื ืฉืื ืืชืืื ืืืื ืืืกืจ ื ืืจืืืช.
ืื ืื ื ืืืืื ืืืืืืจ ืืืืืจFront-end ืืื ืืืฉืื ืืื ืืจื ื ืฉื ืืชื ื-JavaScript ืืืืฆืขืืช ืกืคืจืืืช React ืืื ืืืืืฅ ืืืคืฉื ืืช ืชืืืื ืืคืืชืื. ืืืจืช ืืคืืืงืฆืื ืื ืืื ืืืืืื ื ืชืื ืื ืฉืืืฉืื ืืืืฆืขืืช ืืืืืจืืชืืื ืืคืืขืืื ืืฆื ืืืืืจื ืืืฉืืจ ืขื ื-Raspberry Pi. ืืืฃ ืืฉ ื ืืชืื ืืืงื ืืืืืฉื ืืืืฆืขืืช react-router, ืื ืืขืืื ืืจืืฉื ืืืขื ืืื ืืื ืืขืืื ืืจืืฉื, ืฉืื ืืจื ืจืฆืืฃ ืฉื ื ืชืื ืื ืืชืงืื ืืืื ืืืช ืืืฉืจืช ืืืืฆืขืืช ืืื ืืืืืืืช WebSocket. Raspberry Pi ืืืื ืงืื, ืงืืืข ืื ืืื ืฉืืื ืืืื ืกืคืฆืืคื ืืืกื ืื ืชืื ืื ืืจืฉืื, ืืฉืืื ืจืฉืืืช ืืกืชืืจืืืืช ืืืงืื. ืืืงืื ืืฆืื ืืช ืื ืชืื ืื ืืจืืืื ืืืื ืืขืืื ืืื ืืืืชืจ, ืืฆืื ืืช ืืืืืืืจ ืฉื ืืืื ืฉืกืืืจ ืืื ืื ืฉืืืืจ ืืืืงืจืืคืื, ืืื ืื ืืช ืืจืืฉ ืฉืื ืืื ืืืื ืืช ืืืืืื.
ืขืืื ืืืช ืขื ืชืืืืืช ืืขืืืื ืืชืืกืงื ื
ืื ืืคืฉืจ ืืื ืืืฉืืื ืืื ืืืชืืื ื, ืคืฉืื ืื ืืื ืื ื ืืื, ืื ืืชืงืืื ืืขืืงืจืืช ืืืืชื ืืืืืื, ืฉืืื ืืขืืื. ืืืฆืืช ืื ืืืืจื ืขื ืืื ืืื ืขืืื, ืืืื ืืืืื ืื ืืงืื, ืืืืื ืืขืืืช ืื ื ืชืงืื. ืืืืจ ืืื ืืื ืืืง ืืืืืื - ืืืืืื ืืกืชืืืื ืืืืจ ืืกืืจ ืืงืจืื ืืคื ื ืืื ืฆืืืช ืืื ืืืืื ืืช ืื ืืืืคืืก ืืขืืื. ืื ืฉืืื ืืืชื ื ืื ืฉืืืืช, ืื ืืื ืขื ื ืขื ืืืงื, ืื ืืฉืืืจื ืืช ืืืื ืืจื ื ืขื ืืืืฉื ืื ืืื, ืืืื ืืืืช ืขืื ืืืฆืืคื.
ืืจืฉื ืื ืืฆืืื ืฉืืขืืืช ืืืืืืช ืฉื ืืคืชืจืื ืฉืื ื ืืืืชื 150$:
- Raspberry Pi 3 ~ 35 ืืืืจ
- ืืฆื ืคืช ืงืื AIY ืฉื ืืืื (ืืชื ืืืื ืืงืืช ืขืืืช ืจืืงืืืื) ~ 15$
- Intel NCS 2 ~ 100$
ืืื ืืฉืคืจ:
- ืืฉืชืืฉ ืืจืืฉืื ืืืืงืื - ืืงืฉื ืืงืจืื ืืช ืืืงืกื ืฉื ืืฆืจ ืืืืคื ืืงืจืื
- ืืืกืฃ ืขืื ืืื ืืืืื: ืืชื ืืืื ืืงืืืข ืืื ืืืื ืืคื ืงืื
- ืืคืจื ืงืืืืช ืฉื ืฉืืขืื ืื ืืื ืืช (ืืืื)
ืืืืจ:
https://github.com/vladimirwest/OpenEMO
ืื ืื ื ืขืืืคืื ืืื ืฉืืืืืืกืืืื, ืื ื ืจืืฆื ืืืืื ืชืืื ืืืืจืื ืื ืืืืฉืชืชืคืื. ืืื ืืคืจืืืงืืื ืฉื ืฆืืืชืื ืืืจืื, ืืืื ื ืืืืคื ืืืฉื ืืช ืืคืชืจืื ืื ืืืืจ ืืงืืืืช ืื ืื ืคื ืืืื. ืขืืืจื ื ืื ืืืืชื ืืืืื ืืื ืืื ืืืคืืื ืฉื ืืชืขืืงืืช ืืืืฆืจ ืืืคืืชืื. ืื ื ืืงืืื ืฉืขืื ืืขืื ืืืจืืขืื ืืขื ืืื ืื ืืชืงืืืื ืืืืืจืื, ืืืื ืื ืืฉืื AI.
ืืงืืจ: www.habr.com