30 ื ืืืืขืืืขืจ - 1 ืืขืฆืขืืืขืจ ืืื ื ืืืฉื ื ื ืึธืืืืึธืจืึธื ืืื ืืขืืืืื
ืืื ืืขื ืึทืจืืืงื ืืืจ ืืืขื ืืึธืื ืืืจ ืืื ืืืจ ืืืฉืืคื ืืื ืืืขืจ ืคึผืจืึธืืืึทืืืืคึผ ืคืื ืื ืคึผืจืึธืืืงื, ืืื ืืืึธืก ืืืจ ืืืืขื ืืฉืึทืืืึทืื ืืขื ืืืขื ืขืจืฉืืขืจ ืึธืจื.
ืืขืจ ืืื 10 ืืืื ืื ืืืื ืืื ืื ืืึทืงืึทืืืึธื. ืก'ืืื ืฉืืื ืื ืืืื ืคืื ืืื ืืขื ืขื ืืขืงืืืขื ืคืื ืื ืืขืจืข ืืขืื ืื. ืืขืจ ืึธืจื ืคึฟืึทืจ ืื ืืึทืงืึทืืึธื ืืื ืืขืืืขื ืืขืจ "ืงืจืขืืืื ืกืงื ืืืืฃ ืคึผืึธืืฉืึทืื" ืงืึธืืคึผืืขืงืก, ืืื ืืืืข ืคืึธืืืึทืืจืึทืคืก ืคืื ื ืืืฉื ื ื ืึธืืืืึธืจืึธื ืืขื ืขื ืืขืืื ืืขื ืืื ืขืืืืื ืืง, ืืื ืึท ืึทื ืืขืจืึทืืฉ! (ืืื ืืขืจืืึธื ืขื ืืืจ ืึทื ืืื ืืขื ืืึธืืขื ื ืื ืืืืคื ืึธืคืืก ืคืื ืื ืืขื ืืื ืืืื ืืื ื ืืืฉื ื ื ืึธืืืืึธืจืึธื). ืคึผืึทืจืืืกืืคึผืึทื ืฅ ืืขื ืขื ืืขืืขืื 26 ืฉืขื ืฆื ืฉืจืืึทืื ืงืึธื, ืืื ืืื ืื ืกืืฃ ืืื ืืึธืื ืฆื ืคืึธืจืฉืืขืื ืืืืขืจ ืืืืืื ื. ื ืืึทืืื ืืขืจ ืืืึทืืข ืืื ืืขืืืขื ืื ืืืึทืืืึทื ืคืื ืึท ืืขืืึธ ืกืขืกืืข ืฆื ืืึทืื ืืืืขืจ ืึทื ืึทืืฅ ืคึผืืึทื ื ืขื ืืื ืคืืงืืืฉ ืืืคึผืืึทืืขื ืึทื ืืื ืืื ื ืืฉื ืคืืจืืืืื ืืืืืึทื ืืื ืื ืคึผืจืขืืขื ืืืจืื ื. ืกืืืจื, ืคึฟืึทืจืืฒึทืกื, ืขืกื, ืึทืืฅ ืืื ืืืื ืืขืืืขื!
ืืื ืึทืืืฉืึทื, ืื ืืขื ืึทืคึผืฉืึทื ืึทื ืฆืืืขืฉืืขืื ืงืึทืืขืจืึทืก, Raspberry PI, Neural Compute Stick 2.
ืึทืจืืขื ืกืขืืขืงืฆืืข
ืืืื ืขืจ ืคืื ืื ืืขืจืกื ืฉืืืขืจ ืคึผืึทืจืฅ ืคืื ืคึผืจืืคึผืขืจืื ื ืคึฟืึทืจ ืึท ืคืจืื-ืคืึธืจืขื ืืึทืงืงืึทืืืึธื ืืื ืืฉืืืื ื ืึท ืึทืจืืืกืจืืคื. ืืืจ ืืึธืื ืืืืื ืืึทืฉืืึธืกื ืฆื ืงืืืขื ืืื ืขืคึผืขืก ืืืึธืก ืืื ื ืึธื ื ืืฉื ืืื ืืขื ืคึผืจืึธืืืงื, ืืืืึทื ืื ืืขืืื ืืื ืืขืืืื ืึทื ืืึธืก ืืื ืืขืืืขื ืืืืขืจ ืืึทืืจืืกื.
ืืืืื ืึทื ืึทืืืืืจื
- ืืื ืืขืึธืจืืข, ืขืก ืืื ืืขืืืขื ืฆื ืฉืึทืคึฟื ืึท ืงืึทืืืืื ื ืึทืืืขืจืืืึทื ืืืึธืก ืืืขื ืึทืจืืขืื ืืืืฃ ืืืืืข ืืขืืื ื ืืื ืืืื, ืืืึธืก ืืึธื ืืขืื ืึท ืคืึทืจืืจืขืกืขืจื ืืื ืึทืงืืขืจืึทืกื.
- ืงืึทืืขืจืึทืก ืืืืฉืึทืืืึทืื ืืึธืื ืึท ืฉืืึธื ืืืืืื ื ืืืื ืงื; ืืขืจ ืืื ืืืื ืึทืคึผืึทืจืึทื ืืื ืคืืจืืื ืื ืฆื ืืขืงื ืึท ืืจืืืก ืฉืื; ืืขืืื ื ืืื ื ืืฉื ืืึธืื ืึทืืึท ืึท ืืึทืืจืขื ืขืฆืื ื.
ืืึธืืืจ ืึทื ืืืืืงืืขื ืืขื ืืขืืึทื ืง: ืืึธืืืจ ื ืขืืขื ืืขื ืืขืืึทื ืง ืคึฟืึทืจ ืื ืืึทืืึธืืื ืึธืคึผืฉื ืื ืืื ืึท ืืงืขืจ. ืืืจ ืงืขื ืขื ืืขืกืื ืงืื ื ืฆืืคึฟืจืืื ืงืืื ืืื ืงืจืึธื ืืฉืขืงืึทืืฅ. ืืืื ืืืื ืขืจ ืคืื ืื ืงืึทืกืืึทืืขืจื ืืื ืืืกืึทืืึทืกืคืืื ืืื ืื ืืื ืกื ืืื ืืืืื ืฆื ืืึทืคึผื ืืืืขืจ ืืึธื, ืืืจ ืงืขื ืขื ืืื ืจืืคื ืื ืึทืืืื ืืกืืจืึทืืึธืจ ืคึฟืึทืจ ืืืืฃ.
ืืื ืืขื ืคืึทื, ืืืจ ืืึทืจืคึฟื ืฆื ืืืืื ืึท ืืขื ืืฉ ืงืื ืืขืจืงืขื ืื ื, ืืึธืก ืืืขื ืืึธืื ืืื ืื ืฆื ืืืกืืืืื ืงืจืึธื ืขืืคึผืืืืื ืคืื ืงืึทืกืืึทืืขืจื ืืื ืฆืืฉืืขืื ืึทื ืึทืืืืืงืก ืคึฟืึทืจ ืืขืืขืจ ืืืื. ื ื, ืืื ืืขืจืฆื, ืขืก ืืืขื ืืืื ืืขืืืขื ืฆื ืคืื ืึทื ืืขืจืงืืืึทืื ืื ื ืึทืืืจ ืคืื ืื ืงืจืึธื ืขืืคึผืืืืื ืืื, ืึธืคึผืฉืึทืฆื ืื ืึทืืืึธืกืคืขืจ ืืื ืื ืืึทื ืฉืึทืคึฟื, ืกืึธืื ืืก ืืื!
ืืืจ ืคืึธืจืืืืืจื ืื ืจืขืงืืืืจืขืืขื ืฅ ืคึฟืึทืจ ืืื ืืืขืจ ืืืืืื ื:
- ืงืืืื ืืจืืืก ืคืื ืื ืฆืื ืืืื
- ืคืึทืงืืืฉ ืฆืืื ืึธืคึผืขืจืึทืฆืืข
- ื ืืืขืจืืง ืคึผืจืืึทื
- ืืจืื ื ืกืงืึทืืึทืืืืืื
ืืื ืึท ืจืขืืืืืึทื, ืืืจ ืกืขืืขืงืืืจื Raspberry Pi 3 c ืืื ืื ืฆืื ืืืื
ืืึธ ืขืก ืืื ืืืืืืืง ืฆื ืืึธื ืืืื ืืืืืืืง ืฉืืจืื ืคืื NCS - ืขืก ืึทืจืืขื ืืขืกืืขืจ ืืื ื ืึธืจืืึทื CNN ืึทืจืงืึทืืขืงืืฉืขืจื, ืึธืืขืจ ืืืื ืืืจ ืืึทืจืคึฟื ืฆื ืืืืคื ืึท ืืึธืืขื ืืื ืื ืื ืืืึทืขืจืก ืืืืฃ ืขืก, ืืขืจืืืึทืจืื ื ืืืขืจืืง-ืืืจืื ืึทืคึผืืึทืืึทืืืืฉืึทื.
ืขืก ืืื ื ืึธืจ ืืืื ืงืืืื ืืึทื ืฆื ืืึธื: ืืืจ ืืึทืจืคึฟื ืฆื ืืึทืงืืืขื ืึท ืืืงืจืึธืคืึธื. ื ืจืขืืืืขืจ ืืกื ืืืงืจืึธืคืึธื ืืืขื ืืึธื, ืึธืืขืจ ืขืก ืืืขื ื ืืฉื ืงืืงื ืืื ืฆืืืึทืืขื ืืื ืื RPI. ืืืขืจ ืืคืืื ืืึธ ืื ืืืืืื ื ืืืฉ "ืืืื ื ืืจืืื." ืฆื ืจืขืงืึธืจืืืจื ืงืื, ืืืจ ืืึทืฉืืืกื ืฆื ื ืืฆื ืื Voice Bonnet ืืจืขื ืคืื ืื ืงืื
ืืจืืคืงืืคืืข Raspbian ืคึฟืื
arecord -d 5 -r 16000 test.wav
ืืื ืืึธื ืืื ืืึธื ืึทื ืืขืจ ืืืงืจืึธืคืึธื ืืื ืืืืขืจ ืฉืคึผืืจืขืืืืืง ืืื ืคึผืืงืก ืึทืจืืืฃ ืจืึทืฉ ืืขืืื ื. ืฆื ืคืึทืจืจืืืื ืืขื, ืืึธืื ืืื ืื ืืืื ืฆื alsamixer, ืกืขืืขืงืืืจื ืงืึทืคึผืืืจืข ืืขืืืืกืขืก ืืื ืจืขืืืฆืืจื ืื ืึทืจืืึทื ืฉืจืืึทื ืกืืื ืึทื ืืืจืื ืฆื 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 ืืืคึผืืข ืืื ืึท ืืืืคืขืฅ ืคืื ืื ืงืืึทืก 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])))
ืงื ืขืคึผื, ืืจืขื ืขื!
ืึทืจืืขื ืืื ืงืื
ืืืจ ืืืขืื ื ืืฆื ืคึผืืึทืืืืึธ ืฆื ืืึทืคึผื ืืขื ืืืึทื ืคึฟืื ืื ืืืงืจืึธืคืึธื ืืื ืืืขืืจืืงืืืึทื ืฆื ืคืืืืขืจ ืจืึทืฉ ืืื ืืขืืขืงื ืงืื. ืืื ืืขืจืฆื, ืืืจ ืืืขืื ืืึทืื ืึท ืจืื ืฆื ืืืึธืก ืืืจ ืืืขืื ืึทืกืื ืืฉืจืึธื ืึธืืกืื ืืืืื ืืื ืืึทืืืึทืืืงื ืงืื ืขืงืกืขืจืคึผืฅ.
ืืื ื webrtcvad ืืื ืึท ืืึทืืจืขื ืขืฆืื ื ืืืืฃ ืื ืืจืืืก ืคืื ืื ืกืึทืคึผืืืื ืคืจืึทืืืขื ื - ืขืก ืืืื ืืืื ืืืืึทื ืฆื 10/20/30ms, ืืื ืื ืืจืืื ืื ื ืคืื ืื ืืึธืืขื ืคึฟืึทืจ ืืขืจืงืขื ืขื ืืืึธืืฉืึทื ื (ืืื ืืืจ ืืืขืื ืืขืจื ืขื ืฉืคึผืขืืขืจ) ืืื ืืืจืืืขืงืึธืื ืืืืฃ ืึท 48kHz ืืึทืืึทืกืขื, ืืืจ ืืืขืื ืืึทืคึผื ืืฉืึทื ืืงืก ืคืื ืืจืืืก 48000 ร 20 ืืก / 1000 ร 1 (ืืึธื ืึธ) = 960 ืืืืขืก. 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 = []
ืขืก ืืื ืฆืืื ืฆื ืงืืงื ืคึฟืึทืจ ืคืึทืจ-ืืจืืื ื ืืึธืืขืืก ืืื ืื ืฆืืืืจ ืคืขืื, ืืืื ืฆื ืืืืืื, Google, ืึธืืขืจ ืืขืืขื ืงืขื ืึทื ืืืจ ืืึธืื ืึท ืืึทืืจืขื ืขืฆืื ื ืืืืฃ ืื ืึทืจืงืึทืืขืงืืฉืขืจ ืืขื ืืฆื. ืืึธืก ืืื ืึท ืืึทื ืฅ ืฉืืืขืจ ืืืื, ืืืืึทื ืืืจ ืืึธืื ืฆื ืคึผืจืืืืจื ืื ืืึธืืขืืก ืืืืฃ ืืืื ืึทืจืืึทื ืฉืจืืึทื ืืึทืื, ืืื ืืื ืึทืืืฉืึทื, ืืขืจ ืืื ืฆื ืื ืื ืขืจืืขื ืคึฟืึธืจืืึทื ืคืื OpenVINO - IR (ืื ืืขืจืืขืืืึทืืข ืจืขืคึผืจืขืกืขื ืืึทืืืึธื). ืืืจ ืืขืคืจืืืื ืืืขืื 5-7 ืคืึทืจืฉืืืขื ืข ืกืึทืืืฉืึทื ื ืคืื ืืืืืื, ืืื ืืืื ืืขืจ ืืึธืืขื ืคึฟืึทืจ ืืขืจืงืขื ืื ื ืคืื ืืืึธืืฉืึทื ื ืืขืืจืืขื ืืื, ืืื ืงืื ืืขืจืงืขื ืื ื ืืืจ ืืึธืื ืฆื ืืืึทืจืื ืืขืจ - ืืื ื ืืฆื ืืขืจ ืงืึธืืคึผืืืฆืืจื ืึทืจืงืึทืืขืงืืฉืขืจื.
ืืืจ ืคืึธืงืืก ืืืืฃ ืื ืคืืืืขื ืืข:
- ืืืึธืืฉืึทื ื ืคืื ืื ืงืื -
https://github.com/alexmuhr/Voice_Emotion
ืขืก ืึทืจืืขื ืืืื ืื ืคืืืืขื ืืข ืคึผืจืื ืฆืืคึผ: ืึทืืืืึธ ืืื ืฉื ืืึทืื ืืื ืคึผืึทืกืืืืฉืื ืคืื ืึท ืืืืขืจ ืืจืืืก, ืคึฟืึทืจ ืืขืืขืจ ืคืื ืื ืคึผืึทืกืืืืฉืื ืืืจ ืืืืกืงืืืึทืืMFCC ืืื ืืขืจื ืึธื ืคืึธืจืืืืื ืืื ืืื ืึทืจืืึทื ืฉืจืืึทื ืฆื CNN - ืงืื ืืขืจืงืขื ืื ื -
https://github.com/linhdvu14/vggvox-speaker-identification
ืืึธ, ืึทื ืฉืืึธื ืคืื MFCC, ืืืจ ืึทืจืืขืื ืืื ืึท ืกืคึผืขืงืืจืึธืืจืึทื, ื ืึธื FFT ืืืจ ืงืึธืจืืขื ืื ืกืืื ืึทื ืฆื CNN, ืืื ืืื ืื ืจืขืืืืืึทื ืืืจ ืืึทืงืืืขื ืึท ืืืขืงืืึธืจ ืคืึทืจืืจืขืืื ื ืคืื ืื ืงืื.
ืืืืึทืืขืจ ืืืจ ืืืขืื ืจืขืื ืืืขืื ืงืึทื ืืืขืจืืื ื ืืึธืืขืืก, ืกืืึทืจืืื ื ืืื ืืขืึธืจืืข. OpenVINO ืืืื ืขืืืขืืข ืืึทืืืฉืืื:
- ืขืคึฟื ืืึธืืขื ืืึธืึธืืึธืืืฉืขืจ ืืึธืจืื, ืืึธืืขืืก ืคืื ืืืึธืก ืงืขื ืขื ืืืื ืืขืืืืื ื ืืื ืึทืจืืึทื ืืขืจืขืื ื ืืื ืืืื ืคึผืจืึธืืืงื
- ืืึธืืขื ืึธืคึผืืืืืืขืจ, ืืึทื ืง ืฆื ืืืึธืก ืืืจ ืงืขื ืขื ืืขืจ ืึท ืืึธืืขื ืคืื ืคืึทืจืฉืืื ืคืจืืืืืืขืจืง ืคึฟืึธืจืืึทืืืจืื ืืขื (ืืขื ืกืึธืจืคืืึธืื, ONNX ืขืืง) ืืื ืื ืื ืืขืจืืืืืื ืจืขืคึผืจืขืกืขื ืืึทืืืึธื ืคึฟืึธืจืืึทื, ืืื ืืืึธืก ืืืจ ืืืขืื ืึทืจืืขืื ืืืืึทืืขืจ
- ืื ืคืขื ืกืข ืขื ืืื ืข ืึทืืึทืื ืืืจ ืฆื ืืืืคื ืืึธืืขืืก ืืื IR ืคึฟืึธืจืืึทื ืืืืฃ ืื ืืขื ืคึผืจืึทืกืขืกืขืจื, ืืืจืืึทื ืืฉืืคึผืก ืืื ื ืขืืจืึทื ืงืึทืืคึผืืืืข ืกืืืง ืึทืงืกืขืืขืจืืืืขืจื
- ืื ืืขืจืกื ืขืคืขืงืืืื ืืืขืจืกืืข ืคืื โโโโOpenCV (ืืื Inference Engine ืฉืืืฆื)
ืืขืืขืจ ืืึธืืขื ืืื ืืจ ืคึฟืึธืจืืึทื ืืื ืืืกืงืจืืืื ืืืจื ืฆืืืื ืืขืงืขืก: .ืงืกืื ืืื .ืืื.
ืืึธืืขืืก ืืขื ืขื ืงืึธื ืืืขืจืืขื ืฆื 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, ืึธืืขืจ ืืืจ ืืึธืื ื ืืฉื ืืจืึธืื ืึทืืื ืืืืึทื ืืื ืคืฉืื ืคืึทืจืคืขืกืืืงื ืขืก ืคึฟืึทืจ ืืืื ืขืจ ืคืื ืื ืืึธืืขืืก.
ืืขืจื ืึธื, ืืึธืืืจ ืคึผืจืืืืจื ืฆื ืืึธืื ืื ืฉืืื ืงืึธื ืืืขืจืืขื ืืึธืืขื ืืื ืืจ ืคึฟืึธืจืืึทื ืืืจื ืื DNN ืืึธืืืืข ืืื 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 s), ืืืจ ืืขืจ ืืขืืขืจ ืคืื ืื ืคึฟืขื ืฆืืขืจ ืืื MFCC, ืืืึธืก ืืืจ ืงืึธืจืืขื ืฆื ืื ืืจืื:
emotionsNet.setInput(MFCC_from_window) result = emotionsNet.forward()
ืืขืจื ืึธื, ืืึธืื ืืื ืื ื ืขืืขื ืื ืืขืจืกื ืคึผืจืึธืกื ืงืืึทืก ืคึฟืึทืจ ืึทืืข ืคึฟืขื ืฆืืขืจ. ื ืคึผืฉืื ืืืืืื ื, ืึธืืขืจ ืคึฟืึทืจ ืึท ืืึทืงืึทืืืึธื ืืืจ ืืึธื ื ืื ืืึทืจืคึฟื ืฆื ืงืืืขื ืึทืจืืืฃ ืืื ืขืคึผืขืก ืฆื ืึทืืกืืจืึทืงื, ื ืึธืจ ืืืื ืืืจ ืืึธื ืฆืืื. ืืืจ ืืึธืื ื ืึธื ืึท ืคึผืืึทืฅ ืคืื ืึทืจืืขื ืฆื ืืึธื, ืึทืืื ืืึธืื ืืื ืื ืืึทื ืืืืฃ - ืืืจ ืืืขืื ืืึทื ืืืขื ืืื ืงืื ืืขืจืงืขื ืื ื. ืขืก ืืื ื ืืืืืง ืฆื ืืึทืื ืึท ืกืึธืจื ืคืื ืืึทืืึทืืืืก ืืื ืืืึธืก ืกืคึผืขืงืืจืึธืืจืึทืื ืคืื ืคืึทืจ-ืจืขืงืึธืจืืขื ืฉืืืืขื ืืืึธืื ืืืื ืกืืึธืจื. ืืื ื ืขืก ืืื ืึท ืืืกื ืฆืืื ืืื ืงืก, ืืืจ ืืืขืื ืืึทืืื ืืขื ืึทืจืืืกืืขืื ืืื ืืขืกืืขืจ ืืืจ ืงืขื ืขื.
ื ืึทืืขืื, ืืืจ ืืึทืื ืึท ืฉืจืืคื ืคึฟืึทืจ ืจืขืงืึธืจืืื ื ืึท ืงืื ืขืงืกืขืจืคึผื (ืขืก ืึทืจืืขื ืืื ืื ืืขืืืข ืืืขื ืืื ืืืกืงืจืืืื ืืืืื, ื ืึธืจ ืืืขื ืื ืืขืจืึทืคึผืืื ืคืื ืื ืงืืึทืืืืึทืืืจ ืขืก ืืืขื ืจืึทืืขืืืขื ืื ืงืื ืฆื ืึท ืืขืงืข).
ืืืืืจ ืคืจืืืืจื:
python3 voice_db/record_voice.py test.wav
ืืืจ ืจืขืงืึธืจืืืจื ืื ืงืืืืช ืคืื ืขืืืขืืข ืืขื ืืฉื (ืืื ืืื ืืืขืจ ืคืึทื, ืืจืื ืืึทื ืฉืึทืคึฟื ืืืืืืืืขืจ)
ืืขืจื ืึธื, ืคึฟืึทืจ ืืขืืขืจ ืจืขืงืึธืจืืขื ืงืื, ืืืจ ืืืจืืคืืจื ืึท ืฉื ืขื ืคืืจืขืจ ืืืขืจืืึทืื, ืืึทืงืืืขื ืึท ืกืคึผืขืงืืจืึธืืจืึทื ืืื ืจืึทืืขืืืขื ืขืก ืืื ืึท ื ืึทืืคึผื ืืขื ืืข (.ื ืคึผื):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, ืืืืืจื ืืืืฃ ืืืขืืกืึธืงืงืขื ืืขืื ืึธืืึธืืืข (ืืืืคึผ ืืืืขืจ tcp ืคึผืจืึธืืึธืงืึธื).
ืืขืจ ืขืจืฉืืขืจ ืืื ืข ืืื ืฆื ืืึทืงืืืขื ืคึผืจืึทืกืขืกื ืืื ืคึฟืึธืจืืึทืฆืืข ืคืื โโืืึทืืขื ืข, ืืึธืก ืืืืกื, ืคึผืจืืืืงืืขืจื ืคึผืึทืงื ืืื ืืืฉืกืึธื, ืืืึธืก ืืขื ืขื ืืขืจืืืขืืืขื ืืื ืื ืืึทืืึทืืืืก ืืึทืื ืืืขื ืืืจื ืืืืขืจ ืจืืืืข ืึทืืื ืึทื ืกืืึทืืืกืืืง ืงืขื ืขื ืืืื ืืืฉืขื ืขืจืืืืึทื ืืืขืื ืืขืจ ืืึทื ืืฆืขืจ ืก ืขืืึธืฆืืึธื ืขื ืืื ืืขืจืืจืื ื ืคึฟืึทืจ ืื ืฆืืื. ืืขืจ ืคึผืึทืงืึทื ืืื ืืขืจื ืึธื ืืขืฉืืงื ืฆื ืื ืคืจืึธื ืืขื ื, ืืืึธืก ื ืืฆื ืึทืืึธื ืขืืขื ื ืืื ื ืขืื ืคึผืึทืงืืฅ ืคึฟืื ืื ืืืขืืกืึธืงืงืขื ืขื ืืคึผืืื ื. ืืขืจ ืืื ืฆืขืจ ืืึทืงืขื ื ืืขืงืึทื ืืืึทื ืืื ืืขืืืื ืืื ืื ืืึธืืึทื ื ืฉืคึผืจืึทื; ืขืก ืืื ืืขืืืขื ืืืืกืืขืจืืืืืื ืืืืึทื ืขืก ืืื ืืขืืื ื ืคึผืึทืกืืง ืคึฟืึทืจ ืืืกืื ืืงืจืึทื ืึทืก ืืึทืกืงืก, ืืืึธืก ืืึธืจืึธืืืื ื ืฉืขืคึผื ืืขืืื ื.
ืืืขื ืึทืงืกืขืกืื ื ืื ืขื ืืคึผืืื ื, ืืขืจ ืืึทื ืืฆืขืจ ืืื ืจืขืืืกืืจืืจื ืืื ืืจืืื ืืื ืื ืกืืจืืงืืืจ, ืืื ืืืื ืึธื ืืึธื ืืื ืืืงืืืขื. ืืืืืข ืืขืจ ืืึทื ืืฆืขืจ ืืื ืืขืจ ืึธื ืืึธื ืืขื ืขื ืืจืืื ืืื ืึท ืคึผืจืึธืกื ืืึทื, ืคืื ืืืึธืก ืึทืจืืืงืืขื ืืขื ืขื ืฉืืื ืืขืฉืืงื ืืืืึทืืขืจ (ืฆื ืื ืึทืืึธื ืขื ื ืคืจืึธื ื), ืืื ืืืื ืืขืจ ืืึทื ืืฆืขืจ ืงืืึธืืืื ืื ืงืฉืจ (ืืึทืืขื ืข ืึธืืขืจ ืคืจืึธื ื), ืืืื ืึทืืึธื ืขืืขื ื ืืื ืงืึทื ืกืึทืื ืืื ืขืจ ืืื ืึทืืืขืงืืขื ืืืขื ืคืื ืื ืืึทื.
ืืืจ ืืืืจืื ืคึฟืึทืจ ืึท ืงืฉืจ ืคืื ืื ืฆืืจืืงืคืจืึธื ื-ืขื ื ืืื ืึท ืืืขื ืึทืคึผืืึทืงืืืฉืึทื ืืขืฉืจืืื ืืื ืืืฉืึทืืืึทืกืงืจืืคึผื ื ืืฆื ืื ืจืขืึทืงื ืืืืืืึธืืขืง ืฆื ืคืึทืจืืืืขืจื ืืื ืคืึทืจืคึผืึธืฉืขืืขืจื ืื ืึทื ืืืืืงืืื ื ืคึผืจืึธืฆืขืก. ืืขืจ ืฆืื ืคืื ืืขื ืึทืคึผืืึทืงืืืฉืึทื ืืื ืฆื ืืืืืฉืืืึทืืืื ืืึทืื ืืืงืืืขื ืืื ืึทืืืขืจืืืึทืื ืคืืืกื ืืืง ืืืืฃ ืื ืฆืืจืืง-ืกืืฃ ืืืึทื ืืื ืืืืึทื ืืืืฃ ืื Raspberry Pi. ืืขืจ ืืืึทื ืืื ืืืคึผืืึทืืขื ืึทื ืกืขืงืฉืึทื ืึทื ืจืืืื ื ืืื ืจืขืึทืืืจื ืจืึทืืืขืจ, ืึธืืขืจ ืืขืจ ืืืืคึผื ืืืึทื ืคืื ืืื ืืขืจืขืก ืืื ืืขืจ ืืืืคึผื ืืืึทื, ืืื ืึท ืงืขืกืืืืขืจืืืง ืืืึทื ืคืื ืืึทืื ืืื ืืืงืืืขื ืืื ืคืึทืงืืืฉ ืฆืืื ืคึฟืื ืื ืกืขืจืืืขืจ ื ืืฆื WebSocket ืืขืื ืึธืืึธืืืข. Raspberry Pi ืืืืขืงืฅ ืึท ืงืื, ืืืฉืืืกื ืฆื ืขืก ืืขืืขืจื ืฆื ืึท ืกืคึผืขืฆืืคืืฉ ืืขื ืืฉ ืคืื ืื ืจืขืืืกืืจืืจื ืืึทืืึทืืืืก, ืืื ืกืขื ืื ืึท ืืึทืฉืืึธืขืก ืจืฉืืื ืฆื ืืขื ืงืืืขื ื. ืืขืจ ืงืืืขื ื ืืืกืคึผืืืื ืื ืืขืฆืืข ืืึทืืืึทืืืง ืืึทืื, ืืืกืคึผืืืื ืื ืึทืืืึทืืึทืจ ืคืื ืืขืจ ืืขื ืืฉ ืืืึธืก ืจืืึฟ ืืกืชึผืื ืืขืจืขืื ืืื ืื ืืืงืจืึธืคืึธื, ืืื ืืขืืื ื ืืื ืื ืขืืึธืฆืืข ืืื ืืืึธืก ืขืจ ืคึผืจืึทื ืึทืื ืกืื ืื ืืืขืจืืขืจ.
ืืืื ืืืึทื ืืื ืืขืจืืืึทื ืืืงื ืคึฟืึธืจืืืกืืึธืืืกืึธืฃ
ืขืก ืืื ืืขืืืขื ื ืื ืืขืืืขื ืฆื ืคืึทืจืขื ืืืงื ืึทืืฅ ืืื ืคึผืืึทื ื ืขื, ืืืจ ืคืฉืื ืืึธืื ื ืืฉื ืืึธืื ืฆืืึทื, ืึทืืื ืื ืืืืคึผื ืืึธืคืขื ืื ื ืืื ืืขืืืขื ืืื ืื ืืขืืึธ, ืึทื ืึทืืฅ ืืืึธืื ืึทืจืืขื. ืืื ืืขืจ ืคึผืจืขืืขื ืืืจืื ื ืืื ืืขืจืขืื ืืืขืื ืืื ืึทืืฅ ืึทืจืืขื, ืืืึธืก ืืึธืืขืืก ืืื ืืขื ืืืขื, ืืืึธืก ืคึผืจืึธืืืขืืก ืืื ืืขืคึผืืึธื ืืขืจื. ืืขืจื ืึธื ืืื ืืขืืืขื ืืขืจ ืืขืืึธ ืืืื - ืขืงืกืคึผืขืจืฅ ืืขืืื ืืขื ืึทืจืื ืื ืฆืืืขืจ ืืื ืืจืึทืค - ืกืืจ ืืื ืึทืคึผืจืึธืืืฉื ืืขืืขืจ ืืึทื ืฉืึทืคึฟื ืฆื ืงืืงื ืืื ืื ืึทืจืืขื ืคึผืจืึธืืืึทืืืืคึผ. ืืื ืืึธืื ืืื ืื ืืืื ืืขืคืจืขืื ืฉืืืืช, ืึทืืขืืขื ืืขืขื ืืคืขืจื ืืืืขืจ ืืืื, ืืื ืืื ืงืก ืื ืืืขื ืืืืฃ ืื ืืึทืคึผืืึทืคึผ, ืืื ืึทืืฅ ืืึทืงืข ืืขืืจืืขื ืืื ืืขืจืืืึทืจื.
ืืึธืื ืืืจ ืืึธื ืึทื ืื ืืึทื ืฅ ืคึผืจืืึทื ืคืื ืืื ืืืขืจ ืืืืืื ื ืืื ืืขืืืขื $ 150:
- Raspberry Pi 3 ~ $35
- Google AIY Voice Bonnet (ืืืจ ืงืขื ืขื ื ืขืืขื ืึท ืจืขืื ืขืจ ืึธืคึผืฆืึธื) ~ 15 $
- ืื ืืขื ื ืงืก 2 ~ 100 $
ืืื ืฆื ืคึฟืึทืจืืขืกืขืจื:
- ื ืืฆื ืจืขืืืกืืจืึทืฆืืข ืคึฟืื ืืขื ืงืืืขื ื - ืคืจืขืื ืฆื ืืืืขื ืขื ืืขื ืืขืงืกื ืืืึธืก ืืื ืืืฉืขื ืขืจืืืืึทื ืจืึทื ืืึทืืื
- ืืืื ืึท ืืืกื ืืขืจ ืืึธืืขืืก: ืืืจ ืงืขื ืขื ืืึทืฉืืืืขื ืืืฉืขื ืืขืจ ืืื ืขืืืขืจ ืืืจื ืงืื
- ืืึทืืื ืืขืจ ืกืืืืึทืืืืื ืืึทืกืื ืกืึทืื ืืื ื ืงืืืืช (ืืืึทืจืืืึทืืืึธื)
ืจืืคึผืึทืืึทืืึธืจื:
https://github.com/vladimirwest/OpenEMO
ืืื ืึธืืขืจ ืฆืืคืจืืื ืืืจ ืืขื ืขืืฆืื ืกืืฃ, ืืื ืืืึธืื ืืื ืฆื ืืึธืื ืึท ืืึทื ืง ืฆื ืื ืึธืจืืึทื ืืืืขืจื ืืื ืคึผืึทืจืืืกืึทืคึผืึทื ืฅ. ืฆืืืืฉื ืื ืคึผืจืึทืืืฉืขืงืก ืคืื ืื ืืขืจืข ืืืื, ืืืจ ืคึผืขืจืกื ืึทืื ืืืืงื ืื ืืืืืื ื ืคึฟืึทืจ ืืึธื ืืืึธืจืื ื ืคืจืื ืคึผืึทืจืงืื ื ืกืคึผืืืกืื. ืคึฟืึทืจ ืืื ืื, ืืึธืก ืืื ืืขืืืขื ืึท ืืืืื ืืขืจืคืึทืจืื ื ืคืื ืืืืื ืืื ืื ืคึผืจืึธืืืงื ืืื ืึทื ืืืืืงืืื ื. ืืื ืืึธืคึฟื ืึทื ืืขืจ ืืื ืืขืจ ืืฉืืงืึทืืืข ืืขืฉืขืขื ืืฉื ืืืขื ืืืื ืืขืืืืื ืืื ืื ืืงืืืืช, ืึทืจืืึทื ืืขืจืขืื ื ืืืืฃ ืึทื ืืขืืขืก.
ืืงืืจ: www.habr.com