ஓபன்வினோ ஹேக்கத்தான்: ராஸ்பெர்ரி பையில் குரல் மற்றும் உணர்ச்சிகளை அடையாளம் காணுதல்

நவம்பர் 30 - டிசம்பர் 1 ஆம் தேதி நிஸ்னி நோவ்கோரோட்டில் நடைபெற்றது OpenVINO ஹேக்கத்தான். இன்டெல் ஓபன்வினோ கருவித்தொகுப்பைப் பயன்படுத்தி தயாரிப்பு தீர்வின் முன்மாதிரியை உருவாக்க பங்கேற்பாளர்கள் கேட்கப்பட்டனர். ஒரு பணியைத் தேர்ந்தெடுக்கும்போது வழிநடத்தக்கூடிய தோராயமான தலைப்புகளின் பட்டியலை அமைப்பாளர்கள் முன்மொழிந்தனர், ஆனால் இறுதி முடிவு அணிகளிடமே இருந்தது. கூடுதலாக, தயாரிப்பில் சேர்க்கப்படாத மாதிரிகளின் பயன்பாடு ஊக்குவிக்கப்பட்டது.

ஓபன்வினோ ஹேக்கத்தான்: ராஸ்பெர்ரி பையில் குரல் மற்றும் உணர்ச்சிகளை அடையாளம் காணுதல்

இந்த கட்டுரையில், தயாரிப்பின் முன்மாதிரியை நாங்கள் எவ்வாறு உருவாக்கினோம் என்பதைப் பற்றி உங்களுக்குச் சொல்வோம், இதன் மூலம் நாங்கள் இறுதியில் முதல் இடத்தைப் பிடித்தோம்.

ஹேக்கத்தான் போட்டியில் 10க்கும் மேற்பட்ட அணிகள் பங்கேற்றன. அவர்களில் சிலர் பிற பகுதிகளில் இருந்து வந்திருப்பது மகிழ்ச்சி அளிக்கிறது. ஹேக்கத்தானின் இடம் "கிரெம்லின்ஸ்கி ஆன் போச்செயின்" வளாகமாகும், அங்கு நிஸ்னி நோவ்கோரோட்டின் பண்டைய புகைப்படங்கள் ஒரு பரிவாரத்தில் தொங்கவிடப்பட்டன! (தற்போது இன்டெல்லின் மத்திய அலுவலகம் நிஸ்னி நோவ்கோரோடில் அமைந்துள்ளது என்பதை நான் உங்களுக்கு நினைவூட்டுகிறேன்). பங்கேற்பாளர்களுக்கு குறியீட்டை எழுத 26 மணிநேரம் வழங்கப்பட்டது, இறுதியில் அவர்கள் தங்கள் தீர்வை முன்வைக்க வேண்டும். திட்டமிடப்பட்ட அனைத்தும் உண்மையில் செயல்படுத்தப்பட்டதா என்பதையும் விளக்கக்காட்சியில் யோசனைகளாக இருக்கவில்லை என்பதையும் உறுதிப்படுத்த ஒரு டெமோ அமர்வு இருப்பது ஒரு தனி நன்மை. வியாபாரம், தின்பண்டங்கள், உணவு, எல்லாம் கூட இருந்தது!

கூடுதலாக, இன்டெல் விருப்பமாக கேமராக்கள், ராஸ்பெர்ரி PI, நியூரல் கம்ப்யூட் ஸ்டிக் 2 ஆகியவற்றை வழங்கியது.

பணி தேர்வு

இலவச வடிவ ஹேக்கத்தானுக்குத் தயாராவதில் மிகவும் கடினமான பகுதிகளில் ஒன்று சவாலைத் தேர்ந்தெடுப்பது. இது மிகவும் வரவேற்கத்தக்கது என்று அறிவிப்பு கூறியதால், தயாரிப்பில் இதுவரை இல்லாத ஒன்றை உடனடியாகக் கொண்டு வர முடிவு செய்தோம்.

