30 рдирд╡рдВрдмрд░ - рдирд┐рдЬрд╝рдиреА рдиреЛрд╡рдЧреЛрд░реЛрдб рдУрдкрдирд╡реАрдиреЛ рд╣реИрдХрд╛рдереЙрди рдореЗрдВ 1 рджрд┐рд╕рдВрдмрд░ рдХреЛ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдЗрдВрдЯреЗрд▓ рдУрдкрдирд╡рд┐рдиреЛ рдЯреВрд▓рдХрд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЙрддреНрдкрд╛рдж рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ред рдЖрдпреЛрдЬрдХреЛрдВ рдиреЗ рдирдореВрдирд╛ рд╡рд┐рд╖рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЛ рдЪреБрдирддреЗ рд╕рдордп рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп рдЯреАрдореЛрдВ рдХреЗ рдкрд╛рд╕ рд░рд╣рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрддреНрдкрд╛рдж рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рдж рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреИрд╕реЗ рдмрдирд╛рдпрд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдЦрд┐рд░рдХрд╛рд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд░рд╣реЗред
рд╣реИрдХрд╛рдереЙрди рдореЗрдВ 10 рд╕реЗ рдЕрдзрд┐рдХ рдЯреАрдореЗрдВ рд╢рд╛рдорд┐рд▓ рдереАрдВред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рд╕реЗ рдЖрдП рд╣реИрдВред рд╕реНрдерд▓ "рдж рдХреНрд░реЗрдорд▓рд┐рди рдСрди рдж рдкреЛрдЪреИрди", рдЬрд╣рд╛рдВ рдирд┐рдЬрд╝рдиреА рдиреЛрд╡рдЧреЛрд░реЛрдб рдХреА рдкреБрд░рд╛рдиреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЛ рдЕрдВрджрд░ рд▓рдЯрдХрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣реИрдХрдереЙрди рдХреЗ рд▓рд┐рдП рд╕реНрдерд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛! (рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдлрд┐рд▓рд╣рд╛рд▓, рдЗрдВрдЯреЗрд▓ рдХрд╛ рдХреЗрдВрджреНрд░реАрдп рдХрд╛рд░реНрдпрд╛рд▓рдп рдирд┐рдЬрд╝рдиреА рдиреЛрд╡рдЧреЛрд░реЛрдб рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ)ред рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП 26 рдШрдВрдЯреЗ рдХрд╛ рд╕рдордп рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдирд╛ рдирд┐рд░реНрдгрдп рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдПрдХ рдЕрд▓рдЧ рдкреНрд▓рд╕ рдПрдХ рдбреЗрдореЛ рд╕рддреНрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдерд╛, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рддреНрдп рджреНрд╡рд╛рд░рд╛ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдорд░реНрдЪ, рд╕реНрдиреИрдХреНрд╕, рднреЛрдЬрди, рд╕рдм рдХреБрдЫ рд╡рд╣рд╛рдБ рднреА рдерд╛!
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрдВрдЯреЗрд▓ рдиреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдХреИрдорд░реЗ, рд░рд╛рд╕реНрдкрдмреЗрд░реА рдкреАрдЖрдИ, рдиреНрдпреВрд░рд▓ рдХрдореНрдкреНрдпреВрдЯ рд╕реНрдЯрд┐рдХ 2 рдкреНрд░рджрд╛рди рдХрд┐рдПред
рдХрд╛рд░реНрдп рдЪрдпрди
. -, , , .
, , , . , OpenVINO, , . тАФ . . , OpenVINO , , :
: retail . . - тАФ .
, , . , , , !
:
Raspberry Pi 3 c Intel NCS 2.
NCS тАФ CNN , , ╠╢╠╢╠╢╠╢╠╢╠╢╠╢ ╠╢╠╢ ╠╢╠╢╠╢╠╢╠╢╠╢╠╢ .
: . USB-, RPI. тАЬ тАЭ. Voice Bonnet Google AIY Voice Kit, .
Raspbian AIY projects , , ( 5 ):
arecord -d 5 -r 16000 test.wav
, . , alsamixer, Capture devices 50-60%.

,
-
AIY Voice Kit , RGB-, . тАЬGoogle AIY LedтАЭ : https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
, 7 , 8 , !
GPIO Voice Bonnet, ( AIY projects)
from aiy.leds import Leds, Color
from aiy.leds import RgbLeds
C dict, 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/30, ( ) 48, 48000├Ч20/1000├Ч1()=960 . Webrtcvad True/False , .
:
- list , , , .
- >=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, , , . , , , OpenVINO тАФ IR (Intermediate Representation). 5-7 github, , тАФ .
:
, . OpenVINO :
- Open Model Zoo,
- Model Optimzer, (Tensorflow, ONNX e.t.c) Intermediate Representation,
- 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 forward .
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
( )
fast fourier transform, 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
:
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)
, , cosine distance ( , ) тАФ 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 protocol).
, json , , . , . golang, , , .
, . , hub, ( ), ( ), , hub.

Front-end web-, JavaScript React . , , back-end Raspberry Pi. , react-router, , WebSocket. Raspberry Pi , probability . , , , , .

, , , , . , , , . тАФ , . , , , , .
, 150$:
- Raspberry Pi 3 ~ 35$
- Google AIY Voice Bonnet ( respeaker) ~ 15$
- Intel NCS 2 ~ 100$
:
: https://github.com/vladimirwest/OpenEMO

,
. . . , , AI .