ááŹáá á 30 - á˛á´áá á 1 á ááá ááááŽáľ á°áŤáá°
á áá á˝áá ááľáĽ á¨áááąá ááŽáśáłáá áĽáá´áľ áĽáá°áá áá áĽááááááłáá ᣠáĽáąá á áá¨á¨áť á¨ááááŞáŤáá áŚáł á¨áŤááá˘
á hackathon á¨10 á áá áĄáľáá˝ á°áłáľáááᢠá ááłááśáš á¨áá ááá áááŁáłá¸á áĽáŠ ááᢠᨠhackathon áŚáłá "Kremlinsky on Pochain" ááľáĽáľáĽ áá á, á¨ááĽá ááááŽáľ áĽááłá ááśááŤáá˝ á áĽáá¸á ááľáĽ á°á°á ááá! (á á áá áá á¨á˘áá´á ááá¨áá á˘áŽ á ááá ááááŽáľ ááľáĽ áĽáá°ááá á áľáłááłáá)ᢠá°áłáłááá˝ áŽáľ áááťá 26 á°á áłáľ á°á°áĽáˇá¸áá, áĽá á áá¨á¨áťá áááľáááťá¸áá áá á¨áĽ áá á¨áŁá¸á. á¨á°áᨠáĽá á á¨áłáá°á ááá áá á áľááá áá°áá áŠá áĽá á á ááŤá¨áĄ áá ááłáŚá˝ áĽááłááአááá¨ááἠá¨ááłáŤ ááá áá ááአáá áᢠá¸ááĽáŁ ááá°áľáŁ áááĽáŁ ááá ááá áĽááŤá áá á!
á á°á¨ááŞá á˘áá´á áĽáá° á ááŤá áŤááŤáá˝áᣠRaspberry PIᣠNeural Compute Stick 2 á á áá§áá˘
á¨á°ááŁá áááŤ
ááá-ááá hackathon ááááááľ á áŁá á áľá¸á᪠á¨áááľ áááá˝ á ááą ááłá áááłá ááá¨áĽ ááᢠááľáłáááŤá áá á áŁá á°áľ á¨áá áá áľáá°áŁá áá˛áŤáá á áááą ááľáĽ áŤááá ᨠááá ááááŁáľ áá°ááá˘
á°ááľáá
- á ááľá ááłáĽ, á áááąá áľáá˝ áĽá ááľá áá á¨áá°áŤ áĽáá áľáá°-ááá ááá á ááťáá, áá á áľááááááľ áá¨áá á áá áľ.
- áŤááŤáá˝ áĽááá áá á áŁáĽ á¨áááá¨áť áááá á áá¸áᥠá°á áŚáłá ááá¸áá á¨á ááľ á áá áŤá፠áŤáľááááᥠáľáá˝ áá á áŤá á áá°áĽ á¨áááá˘
ááłáĄá áĽááłáĽáᥠá¨á˝ááťáŽ áááá ááłáĽ áĽáá° áá°á¨áľ áĽááá°áľá˘ á áá°áĽá áááŤáá˝ á¨á°áá áá˝á áĽááŤáł áááŤáľ áá˝ááᢠá¨á°áá ááš á ááą á á áááááą áŤáá°á°á°á° áĽá áľááá¸áá á¨á ááľá¨á á¨ááአáá˛áŤáá ááĽááłáł á áľá°áłáłáŞáá áá°áá áá˝ááá˘
á áá
áááł, á¨á°á áľáá˝ ááááŤá áá¨áá á ááĽá, áá
á¨áąá
á°áŤá°áá˝á á¨á°áá áá˝ áááá¨áľ áĽá ááĽáŤááłááą ááá°áĽ áľááłá áááľá áľ áŤáľá˝ááá. á°á
á ᣠá á°á¨á᪠ᣠá¨áąá
á°áŤá°áá˝á áŁá
᪠áá°áá°á ᣠá áĄáľá ááľáĽ áŤááá áááł ááááá ᣠáĽáŠ áááľáá!
ááááľáááťá˝á ááľáááśá˝á áĽáááááá-
- á¨áłááá ááŁáŞáŤ áľáá˝ áá á
- á¨áĽááá°á áá á á áŤá
- áá á°á áá
- ááá ááŹáľ
á áá¤áąá, Raspberry Pi 3 c áĽáá° áááá ááłáŞáŤ áĽááááŁáá
áĽáá á ááľ á áľááá ᨠNCS áŁá áŞá áἠáááľ á áľááá áá - á¨áá°á á á¨á˛á¤áá¤á á ááá´áá¸á áá á á°áťá áááł áá°áŤáᣠááá áá á áአáá áĽá ááĽááĽáŽá˝ áŤáá áá´á ááľáŹáľ á¨ááá áá á°á á°á¨á áááťá¸áľá áá áĽáá˘
á ááľ áľáá˝ ááá ááľá¨á áĽáť ááᥠááááŽáá ááááľ á ááŚáľá˘ áá°á á á¨áŠá¤áľá˘ ááááŽáá áá°áŤáᣠáá ᨠRPI áá á áĽáŽ áĽáŠ á áááľááᢠáá áĽáá
á á˘áá áááľáá á áĽáŹá âá á á
áŤá˘áŤâ á áᢠáľáá˝á ááá
áłáľ á¨áŽááľ áŚááľ á°ááłá á¨ááłáŞáŤá ááá áá áĽáááľáááá˘
Raspbian ᨠá áááľ
arecord -d 5 -r 16000 test.wav
ááááŽáá á áŁá áľááłá áááá áĽá áŠá¸áľá á á°áἠáĽáá°ááá áá˛áŤáá áἠáá áᢠáá áá áááľá°áŤá¨á áá° alsamixer áĽáááľáŁ Capture devices á¨áááá áĽááááŁáá áĽá á¨áá¤áľ á˛ááá á°á¨áá áá° 50-60% áĽááááľá˘
áááá á ááá áĽááľá°áŤáááá áĽá ááá ááá á°áľáá áá, á ááłá áĽááłá ááááľ áá˝áá
á áááŤá˝ á ááŤá á áá¨á áá
AIY Voice Kit á áá¨áĽáť áľáááľáľáŁ ᨠ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 á¨áá¨á á ááŤá áá á áá áá°áĽ áŤáá á ááá - 10/20/30ms áá áĽáŠá ááá á áá áľ, áĽá áľááľ áĽáá á áááááľ áá´á áľáá á (áĽá á áá áĽáá°áááá¨á) 48kHz ááἠáľáĽáľáĽ áá á°áŤááś áá á, áĽá áŤá°ááá. 48000Ă20ms/1000Ă1(áá)=960 áŁááľ áá á áŤáá¸á áááĽáŤáŽá˝ ááŤáᢠWebrtcvad ááĽáŤááłááłá¸á áĽáááľ/áá°áľ ááááłááŁáá á á¨áľáá˝ ááááľ ááá áá á¨áľ áá ááááłáá˘
á¨áá¨á°ááá á áááᎠáĽáá°ááĽá¨ááĄ-
- áľáá˝ á áá°áĽá áľ áŚáł áá áĽáááŤá áááĽáŤáŽá˝ áĽáá¨ááŤááᤠáľáá˝ á¨áá áŁáś ááŤáŽá˝ ááŁáŞáá áĽáá¨ááŤáá á˘
- á¨áŁáś áááĽáŤáŽá˝ ááŁáŞ>=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's ááľáŁá á áá¸áľ - IR (ááŤá¨áá áááá) áááá§á¸áᢠá¨ááąáĽ áá° 5-7 á¨ááá á¨á°ááŤáŠ áááľááá˝á ááá¨áá ᣠáĽá áľááśá˝á áááá¨áľ áá´á áá˛áŤáá á¨á°áŤ ᣠá¨á፠á áľáá˝ ááá፠áĽá áá áá á á áá á¨áĽá - á¨á áá ááľáĽáľáĽ á ááŞá´áá¸á áá áááá˘
á áá¨á°ááľ áá áĽáá°áŠáŤááá˘
- á¨áľáá˝ áľááśá˝ -
https://github.com/alexmuhr/Voice_Emotion
á áá¨á°áá ááá áá°á¨áľ áá°áŤá: áŚá˛áŽ á á°áá°á áá á áá° áááŁáŚá˝ á°ááá§á, ááĽáŤááłááą áĽááá áááŁáŚá˝ áĽááááŁááá¤áá¤áá˛á˛ áĽá á¨á፠á CNN áĽáá° ááĽá áľ áŤá áᥠ- á¨áľáá˝ ááá፠-
https://github.com/linhdvu14/vggvox-speaker-identification
áĽáá , á¨á¤áá¤áá˛á˛ ááá , á áľáááľáŽááŤá áĽáá°áŤáá, á¨á¤áá¤áᲠá áá ááááąá áá° CNN áĽááááŁáá, á áá¤áą áá á¨áľáá áŹáá°á áááá áĽááááá.
á ááá á áá´áá˝á áľáááá¨á áĽáááááŤáá, á¨á˛á᪠áááŽ. OpenVINO á ááŤáł áááá˝á áŤáŤáľáłááĄ-
- áá´á ááŤá á áŤááľ áááľáŁ á¨ááą ááľáĽ áĽá á áá ááá á¨áá˝á áĽá á áááľá ááľáĽ ááŤá°áą áá˝ááá˘
- áá´á áŚáá˛áááᣠááá á ááľáá áááŁáá á ááľá áá´á á¨á°ááŤáŠ á¨áááá á áá¸áśá˝ (TensorflowᣠONNX ááá°) áá° ááŤá¨áá á¨áááá ááááľ áááἠáľá˝ááá ᣠá áá á á¨á áá áĽáá°áŤááá˘
- á¨á˘áááá˝á áá°á áá´áá˝á á IR ááááľ á á˘áá´á ááŽá°á°áᣠá áááŞáŤáľ áşááľ áĽá á ááá áŽáááŠáľ áľá˛á ááá á áá áĽáá˛áŤááą ááá áľáááłáá˘
- á áŁá áááŁáá á¨OpenCV áľáŞáľ (á¨á˘áááá˝á áá°á áľáá áá)
áĽáŤááłááą áá´á á 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++ á¤áá á ááľáĽ áŤá áááľááᣠááá áá áŤá áŤá á áááľ á áááááá áĽá á ááá áá ááą áá´áá˝ á áľá°áŤáááá˘
á ááá á, áá°á á˛á á¨á°ááá áá áá´á á IR á áá¸áľ á á˛á¤áá¤á ááá áá° OpenCV áááŤá áĽá áá° áĽáą áááľá°ááá áĽáááá.import cv2 as cv emotionsNet = cv.dnn.readNet('emotions_model.bin', 'emotions_model.xml') emotionsNet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)
á áá ááłá áá áŤáá á¨áá¨á¨áťá ááľáá áľááśá˝á áá° ááá áŽáááŠáľ áľá˛á áĽáá˛ááአáŤáľá˝áááłá, áá°á¨áłá áľááśá˝ á ááááŁá áŞáŤá áá áá¨áááá, ááá áá á Raspberry Pi áááł áá á áá°áŤá, áąá áŤáľáááááłá.
á ááá á á ááááŽá áĽáá°áá¨á°áá ááᥠáľááá˝áá á á°áá°á áá á áá° ááľáŽáśá˝ áĽáá¨áááá (ááĽá 0.4 á°á¨ááľ áá)ᣠáĽááá á ááľáŽáśá˝ áĽáŤááłááłá¸áá áá° á¤áá¤áá˛á˛ áĽááááŁá¸áááᣠá¨ááŤá áá° ááááá áĽááááŁáááĄ
emotionsNet.setInput(MFCC_from_window) result = emotionsNet.forward()
á ááá á áááá ááľáŽáśá˝ á áŁá á¨á°ááá°áá ááá áĽááá°áľ. ááá áááľá, ááá áá á hackathon á áŁá á¨ááá¨áŁ ááá ááá áááŁáľ á áŤáľáááááľá, áá áŤáááľ áĽáť. áá áĽá áľáŤ ááá¨ááᣠáľááá áĽáááĽá - á¨áľáá˝ ááááŤá áĽááľá°áááłááᢠáá°á á˛á á¨á°ááł áľáážá˝ á¨ááááĄá áľá á ááľ ááááľ áłáłá¤á ááľá¨á áŤáľááááᢠá¨áá¨á áá áľáá˝ áľááá áá áá á˝áá á á°áťáá áá á áĽáááłáááá˘
áá¸áá á¨áľáá á áá ááá áłáľ áľááŞááľ áĽáááĽáŤáá (á¨áá áĽáá°á°áááá á á°ááłáłá ááááľ áá°áŤá, á¨ááá á°ááłá á˛áá¨áĽ áĽáť áľáášá áá° ááá áŤáľáááŁá).
áĽáááááĄ-
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 ááá ፠XNUMX ááľáˇá) á¨áááá ááľá°áá áĽáááááᢠá áłá˛áľ áá´áá˝á ááá¨áá áá á ááááá áĽá á¨áľá áá°áá áŞáŤá ááłá á ááťá áá á á°áŠá¨á áá áá˘
á¨áľá áá°áá áŞáŤ
á ááľ á áľááá ááĽáĽ: á¨áĽá áá áŤáá°á á¨á¤áľ áĽáááľáłáá áĽá á¨á áŤáŁá˘áŤá˝áá á ááłá¨ áá¨áĽ áĽáááááá, ááłáŞáŤáá áĽá áááśáá˝á á á ááłá¨ áá¨áĄ áá ááááááľ áá¨áłá.
á ááĽáśáŹáľ á´áááá (http over tcp ááŽáśáŽá) áá á¨á°áá°á¨á°á á¨ááá ááá á ááľ áĽá Raspberry Pi ááŤá¨á áŤáá á¨áŤá áĽáľá¨ áŤá áŤáá á¨áááĽááľ áťáá ááá˘
á¨ááááŞáŤá á°á¨á á¨á°ááá áá¨áá á¨áŤáľá ᪠ááá á ááᣠáááľáᣠá json ááľáĽ á¨áłá¸á áľáá áŤáá˝áŁ á ááá¸á á ááá˝ áá á áá¨á ááą ááľáĽ ááááŁá áľáááá á¨á°á áááá áľááłá áłáŤ áááá áľáłá˛áľá˛ááľ ááá á áá˝ááᢠáá ááŹáľ á¨á°áá áááľ ááááŁá á¨áá áá áĽá á¨ááĽáśáŹáľ áá¨á¨áť ááĽáĽ áá° ááá áá á¨ááľ áááľ ááá áááŤáᢠá¨áááá ááá á áá á¨á°áááŁá á áááá ááá ááᤠá¨á°áá¨á á ááŽá˛á á á°áἠáááááľ áá°ááłá°á á°ááŁáŤáľ á°áľáá áľááá ááá˘
á¨áá¨á¨áťáá ááĽáĽ á˛á°ááą á°á ááá á°áááጠáá° ááá አááľáĽ ááĽáˇá, á¨ááŤá áááĽááą ááá áá. á°á ááá áĽá áááĽááą áá° á ááľ á¨á፠ááĽá¨á ááĽá°áá ᣠá¨á፠áááĽááśá˝ ááľá áá°áá°áááá áľ (áá°ááááĄáľ áááŁá) ᣠáĽá á°á ááá áááááąá á¨ááá (áŤáľá¤áŞ ááá á¨ááľ) ᣠá¨á፠á¨áĽáą áááᣠá°á°ááá áĽá ᨠááá¨á.
á¨áááŁá áááááľ áĽá¨á á á á ááFront-end á¨áĽáľááľ áá°áąá áááá á áĽá ááááá áŹááľ áááĽá¨áŞ á áá áá á á፠áľááŞááľ á¨á°áťá á¨áľá áá°áá áŞáŤ ááᢠá¨áá áá°áá áŞáŤ ááá á áááŁ-áá¨á¨áť á áŠá áĽá á ááĽáł á Raspberry Pi áá á¨áá°áŠ áľáá° áááŽá˝á á áá áá á¨á°áááá áá¨á áá¨áľ ááᢠáá react-routerá á áá áá á¨á°á°áá ᨠá¨á´áá˝á áááŞáŤ á áá ááá áá á¨ááááľ ááá áá˝ á¨ááĽáśáŹáľ á´ááááá á áá áá á¨á áááአá áĽááá°á áá ááŁáááľ áŤáá á¨áá¨á áá°áľ á¨ááá áá áľ ááá áá˝ ááᢠRaspberry Pi áľáá˝á ááá áŤáááᣠá¨á°áááá á á¨ááἠááł á¨á ááľ á¨á°áá°á á°á ááá á ááááá áááľáá áĽá áá°áá áá á¨ááááł áááá áááŤáᢠá°áá áá á¨á áἠáááá á°ááá ááľ áŤáá áá¨á áŤáłáŤá ᣠááááŁáľá á ááááŽáá ááľáĽ á¨á°ááá¨áá á°á á ááłáŤ áĽá áááąá á¨ááááá áľá áľááľ áŤáłáŤá á˘
áááť áá˝ á¨á°ááá áľáá áŤáá˝ áááá°áá°ááŤ
áááá ááá áĽáá°áłáá°á áá ááá á áá°áťáá, á ááá áá á ááá á¨áá, áľááá ááá á°áľá á ááłáŤ ááľáĽ áá á, ááá ááá áĽáá°áá°áŤ. á ááá áą áá ááá ááá áĽáá´áľ áĽáá°áá°áŤ, áá ááááľ áá´áá˝á áĽáá°áá°áą, áá á˝ááŽá˝ áĽááłáá áá¸á á°áááŠ. á ááá á á¨ááłáŤ ááá áá á - áŁáááŤáá˝ á áááá° á á°á á°á¨á°á á ááá ááľáĽ áĽá¨á°áááአáĽá áĽáŤááłááąá áĄáľá ááá á á¨áľáŤáá ááłá ááááá¨áľ áá¨áĄá˘ áĽááá áĽáŤááá˝á á á¨ááᣠááá á¨á¨áľááťá¸áá áááąáŁ áľáŠá á áááśá áá áááᣠáĽá ááá ááá á áľááá áĽáá°á°á á áá á°ááˇáá˘
á¨áááľááŤá˝á á á ááá á᪠150 áśáá áĽáá°áá á áἠáááá˘
- Raspberry Pi 3 ~ 35 áśáá
- Google AIY Voice Bonnet (á¨áľáá˝ áá፠áá፠ááá°áľ áá˝áá) ~ 15$
- Intel NCS 2 ~ 100$
áĽáá´áľ ááťáťá áĽáá°ááťááĄ-
- á¨á°áá áá ááááŁá áá áá - á áááá° á¨ááá¨áá á˝áá áááá ἠáá áá
- áĽááľ á°á¨á᪠áá´áá˝á áŤááᥠážáłá áĽá ááľáá á áľáá˝ ááá°á áá˝ááá˘
- á á ááľ áá á¨áá°á áľáážá˝á áá (á˛áŤáŞáá˝á)
áá¨ááťáĄ
https://github.com/vladimirwest/OpenEMO
á°áááá áá á°áľá°áá˝ ááá áá áááŤá á áááášá áĽá á°áłáłááá˝á á áá°áááá áááľ áĽáááááᢠá¨ááá˝ áĄáľáá˝ ááŽáááśá˝ ááŤá¨á áá á¨ááŞá ááá፠áŚáłáá˝á ááááŁá á áááľááá á ááá˝á áá°áľáᢠááĽáᣠá áááľ áĽá á áááľ ááľáĽ á¨ááĽáá á áŁá áĽáŠ á°ááᎠáá áᢠá á¤á á á ááĽáľáśá˝ áá á¨áᎠá áááá˝ ááľáĽ áĽá áĽá á¨á áá á áľá°áłá˝ ááľá°áśá˝ áĽáá°áá°á¨á á°áľá á á°ááááá˘
ááá: hab.com