பகுப்பாய்வு செய்தபின் மாதிரிதற்போதைய வெளியீட்டில் உள்ள தயாரிப்பில் சேர்க்கப்பட்டுள்ளவை, அவற்றில் பெரும்பாலானவை பல்வேறு கணினி பார்வை சிக்கல்களைத் தீர்க்கின்றன என்ற முடிவுக்கு வருகிறோம். மேலும், OpenVINO ஐப் பயன்படுத்தி தீர்க்க முடியாத கணினி பார்வைத் துறையில் ஒரு சிக்கலைக் கொண்டு வருவது மிகவும் கடினம், மேலும் ஒன்றைக் கண்டுபிடித்தாலும், பொது களத்தில் முன் பயிற்சி பெற்ற மாதிரிகளைக் கண்டுபிடிப்பது கடினம். பேச்சு செயலாக்கம் மற்றும் பகுப்பாய்வு நோக்கி - நாங்கள் மற்றொரு திசையில் தோண்டி எடுக்க முடிவு செய்கிறோம். பேச்சிலிருந்து உணர்ச்சிகளை அடையாளம் காணும் ஒரு சுவாரஸ்யமான பணியைக் கருத்தில் கொள்வோம். ஓபன்வினோ ஏற்கனவே ஒரு நபரின் உணர்ச்சிகளை அவர்களின் முகத்தின் அடிப்படையில் தீர்மானிக்கும் மாதிரியைக் கொண்டுள்ளது என்று சொல்ல வேண்டும், ஆனால்:

  • கோட்பாட்டில், ஒலி மற்றும் படம் இரண்டிலும் வேலை செய்யும் ஒருங்கிணைந்த அல்காரிதத்தை உருவாக்க முடியும், இது துல்லியத்தை அதிகரிக்க வேண்டும்.
  • கேமராக்கள் பொதுவாக ஒரு குறுகிய கோணத்தைக் கொண்டிருக்கும்; ஒரு பெரிய பகுதியை மறைக்க ஒன்றுக்கும் மேற்பட்ட கேமராக்கள் தேவை; ஒலிக்கு அத்தகைய வரம்பு இல்லை.

யோசனையை உருவாக்குவோம்: சில்லறை விற்பனைப் பிரிவுக்கான யோசனையை அடிப்படையாக எடுத்துக்கொள்வோம். ஸ்டோர் செக்அவுட்களில் வாடிக்கையாளர் திருப்தியை அளவிடலாம். வாடிக்கையாளர்களில் ஒருவர் சேவையில் அதிருப்தி அடைந்து, அவர்களின் தொனியை உயர்த்தத் தொடங்கினால், நீங்கள் உடனடியாக நிர்வாகியை உதவிக்கு அழைக்கலாம்.
இந்த வழக்கில், நாங்கள் மனித குரல் அங்கீகாரத்தை சேர்க்க வேண்டும், இது வாடிக்கையாளர்களிடமிருந்து கடை ஊழியர்களை வேறுபடுத்தி, ஒவ்வொரு நபருக்கும் பகுப்பாய்வுகளை வழங்க அனுமதிக்கும். சரி, கூடுதலாக, கடை ஊழியர்களின் நடத்தையை அவர்களே பகுப்பாய்வு செய்ய முடியும், குழுவில் உள்ள சூழ்நிலையை மதிப்பீடு செய்வது நல்லது!

எங்கள் தீர்வுக்கான தேவைகளை நாங்கள் உருவாக்குகிறோம்:

  • இலக்கு சாதனத்தின் சிறிய அளவு
  • நிகழ் நேர செயல்பாடு
  • Низкая цена
  • எளிதான அளவிடுதல்

இதன் விளைவாக, இலக்கு சாதனமாக Raspberry Pi 3 c ஐத் தேர்ந்தெடுக்கிறோம் இன்டெல் என்சிஎஸ் 2.

