30 Π½ΠΎΠ΅ΠΌΠ²ΡΠΈ - 1 Π΄Π΅ΠΊΠ΅ΠΌΠ²ΡΠΈ Π² ΠΠΈΠΆΠ½ΠΈ ΠΠΎΠ²Π³ΠΎΡΠΎΠ΄ ΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ΠΌ ΠΊΠ°ΠΊ ΡΡΠ·Π΄Π°Π΄ΠΎΡ ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠ°, Ρ ΠΊΠΎΠΉΡΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ° Π·Π°Π΅Ρ ΠΌΠ΅ ΠΏΡΡΠ²ΠΎ ΠΌΡΡΡΠΎ.
Π Ρ Π°ΠΊΠ°ΡΠΎΠ½Π° ΡΡΠ°ΡΡΠ²Π°Ρ Π° Π½Π°Π΄ 10 ΠΎΡΠ±ΠΎΡΠ°. Π₯ΡΠ±Π°Π²ΠΎ Π΅, ΡΠ΅ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΡΡ ΠΈΠ΄Π²Π°Ρ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΡΠ΅Π³ΠΈΠΎΠ½ΠΈ. ΠΡΡΡΠΎΡΠΎ Π½Π° Ρ Π°ΠΊΠ°ΡΠΎΠ½Π° Π±Π΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΡΡ βΠΡΠ΅ΠΌΠ»ΠΈΠ½ΡΠΊΠΈ Π½Π° ΠΠΎΡΠ°ΠΉΠ½β, ΠΊΡΠ΄Π΅ΡΠΎ Π²ΡΡΡΠ΅ Π±ΡΡ Π° ΠΎΠΊΠ°ΡΠ΅Π½ΠΈ Π΄ΡΠ΅Π²Π½ΠΈ ΡΠ½ΠΈΠΌΠΊΠΈ Π½Π° ΠΠΈΠΆΠ½ΠΈ ΠΠΎΠ²Π³ΠΎΡΠΎΠ΄ Π² Π°Π½ΡΡΡΠ°ΠΆ! (ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌ Π²ΠΈ, ΡΠ΅ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅Π½ΡΡΠ°Π»Π½ΠΈΡΡ ΠΎΡΠΈΡ Π½Π° Intel ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² ΠΠΈΠΆΠ½ΠΈ ΠΠΎΠ²Π³ΠΎΡΠΎΠ΄). ΠΠ° ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π±ΡΡ Π° Π΄Π°Π΄Π΅Π½ΠΈ 26 ΡΠ°ΡΠ° Π΄Π° Π½Π°ΠΏΠΈΡΠ°Ρ ΠΊΠΎΠ΄, Π° Π½Π°ΠΊΡΠ°Ρ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡ ΡΠ²ΠΎΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ΄Π΅Π»Π½ΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ Π±Π΅ΡΠ΅ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° Π΄Π΅ΠΌΠΎ ΡΠ΅ΡΠΈΡ, Π·Π° Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΡΠ΅, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΠΏΠ»Π°Π½ΠΈΡΠ°Π½ΠΎ Π΅ ΡΠ΅Π°Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΎ ΠΈ Π½Π΅ ΠΎΡΡΠ°Π²Π°Ρ ΠΈΠ΄Π΅ΠΈ Π² ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡΡΠ°. Π‘ΡΠΎΠΊΠΈ, Π·Π°ΠΊΡΡΠΊΠΈ, Ρ ΡΠ°Π½Π°, Π²ΡΠΈΡΠΊΠΎ ΡΡΡΠΎ Π±Π΅ΡΠ΅ ΡΠ°ΠΌ!
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅, Intel ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΊΠ°ΡΠΎ ΠΎΠΏΡΠΈΡ ΠΊΠ°ΠΌΠ΅ΡΠΈ, Raspberry PI, Neural Compute Stick 2.
ΠΠ·Π±ΠΎΡ Π½Π° Π·Π°Π΄Π°ΡΠ°
ΠΠ΄Π½Π° ΠΎΡ Π½Π°ΠΉ-ΡΡΡΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΡΡΠΈ ΠΎΡ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ°ΡΠ° Π·Π° Ρ Π°ΠΊΠ°ΡΠΎΠ½ Π² ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Π° ΡΠΎΡΠΌΠ° Π΅ ΠΈΠ·Π±ΠΎΡΡΡ Π½Π° ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°ΡΠ΅Π»ΡΡΠ²ΠΎ. ΠΠ΅Π΄Π½Π°Π³Π° ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΌΠΈΡΠ»ΠΈΠΌ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ Π±Π΅ΡΠ΅ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π² ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΊΠ°Π·Π²Π°ΡΠ΅, ΡΠ΅ ΡΠΎΠ²Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΠ΅ Π΄ΠΎΡΠ»ΠΎ.
ΠΠ°ΡΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°
- ΠΠ° ΡΠ΅ΠΎΡΠΈΡ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Π½ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ, ΠΊΠΎΠΉΡΠΎ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΊΠ°ΠΊΡΠΎ Π²ΡΡΡ Ρ Π·Π²ΡΠΊ, ΡΠ°ΠΊΠ° ΠΈ Π²ΡΡΡ Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π΄Π°Π΄Π΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠΎΡΠ½ΠΎΡΡΡΠ°.
- ΠΠ°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΈΠΌΠ°Ρ ΡΠ΅ΡΠ΅Π½ ΡΠ³ΡΠ» Π½Π° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡ; Π·Π° ΠΏΠΎΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π³ΠΎΠ»ΡΠΌΠ° ΠΏΠ»ΠΎΡ ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΅Π΄Π½Π° ΠΊΠ°ΠΌΠ΅ΡΠ°; Π·Π²ΡΠΊΡΡ Π½ΡΠΌΠ° ΡΠ°ΠΊΠΎΠ²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅.
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π²ΠΈΠ΅ΠΌ ΠΈΠ΄Π΅ΡΡΠ°: Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ Π·Π° ΠΎΡΠ½ΠΎΠ²Π° ΠΈΠ΄Π΅ΡΡΠ° Π·Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ° Π½Π° Π΄ΡΠ΅Π±Π½ΠΎ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΌΠ΅ΡΠΈΡΠ΅ ΡΠ΄ΠΎΠ²Π»Π΅ΡΠ²ΠΎΡΠ΅Π½ΠΎΡΡΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ Π½Π° ΠΊΠ°ΡΠ°ΡΠ° Π² ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°. ΠΠΊΠΎ Π½ΡΠΊΠΎΠΉ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ Π΅ Π½Π΅Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ ΠΎΡ ΠΎΠ±ΡΠ»ΡΠΆΠ²Π°Π½Π΅ΡΠΎ ΠΈ Π·Π°ΠΏΠΎΡΠ½Π΅ Π΄Π° ΠΏΠΎΠ²ΠΈΡΠ°Π²Π° ΡΠΎΠ½, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΡΠ΅ ΠΎΠ±Π°Π΄ΠΈΡΠ΅ Π½Π° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ° Π·Π° ΠΏΠΎΠΌΠΎΡ.
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΡΠ±Π²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° ΡΠΎΠ²Π΅ΡΠΊΠΈ Π³Π»Π°Ρ, ΡΠΎΠ²Π° ΡΠ΅ Π½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈ Π΄Π° ΡΠ°Π·Π³ΡΠ°Π½ΠΈΡΠΈΠΌ ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΠΌΠ°Π³Π°Π·ΠΈΠ½Π° ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈΡΠ΅ ΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΠΎΠ²Π΅ΠΊ. Π, ΠΎΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ»ΡΠΆΠΈΡΠ΅Π»ΠΈ Π½Π° ΠΌΠ°Π³Π°Π·ΠΈΠ½Π°, Π΄Π° ΡΠ΅ ΠΎΡΠ΅Π½ΠΈ Π°ΡΠΌΠΎΡΡΠ΅ΡΠ°ΡΠ° Π² Π΅ΠΊΠΈΠΏΠ°, Π·Π²ΡΡΠΈ Π΄ΠΎΠ±ΡΠ΅!
ΠΠΈΠ΅ ΡΠΎΡΠΌΡΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅:
- ΠΠ°Π»ΡΠΊ ΡΠ°Π·ΠΌΠ΅Ρ Π½Π° ΡΠ΅Π»Π΅Π²ΠΎΡΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
- ΠΠΏΠ΅ΡΠ°ΡΠΈΡ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅
- ΠΠΈΡΠΊΠ° ΡΠ΅Π½Π°
- ΠΠ΅ΡΠ½Π° ΠΌΠ°ΡΠ°Π±ΠΈΡΡΠ΅ΠΌΠΎΡΡ
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅ Raspberry Pi 3 c ΠΊΠ°ΡΠΎ ΡΠ΅Π»Π΅Π²ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ
Π’ΡΠΊ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ Π΅Π΄Π½Π° Π²Π°ΠΆΠ½Π° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° NCS - ΡΡ ΡΠ°Π±ΠΎΡΠΈ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ ΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ CNN Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ, Π½ΠΎ Π°ΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΠΌΠΎΠ΄Π΅Π» Ρ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΡΠ»ΠΎΠ΅Π²Π΅ Π²ΡΡΡ Ρ Π½Π΅Π³ΠΎ, ΡΠΎΠ³Π°Π²Π° ΠΎΡΠ°ΠΊΠ²Π°ΠΉΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π½Π° Π½ΠΈΡΠΊΠΎ Π½ΠΈΠ²ΠΎ.
ΠΠΌΠ° ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎ ΠΌΠ°Π»ΠΊΠΎ Π½Π΅ΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅: ΡΡΡΠ±Π²Π° Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΠΌΠΈΠΊΡΠΎΡΠΎΠ½. ΠΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ USB ΠΌΠΈΠΊΡΠΎΡΠΎΠ½ ΡΠ΅ ΡΠ²ΡΡΡΠΈ ΡΠ°Π±ΠΎΡΠ°, Π½ΠΎ Π½ΡΠΌΠ° Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΄ΠΎΠ±ΡΠ΅ Π·Π°Π΅Π΄Π½ΠΎ Ρ 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
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ 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/30ms, Π° ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΌΠΎΠ΄Π΅Π»Π° Π·Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π΅ΠΌΠΎΡΠΈΠΈ (ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ Π½Π°ΡΡΠΈΠΌ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ) Π΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½ΠΎ Π½Π° 48kHz Π½Π°Π±ΠΎΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ, ΡΠ΅ ΡΠ»Π°Π²ΡΠ½Π΅ Π½Π° ΠΏΠ°ΡΡΠ΅ΡΠ° Ρ ΡΠ°Π·ΠΌΠ΅Ρ 48000Γ20ms/1000Γ1(ΠΌΠΎΠ½ΠΎ)=960 Π±Π°ΠΉΡΠ°. 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 (Intermediate Representation). ΠΠΏΠΈΡΠ°Ρ ΠΌΠ΅ ΠΎΠΊΠΎΠ»ΠΎ 5-7 ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡ github ΠΈ Π°ΠΊΠΎ ΠΌΠΎΠ΄Π΅Π»ΡΡ Π·Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° Π΅ΠΌΠΎΡΠΈΠΈ ΡΠ°Π±ΠΎΡΠΈ Π²Π΅Π΄Π½Π°Π³Π°, ΡΠΎΠ³Π°Π²Π° Ρ Π³Π»Π°ΡΠΎΠ²ΠΎΡΠΎ ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠ°ΠΊΠ°ΠΌΠ΅ ΠΏΠΎ-Π΄ΡΠ»Π³ΠΎ - ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠΈ.
ΠΠΈΠ΅ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ°ΠΌΠ΅ Π²ΡΡΡ Ρ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
- ΠΠΌΠΎΡΠΈΠΈ ΠΎΡ Π³Π»Π°ΡΠ° -
https://github.com/alexmuhr/Voice_Emotion
Π Π°Π±ΠΎΡΠΈ Π½Π° ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΡΠΈΠ½ΡΠΈΠΏ: Π°ΡΠ΄ΠΈΠΎΡΠΎ ΡΠ΅ Π½Π°ΡΡΠ·Π²Π° Π½Π° ΠΏΠ°ΡΠ°ΠΆΠΈ Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΡΠ°Π·ΠΌΠ΅Ρ, Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΏΠ°ΡΠ°ΠΆΠΈ Π½ΠΈΠ΅ ΠΈΠ·Π±ΠΈΡΠ°ΠΌΠ΅MFCC ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π³ΠΈ ΠΏΡΠ΅Π΄Π°ΠΉΡΠ΅ ΠΊΠ°ΡΠΎ Π²Ρ ΠΎΠ΄Π½ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° CNN - ΠΠ»Π°ΡΠΎΠ²ΠΎ ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ -
https://github.com/linhdvu14/vggvox-speaker-identification
Π’ΡΠΊ Π²ΠΌΠ΅ΡΡΠΎ MFCC ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΡΡ ΡΠΏΠ΅ΠΊΡΡΠΎΠ³ΡΠ°ΠΌΠ°, ΡΠ»Π΅Π΄ FFT ΠΏΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΠΈΠ³Π½Π°Π»Π° ΠΊΡΠΌ CNN, ΠΊΡΠ΄Π΅ΡΠΎ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π²Π΅ΠΊΡΠΎΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° Π³Π»Π°ΡΠ°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ Π·Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄Π΅Π»ΠΈ, ΠΊΠ°ΡΠΎ Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΡΠ΅ΠΎΡΠΈΡΡΠ°. OpenVINO Π²ΠΊΠ»ΡΡΠ²Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠΎΠ΄ΡΠ»Π°:
- ΠΡΠ²ΠΎΡΠ΅ΡΠ΅ Model Zoo, ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΈ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π²ΡΠ² Π²Π°ΡΠΈΡ ΠΏΡΠΎΠ΄ΡΠΊΡ
- Model Optimzer, Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΌΠΎΠ΄Π΅Π» ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠ°ΠΌΠΊΠΎΠ²ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈ (Tensorflow, ONNX ΠΈ Ρ.Π½.) Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ 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 ΠΈ Π΄Π° Π³ΠΎ ΠΏΡΠ΅ΠΏΡΠ°ΡΠΈΠΌ ΠΊΡΠΌ Π½Π΅Π³ΠΎ.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 s), ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΠΌΠ΅ Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠ·ΠΎΡΡΠΈ Π² 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 ΠΏΡΠ΅Π· tcp ΠΏΡΠΎΡΠΎΠΊΠΎΠ»).
ΠΡΡΠ²ΠΈΡΡ Π΅ΡΠ°ΠΏ Π΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ raspberry, ΡΠΎΠ΅ΡΡ ΠΏΡΠ΅Π΄ΠΈΠΊΡΠΎΡΠΈ, ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½ΠΈ Π² json, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ²Π°Ρ Π² Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ ΠΏΠΎ ΡΡΠ΅Π΄Π°ΡΠ° Π½Π° ΡΡΡ Π½ΠΎΡΠΎ ΠΏΡΡΡΠ²Π°Π½Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° Π·Π° Π΅ΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΡΠΎΠ½ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π·Π° ΠΏΠ΅ΡΠΈΠΎΠ΄Π°. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠΎΠ·ΠΈ ΠΏΠ°ΠΊΠ΅Ρ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π΄ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° Π½Π° websocket. Π¦Π΅Π»ΠΈΡΡ Π±Π΅ΠΊΠ΅Π½Π΄ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ Π΅ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ Π½Π° Π΅Π·ΠΈΠΊΠ° golang; ΡΠΎΠΉ Π΅ ΠΈΠ·Π±ΡΠ°Π½, Π·Π°ΡΠΎΡΠΎ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΠΈ Π·Π°Π΄Π°ΡΠΈ, Ρ ΠΊΠΎΠΈΡΠΎ goroutines ΡΠ΅ ΡΠΏΡΠ°Π²ΡΡ Π΄ΠΎΠ±ΡΠ΅.
ΠΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΊΡΠ°ΠΉΠ½Π°ΡΠ° ΡΠΎΡΠΊΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ° ΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π° Π² ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. Π ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ, ΠΈ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ Π²ΡΠ²Π΅ΠΆΠ΄Π°Ρ Π² ΠΎΠ±Ρ Ρ ΡΠ±, ΠΎΡ ΠΊΠΎΠΉΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΡΡΠ° Π²Π΅ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ°ΡΠ°Ρ ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ (ΠΊΡΠΌ Π°Π±ΠΎΠ½ΠΈΡΠ°Π½ΠΈΡ ΡΡΠΎΠ½Ρ), ΠΈ Π°ΠΊΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π·Π°ΡΠ²ΠΎΡΠΈ Π²ΡΡΠ·ΠΊΠ°ΡΠ° (ΠΌΠ°Π»ΠΈΠ½Π° ΠΈΠ»ΠΈ ΡΡΠΎΠ½Ρ), ΡΠΎΠ³Π°Π²Π° Π½Π΅Π³ΠΎΠ²ΠΈΡΡ Π°Π±ΠΎΠ½Π°ΠΌΠ΅Π½Ρ ΡΠ΅ Π°Π½ΡΠ»ΠΈΡΠ° ΠΈ ΡΠΎΠΉ ΡΠ΅ ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π° ΠΎΡ Π³Π»Π°Π²ΠΈΠ½Π°ΡΠ°.
Π§Π°ΠΊΠ°ΠΌΠ΅ Π²ΡΡΠ·ΠΊΠ° ΠΎΡΠ·Π°Π΄Front-end Π΅ ΡΠ΅Π± ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° JavaScript, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° React Π·Π° ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ ΠΈ ΠΎΠΏΡΠΎΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°. Π¦Π΅Π»ΡΠ° Π½Π° ΡΠΎΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Π΄Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ° Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΠΌΠΈ, ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ Π² Π·Π°Π΄Π½Π°ΡΠ° ΡΠ°ΡΡ ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π½Π° Raspberry Pi. Π‘ΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΈΠΌΠ° ΡΠ΅ΠΊΡΠΈΠΎΠ½Π½ΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·ΠΈΡΠ°Π½Π΅, ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° react-router, Π½ΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΠΈΠ½ΡΠ΅ΡΠ΅Ρ, Π΅ Π³Π»Π°Π²Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°Ρ ΠΏΠΎΡΠΎΠΊ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΎΡ ΡΡΡΠ²ΡΡΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° WebSocket. Raspberry Pi ΠΎΡΠΊΡΠΈΠ²Π° Π³Π»Π°Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ Π΄Π°Π»ΠΈ ΡΠΎΠΉ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Π»ΠΈΡΠ΅ ΠΎΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π°ΡΠ° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ° ΡΠΏΠΈΡΡΠΊ Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΠ»ΠΈΠ΅Π½ΡΡΡ ΠΏΠΎΠΊΠ°Π·Π²Π° Π½Π°ΠΉ-Π°ΠΊΡΡΠ°Π»Π½ΠΈΡΠ΅ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠΊΠ°Π·Π²Π° Π°Π²Π°ΡΠ°ΡΠ° Π½Π° ΡΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΠΉΡΠΎ Π½Π°ΠΉ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π΅ Π³ΠΎΠ²ΠΎΡΠΈΠ» Π² ΠΌΠΈΠΊΡΠΎΡΠΎΠ½Π°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΅ΠΌΠΎΡΠΈΡΡΠ°, Ρ ΠΊΠΎΡΡΠΎ ΡΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π½Π°ΡΡ Π΄ΡΠΌΠΈΡΠ΅.
ΠΠ°ΡΠ°Π»Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ° Ρ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΏΡΠΎΠ³Π½ΠΎΠ·ΠΈΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ΅ Π±Π΅ΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° Π·Π°Π²ΡΡΡΠΈΠΌ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠ°ΠΊΡΠΎ Π±Π΅ΡΠ΅ ΠΏΠ»Π°Π½ΠΈΡΠ°Π½ΠΎ, ΠΏΡΠΎΡΡΠΎ Π½ΡΠΌΠ°Ρ ΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π½Π°Π΄Π΅ΠΆΠ΄Π° Π±Π΅ΡΠ΅ Π² Π΄Π΅ΠΌΠΎΡΠΎ, ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ. Π ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ ΡΠ°Π·ΠΊΠ°Π·Π°Ρ Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Π²ΡΠΈΡΠΊΠΎ, ΠΊΠ°ΠΊΠ²ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ° Π²Π·Π΅Π»ΠΈ, ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ° ΡΡΠ΅ΡΠ½Π°Π»ΠΈ. Π‘Π»Π΅Π΄Π²Π°ΡΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠ°ΡΡ - Π΅ΠΊΡΠΏΠ΅ΡΡΠΈ ΠΎΠ±ΠΈΠΊΠ°Π»ΡΡ Π° ΡΡΠ°ΡΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π΅Π½ ΡΠ΅Π΄ ΠΈ ΡΠ΅ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ°Π²Π°Ρ Π° Π΄ΠΎ Π²ΡΠ΅ΠΊΠΈ Π΅ΠΊΠΈΠΏ, Π·Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΡΠ°Π±ΠΎΡΠ΅ΡΠΈΡ ΠΏΡΠΎΡΠΎΡΠΈΠΏ. Π’Π΅ ΡΡΡΠΎ Π½ΠΈ Π·Π°Π΄Π°Π΄ΠΎΡ Π° Π²ΡΠΏΡΠΎΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π° ΡΠ²ΠΎΡΡΠ° ΡΠ°ΡΡ, ΠΎΡΡΠ°Π²ΠΈΡ Π° ΠΌΡΠ΅ΠΆΠ°ΡΠ° Π½Π° Π»Π°ΠΏΡΠΎΠΏΠ° ΠΈ Π²ΡΠΈΡΠΊΠΎ Π½Π°ΠΈΡΡΠΈΠ½Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΏΠΎΡΠ΅Π΄ ΠΎΡΠ°ΠΊΠ²Π°Π½ΠΈΡΡΠ°.
ΠΠ΅ΠΊΠ° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ° ΡΠ΅Π½Π° Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±Π΅ΡΠ΅ $150:
- Raspberry Pi 3 ~ $35
- Google AIY Voice Bonnet (ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΠ°ΠΊΡΠ° Π·Π° Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅Π») ~ 15 $
- Intel NCS 2 ~ 100$
ΠΠ°ΠΊ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌ:
- ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΎΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° - ΠΏΠΎΠΈΡΠΊΠ°ΠΉΡΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΡΠ΅ΠΊΡΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° Π½Π° ΡΠ»ΡΡΠ°Π΅Π½ ΠΏΡΠΈΠ½ΡΠΈΠΏ
- ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠΎΠ΄Π΅Π»Π°: ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΠΏΠΎΠ»Π° ΠΈ Π²ΡΠ·ΡΠ°ΡΡΡΠ° ΠΏΠΎ Π³Π»Π°Ρ
- Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π·Π²ΡΡΠ°ΡΠΈ Π³Π»Π°ΡΠΎΠ²Π΅ (Π΄ΠΈΠ°ΡΠΈΠ·Π°ΡΠΈΡ)
Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅:
https://github.com/vladimirwest/OpenEMO
Π£ΠΌΠΎΡΠ΅Π½ΠΈ, Π½ΠΎ ΡΠ°ΡΡΠ»ΠΈΠ²ΠΈ ΡΠΌΠ΅Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΡΠΊΠ°ΠΌ Π΄Π° Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ Π½Π° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΎΡΠΈΡΠ΅ ΠΈ ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅. Π‘ΡΠ΅Π΄ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Π½Π° Π΄ΡΡΠ³ΠΈ Π΅ΠΊΠΈΠΏΠΈ Π»ΠΈΡΠ½ΠΎ Π½Π° Π½Π°Ρ Π½ΠΈ Π΄ΠΎΠΏΠ°Π΄Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΡΠ»Π΅Π΄Π΅Π½Π΅ Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΌΠ΅ΡΡΠ° Π·Π° ΠΏΠ°ΡΠΊΠΈΡΠ°Π½Π΅. ΠΠ° Π½Π°Ρ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π³ΠΎΡΠΈΠ½ΠΎ ΠΈΠ·ΠΆΠΈΠ²ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΠ°ΠΏΡΠ½Π΅ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠ° ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ°. ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅, ΡΠ΅ Π²ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΡΠ±ΠΈΡΠΈΡ ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΠΆΠ΄Π°Ρ Π² ΡΠ΅Π³ΠΈΠΎΠ½ΠΈΡΠ΅, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ ΡΠ΅ΠΌΠΈ, ΡΠ²ΡΡΠ·Π°Π½ΠΈ Ρ ΠΠ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com