இங்கே NCS இன் ஒரு முக்கிய அம்சத்தைக் குறிப்பிடுவது முக்கியம் - இது நிலையான CNN கட்டமைப்புகளுடன் சிறப்பாகச் செயல்படும், ஆனால் தனிப்பயன் அடுக்குகளைக் கொண்ட மாதிரியை இயக்க வேண்டும் என்றால், குறைந்த-நிலை மேம்படுத்தலை எதிர்பார்க்கலாம்.

செய்ய ஒரே ஒரு சிறிய விஷயம் உள்ளது: நீங்கள் ஒரு மைக்ரோஃபோனைப் பெற வேண்டும். வழக்கமான USB மைக்ரோஃபோன் செயல்படும், ஆனால் அது RPI உடன் நன்றாக இருக்காது. ஆனால் இங்கே கூட தீர்வு உண்மையில் "அருகில் உள்ளது." குரலைப் பதிவு செய்ய, கிட்டில் இருந்து வாய்ஸ் பானெட் போர்டைப் பயன்படுத்த முடிவு செய்கிறோம் Google AIY குரல் கிட், இதில் கம்பி ஸ்டீரியோ மைக்ரோஃபோன் உள்ளது.

Raspbian இலிருந்து பதிவிறக்கவும் AIY திட்ட களஞ்சியம் அதை ஃபிளாஷ் டிரைவில் பதிவேற்றி, பின்வரும் கட்டளையைப் பயன்படுத்தி மைக்ரோஃபோன் செயல்படுகிறதா என்று சோதிக்கவும் (இது 5 வினாடிகள் நீளமான ஆடியோவைப் பதிவுசெய்து கோப்பில் சேமிக்கும்):

arecord -d 5 -r 16000 test.wav

மைக்ரோஃபோன் மிகவும் உணர்திறன் கொண்டது மற்றும் சத்தத்தை நன்றாக எடுக்கும் என்பதை நான் உடனடியாக கவனிக்க வேண்டும். இதை சரிசெய்ய, அல்சாமிக்சருக்குச் சென்று, கேப்சர் சாதனங்களைத் தேர்ந்தெடுத்து, உள்ளீட்டு சமிக்ஞை அளவை 50-60% ஆகக் குறைப்போம்.

ஓபன்வினோ ஹேக்கத்தான்: ராஸ்பெர்ரி பையில் குரல் மற்றும் உணர்ச்சிகளை அடையாளம் காணுதல்
நாங்கள் ஒரு கோப்புடன் உடலை மாற்றியமைக்கிறோம், எல்லாம் பொருந்துகிறது, நீங்கள் அதை ஒரு மூடியுடன் கூட மூடலாம்

காட்டி பொத்தானைச் சேர்த்தல்

AIY வாய்ஸ் கிட்டைத் தவிர்த்து, RGB பொத்தான் இருப்பதை நினைவில் கொள்கிறோம், அதன் பின்னொளியை மென்பொருள் மூலம் கட்டுப்படுத்தலாம். நாங்கள் "Google AIY Led" ஐத் தேடுகிறோம் மற்றும் ஆவணங்களைக் கண்டறிகிறோம்: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
அங்கீகரிக்கப்பட்ட உணர்ச்சியைக் காட்ட இந்த பொத்தானை ஏன் பயன்படுத்தக்கூடாது, எங்களிடம் 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])))

ஓபன்வினோ ஹேக்கத்தான்: ராஸ்பெர்ரி பையில் குரல் மற்றும் உணர்ச்சிகளை அடையாளம் காணுதல்
பொத்தான், எரி!

குரல் மூலம் வேலை

ஒலியை வடிகட்டவும் குரலைக் கண்டறியவும் மைக்ரோஃபோன் மற்றும் webrtcvad இலிருந்து ஸ்ட்ரீமைப் பிடிக்க pyaudioவைப் பயன்படுத்துவோம். கூடுதலாக, நாங்கள் ஒரு வரிசையை உருவாக்குவோம், அதில் ஒத்திசைவற்ற முறையில் குரல் பகுதிகளைச் சேர்ப்போம் மற்றும் அகற்றுவோம்.

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 வெவ்வேறு தீர்வுகளை நாங்கள் முயற்சித்தோம், உணர்ச்சிகளை அடையாளம் காணும் மாதிரி உடனடியாக வேலை செய்தால், குரல் அங்கீகாரத்துடன் நாம் நீண்ட நேரம் காத்திருக்க வேண்டியிருந்தது - அவை மிகவும் சிக்கலான கட்டமைப்புகளைப் பயன்படுத்துகின்றன.

நாங்கள் பின்வருவனவற்றில் கவனம் செலுத்துகிறோம்:

  • குரலில் இருந்து வரும் உணர்வுகள் - https://github.com/alexmuhr/Voice_Emotion
    இது பின்வரும் கொள்கையின்படி செயல்படுகிறது: ஆடியோ ஒரு குறிப்பிட்ட அளவிலான பத்திகளாக வெட்டப்படுகிறது, இந்த பத்திகளில் ஒவ்வொன்றிற்கும் நாங்கள் தேர்ந்தெடுக்கிறோம் MFCC பின்னர் அவற்றை உள்ளீடாக CNNக்கு சமர்ப்பிக்கவும்
  • குரல் அங்கீகாரம் - https://github.com/linhdvu14/vggvox-speaker-identification
    இங்கே, MFCC க்கு பதிலாக, நாங்கள் ஒரு ஸ்பெக்ட்ரோகிராமுடன் வேலை செய்கிறோம், FFT க்குப் பிறகு சிஎன்என் க்கு சிக்னலை வழங்குகிறோம், அங்கு வெளியீட்டில் குரலின் வெக்டார் பிரதிநிதித்துவத்தைப் பெறுகிறோம்.

அடுத்து, கோட்பாட்டில் தொடங்கி மாதிரிகளை மாற்றுவது பற்றி பேசுவோம். OpenVINO பல தொகுதிகளை உள்ளடக்கியது:

  • மாடல் மிருகக்காட்சிசாலையைத் திறக்கவும், உங்கள் தயாரிப்பில் பயன்படுத்தக்கூடிய மற்றும் சேர்க்கக்கூடிய மாதிரிகள்
  • மாடல் ஆப்டிம்ஸர், பல்வேறு கட்டமைப்பு வடிவங்களிலிருந்து (டென்சர்ஃப்ளோ, ஓஎன்என்எக்ஸ் போன்றவை) ஒரு மாதிரியை இடைநிலை பிரதிநிதித்துவ வடிவத்திற்கு மாற்றுவதற்கு நன்றி, இதன் மூலம் நாங்கள் மேலும் செயல்படுவோம்
  • இன்ஃபெரன்ஸ் எஞ்சின், இன்டெல் செயலிகள், எண்ணற்ற சிப்ஸ் மற்றும் நியூரல் கம்ப்யூட் ஸ்டிக் ஆக்சிலரேட்டர்களில் ஐஆர் வடிவத்தில் மாடல்களை இயக்க உங்களை அனுமதிக்கிறது.
  • OpenCV இன் மிகச் சிறந்த பதிப்பு (Inference Engine ஆதரவுடன்)
    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 இல் இருப்பதாகத் தெரிகிறது, ஆனால் நாங்கள் அவ்வளவு தூரம் தோண்டி எடுக்காமல், மாடல்களில் ஒன்றிற்கு அதைச் சரிசெய்தோம்.
    அடுத்து, ஏற்கனவே மாற்றப்பட்ட மாதிரியை ஐஆர் வடிவத்தில் டிஎன்என் தொகுதி வழியாக ஓபன்சிவியில் ஏற்றி அதை அனுப்ப முயற்சிப்போம்.

    import cv2 as cv
    emotionsNet = cv.dnn.readNet('emotions_model.bin',
                              'emotions_model.xml')
    emotionsNet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

    இந்த வழக்கில் கடைசி வரி கணக்கீடுகளை நியூரல் கம்ப்யூட் ஸ்டிக்கிற்கு திருப்பி விட அனுமதிக்கிறது, அடிப்படை கணக்கீடுகள் செயலியில் செய்யப்படுகின்றன, ஆனால் ராஸ்பெர்ரி பை விஷயத்தில் இது இயங்காது, உங்களுக்கு ஒரு குச்சி தேவைப்படும்.

    அடுத்து, தர்க்கம் பின்வருமாறு: எங்கள் ஆடியோவை ஒரு குறிப்பிட்ட அளவிலான சாளரங்களாகப் பிரிக்கிறோம் (எங்களுக்கு இது 0.4 வினாடிகள்), இந்த சாளரங்கள் ஒவ்வொன்றையும் MFCC ஆக மாற்றுகிறோம், அதை நாங்கள் கட்டத்திற்கு வழங்குகிறோம்:

    emotionsNet.setInput(MFCC_from_window)
    result = emotionsNet.forward()

    அடுத்து, எல்லா விண்டோக்களுக்கும் பொதுவான வகுப்பை எடுத்துக் கொள்வோம். ஒரு எளிய தீர்வு, ஆனால் ஒரு ஹேக்கத்தானுக்கு நீங்கள் மிகவும் சுருக்கமான ஒன்றைக் கொண்டு வரத் தேவையில்லை, உங்களுக்கு நேரம் இருந்தால் மட்டுமே. எங்களுக்கு இன்னும் நிறைய வேலைகள் உள்ளன, எனவே தொடரலாம் - குரல் அங்கீகாரத்தை நாங்கள் கையாள்வோம். முன் பதிவு செய்யப்பட்ட குரல்களின் ஸ்பெக்ட்ரோகிராம்கள் சேமிக்கப்படும் சில வகையான தரவுத்தளத்தை உருவாக்குவது அவசியம். இன்னும் சிறிது நேரம் இருப்பதால், எங்களால் முடிந்தவரை இந்த சிக்கலை தீர்க்கிறோம்.

    அதாவது, குரல் பகுதியைப் பதிவுசெய்வதற்கான ஸ்கிரிப்டை நாங்கள் உருவாக்குகிறோம் (மேலே விவரிக்கப்பட்டதைப் போலவே இது செயல்படுகிறது, விசைப்பலகையில் குறுக்கீடு செய்தால் மட்டுமே அது ஒரு கோப்பில் குரலைச் சேமிக்கும்).

    நாம் முயற்சிப்போம்:

    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 ஆனது). புதிய மாடல்களைச் சேர்க்க எங்களுக்கு இனி நேரம் இல்லை, மேலும் வலை பயன்பாட்டின் முன்மாதிரியை எழுதுவதில் கவனம் செலுத்தினோம்.

    இணைய பயன்பாடு

    ஒரு முக்கியமான விஷயம்: நாங்கள் வீட்டிலிருந்து எங்களுடன் ஒரு திசைவியை எடுத்து எங்கள் உள்ளூர் நெட்வொர்க்கை அமைக்கிறோம், இது நெட்வொர்க்கில் சாதனம் மற்றும் மடிக்கணினிகளை இணைக்க உதவுகிறது.

    பின்தளம் என்பது வெப்சாக்கெட் தொழில்நுட்பத்தின் (http ஓவர் tcp புரோட்டோகால்) அடிப்படையிலான முன் மற்றும் ராஸ்பெர்ரி பை இடையே ஒரு எண்ட்-டு-எண்ட் செய்தி சேனலாகும்.

    ராஸ்பெர்ரியிலிருந்து செயலாக்கப்பட்ட தகவல்களைப் பெறுவது முதல் கட்டம், அதாவது json இல் நிரம்பிய முன்னறிவிப்பாளர்கள், அவர்கள் பயணத்தின் பாதியிலேயே தரவுத்தளத்தில் சேமிக்கப்பட்டு, அந்த காலத்திற்கான பயனரின் உணர்ச்சிப் பின்னணியைப் பற்றிய புள்ளிவிவரங்களை உருவாக்க முடியும். இந்த பாக்கெட் பின் முன்பகுதிக்கு அனுப்பப்படுகிறது, இது சந்தாவைப் பயன்படுத்துகிறது மற்றும் வெப்சாக்கெட் எண்ட்பாயிண்டிலிருந்து பாக்கெட்டுகளைப் பெறுகிறது. முழு பின்தள பொறிமுறையும் கோலாங் மொழியில் கட்டமைக்கப்பட்டுள்ளது; இது ஒத்திசைவற்ற பணிகளுக்கு மிகவும் பொருத்தமானது என்பதால் இது தேர்ந்தெடுக்கப்பட்டது, இது goroutines நன்றாக கையாளுகிறது.
    இறுதிப் புள்ளியை அணுகும்போது, ​​பயனர் பதிவு செய்யப்பட்டு கட்டமைப்பிற்குள் நுழைந்தார், பின்னர் அவரது செய்தி பெறப்படுகிறது. பயனர் மற்றும் செய்தி இரண்டும் ஒரு பொதுவான மையத்தில் உள்ளிடப்பட்டுள்ளன, அதில் இருந்து ஏற்கனவே செய்திகள் மேலும் அனுப்பப்பட்டுள்ளன (சந்தாதாரர் முன்புறத்திற்கு), மேலும் பயனர் இணைப்பை (ராஸ்பெர்ரி அல்லது முன்) மூடினால், அவரது சந்தா ரத்து செய்யப்பட்டு அவர் அகற்றப்படுவார் மையமாக.

    ஓபன்வினோ ஹேக்கத்தான்: ராஸ்பெர்ரி பையில் குரல் மற்றும் உணர்ச்சிகளை அடையாளம் காணுதல்
    பின்னால் இருந்து இணைப்புக்காக காத்திருக்கிறோம்

    ஃப்ரண்ட்-எண்ட் என்பது ஜாவாஸ்கிரிப்ட்டில் எழுதப்பட்ட வலைப் பயன்பாடு ஆகும், இது ரியாக்ட் லைப்ரரியைப் பயன்படுத்தி வளர்ச்சி செயல்முறையை விரைவுபடுத்தவும் எளிதாகவும் செய்கிறது. இந்த பயன்பாட்டின் நோக்கம், பின்-இறுதியில் மற்றும் நேரடியாக ராஸ்பெர்ரி பையில் இயங்கும் அல்காரிதம்களைப் பயன்படுத்தி பெறப்பட்ட தரவைக் காட்சிப்படுத்துவதாகும். பக்கம் ரியாக்ட்-ரவுட்டரைப் பயன்படுத்தி செயல்படுத்தப்பட்ட பிரிவு ரூட்டிங் உள்ளது, ஆனால் ஆர்வத்தின் முக்கியப் பக்கம் முதன்மைப் பக்கமாகும், அங்கு வெப்சாக்கெட் தொழில்நுட்பத்தைப் பயன்படுத்தி சேவையகத்திலிருந்து நிகழ்நேரத்தில் தரவுகளின் தொடர்ச்சியான ஸ்ட்ரீம் பெறப்படுகிறது. Raspberry Pi ஒரு குரலைக் கண்டறிந்து, அது பதிவுசெய்யப்பட்ட தரவுத்தளத்திலிருந்து ஒரு குறிப்பிட்ட நபருக்குச் சொந்தமானதா என்பதைத் தீர்மானித்து, வாடிக்கையாளருக்கு நிகழ்தகவு பட்டியலை அனுப்புகிறது. கிளையன்ட் சமீபத்திய தொடர்புடைய தரவைக் காண்பிக்கும், மைக்ரோஃபோனில் பெரும்பாலும் பேசிய நபரின் அவதாரத்தையும், அதே போல் அவர் வார்த்தைகளை உச்சரிக்கும் உணர்ச்சியையும் காட்டுகிறது.

    ஓபன்வினோ ஹேக்கத்தான்: ராஸ்பெர்ரி பையில் குரல் மற்றும் உணர்ச்சிகளை அடையாளம் காணுதல்
    மேம்படுத்தப்பட்ட கணிப்புகளுடன் முகப்புப் பக்கம்

    முடிவுக்கு

    எல்லாவற்றையும் திட்டமிட்டபடி முடிக்க முடியாது, எங்களுக்கு நேரமில்லை, எனவே டெமோவில் முக்கிய நம்பிக்கை இருந்தது, எல்லாம் வேலை செய்யும். விளக்கக்காட்சியில், எல்லாம் எவ்வாறு இயங்குகிறது, என்ன மாதிரிகள் எடுத்தார்கள், என்ன சிக்கல்களை எதிர்கொண்டார்கள் என்பதைப் பற்றி பேசினர். அடுத்தது டெமோ பகுதி - வல்லுநர்கள் சீரற்ற வரிசையில் அறையைச் சுற்றிச் சென்று வேலை செய்யும் முன்மாதிரியைப் பார்க்க ஒவ்வொரு குழுவையும் அணுகினர். அவர்களும் எங்களிடம் கேள்விகளைக் கேட்டார்கள், அனைவரும் தங்கள் பங்கிற்கு பதிலளித்தனர், அவர்கள் மடிக்கணினியில் வலையை விட்டு வெளியேறினர், மேலும் அனைத்தும் எதிர்பார்த்தபடி வேலை செய்தன.

    எங்கள் தீர்வுக்கான மொத்த செலவு $150 என்பதை நான் கவனிக்கிறேன்:

    • ராஸ்பெர்ரி பை 3 ~ $35
    • கூகுள் ஏஐஒய் வாய்ஸ் பானெட் (நீங்கள் ரீஸ்பீக்கர் கட்டணத்தை எடுக்கலாம்) ~ 15$
    • இன்டெல் NCS 2 ~ 100$

    எப்படி மேம்படுத்துவது:

    • கிளையண்டிலிருந்து பதிவைப் பயன்படுத்தவும் - தோராயமாக உருவாக்கப்பட்ட உரையைப் படிக்கச் சொல்லுங்கள்
    • இன்னும் சில மாதிரிகளைச் சேர்க்கவும்: குரல் மூலம் பாலினம் மற்றும் வயதை நீங்கள் தீர்மானிக்கலாம்
    • ஒரே நேரத்தில் ஒலிக்கும் குரல்களைப் பிரிக்கவும் (டயரைசேஷன்)

    களஞ்சியம்: https://github.com/vladimirwest/OpenEMO

    ஓபன்வினோ ஹேக்கத்தான்: ராஸ்பெர்ரி பையில் குரல் மற்றும் உணர்ச்சிகளை அடையாளம் காணுதல்
    சோர்வாக இருந்தாலும் மகிழ்ச்சியாக இருக்கிறோம்

    முடிவில், ஏற்பாட்டாளர்கள் மற்றும் பங்கேற்பாளர்களுக்கு நான் நன்றி கூற விரும்புகிறேன். மற்ற குழுக்களின் திட்டங்களில், இலவச பார்க்கிங் இடங்களைக் கண்காணிப்பதற்கான தீர்வை நாங்கள் தனிப்பட்ட முறையில் விரும்பினோம். எங்களைப் பொறுத்தவரை, தயாரிப்பு மற்றும் மேம்பாட்டில் மூழ்கியிருப்பது மிகவும் அருமையான அனுபவமாக இருந்தது. AI தலைப்புகள் உட்பட, மேலும் மேலும் சுவாரஸ்யமான நிகழ்வுகள் பிராந்தியங்களில் நடைபெறும் என்று நம்புகிறேன்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்