OpenVINO hackathon: idanimọ ohun ati awọn ẹdun lori Rasipibẹri Pi

Kọkànlá Oṣù 30 - December 1 ni Nizhny Novgorod ti waye OpenVINO hackathon. A beere lọwọ awọn olukopa lati ṣẹda apẹrẹ kan ti ojutu ọja nipa lilo ohun elo irinṣẹ Intel OpenVINO. Awọn oluṣeto dabaa atokọ ti awọn koko-ọrọ isunmọ ti o le ṣe itọsọna nipasẹ nigbati o yan iṣẹ-ṣiṣe kan, ṣugbọn ipinnu ikẹhin wa pẹlu awọn ẹgbẹ. Ni afikun, lilo awọn awoṣe ti ko si ninu ọja naa ni iwuri.

OpenVINO hackathon: idanimọ ohun ati awọn ẹdun lori Rasipibẹri Pi

Ninu nkan yii a yoo sọ fun ọ nipa bii a ṣe ṣẹda apẹrẹ wa ti ọja, pẹlu eyiti a gba ni aye akọkọ.

Diẹ sii ju awọn ẹgbẹ 10 kopa ninu hackathon. O dara pe diẹ ninu wọn wa lati awọn agbegbe miiran. Ibi isere fun hackathon ni eka "Kremlinsky on Pochain", nibiti a ti so awọn fọto atijọ ti Nizhny Novgorod sinu inu, ni igbimọ! (Mo leti pe ni akoko aarin ọfiisi ti Intel wa ni Nizhny Novgorod). A fun awọn olukopa ni wakati 26 lati kọ koodu, ati ni ipari wọn ni lati ṣafihan ojutu wọn. Anfani lọtọ ni wiwa igba demo kan lati rii daju pe ohun gbogbo ti a gbero ni imuse ni otitọ ati pe ko wa awọn imọran ninu igbejade. Iṣowo, ipanu, ounjẹ, ohun gbogbo wa nibẹ paapaa!

Ni afikun, Intel ni iyan pese awọn kamẹra, Rasipibẹri PI, Stick Compute Neural 2.

Aṣayan iṣẹ-ṣiṣe

Ọkan ninu awọn ẹya ti o nira julọ ti ngbaradi fun hackathon-ọfẹ jẹ yiyan ipenija kan. A pinnu lẹsẹkẹsẹ lati wa pẹlu nkan ti ko tii wa ninu ọja naa, nitori ikede naa sọ pe eyi jẹ itẹwọgba gaan.

Lehin atupale awọn awoṣe, eyiti o wa ninu ọja ni idasilẹ lọwọlọwọ, a wa si ipari pe ọpọlọpọ ninu wọn yanju ọpọlọpọ awọn iṣoro iran kọnputa. Pẹlupẹlu, o ṣoro pupọ lati wa pẹlu iṣoro kan ni aaye wiwo kọnputa ti a ko le yanju nipa lilo OpenVINO, ati paapaa ti ọkan ba le ṣẹda, o nira lati wa awọn awoṣe ti ikẹkọ tẹlẹ ni agbegbe gbangba. A pinnu lati ma wà ni itọsọna miiran - si ọna sisọ ọrọ ati awọn atupale. Jẹ ki a ṣe akiyesi iṣẹ-ṣiṣe ti o nifẹ si ti idanimọ awọn ẹdun lati ọrọ sisọ. O gbọdọ sọ pe OpenVINO ti ni awoṣe ti o pinnu awọn ẹdun eniyan ti o da lori oju wọn, ṣugbọn:

  • Ni imọran, o ṣee ṣe lati ṣẹda alugoridimu ti o ni idapo ti yoo ṣiṣẹ lori ohun mejeeji ati aworan, eyi ti o yẹ ki o fun ilosoke ni deede.
  • Awọn kamẹra maa n ni igun wiwo dín; diẹ ẹ sii ju kamẹra kan ni a nilo lati bo agbegbe nla kan; ohun ko ni iru aropin bẹ.

Jẹ ki a ṣe idagbasoke ero naa: jẹ ki a gba imọran fun apakan soobu gẹgẹbi ipilẹ. O le ṣe iwọn itẹlọrun alabara ni awọn ibi isanwo itaja. Ti ọkan ninu awọn alabara ko ba ni itẹlọrun pẹlu iṣẹ naa ti o bẹrẹ lati gbe ohun orin soke, o le pe oluṣakoso lẹsẹkẹsẹ fun iranlọwọ.
Ni ọran yii, a nilo lati ṣafikun idanimọ ohun eniyan, eyi yoo gba wa laaye lati ṣe iyatọ awọn oṣiṣẹ ile itaja lati ọdọ awọn alabara ati pese awọn itupalẹ fun ẹni kọọkan. O dara, ni afikun, yoo ṣee ṣe lati ṣe itupalẹ ihuwasi ti awọn oṣiṣẹ ile itaja funrararẹ, ṣe iṣiro oju-aye ninu ẹgbẹ, ohun ti o dara!

A ṣe agbekalẹ awọn ibeere fun ojutu wa:

  • Iwọn kekere ti ẹrọ afojusun
  • Real akoko isẹ
  • Iye owo kekere
  • Rọrun scalability

Bi abajade, a yan Rasipibẹri Pi 3 c bi ẹrọ ibi-afẹde Intel NCS 2.

Nibi o ṣe pataki lati ṣe akiyesi ẹya pataki kan ti NCS - o ṣiṣẹ dara julọ pẹlu awọn ile-iṣẹ CNN boṣewa, ṣugbọn ti o ba nilo lati ṣiṣẹ awoṣe kan pẹlu awọn fẹlẹfẹlẹ aṣa lori rẹ, lẹhinna nireti iṣapeye ipele kekere.

Ohun kekere kan lo wa lati ṣe: o nilo lati gba gbohungbohun kan. Agbohungbohun USB deede yoo ṣe, ṣugbọn kii yoo dara dara pọ pẹlu RPI. Ṣugbọn paapaa nibi ojutu gangan “wa nitosi.” Lati ṣe igbasilẹ ohun, a pinnu lati lo igbimọ Voice Bonnet lati inu ohun elo naa Google AIY Ohun elo, lori eyiti gbohungbohun sitẹrio onirin wa.

Ṣe igbasilẹ Raspbian lati Ibi ipamọ ise agbese AIY Ati gbee si kọnputa filasi kan, ṣe idanwo pe gbohungbohun ṣiṣẹ nipa lilo aṣẹ atẹle (yoo gba ohun afetigbọ silẹ iṣẹju-aaya 5 yoo fi pamọ si faili kan):

arecord -d 5 -r 16000 test.wav

Mo yẹ ki o ṣe akiyesi lẹsẹkẹsẹ pe gbohungbohun jẹ itara pupọ ati gbe ariwo daradara. Lati ṣatunṣe eyi, jẹ ki a lọ si alsamixer, yan awọn ẹrọ Yaworan ki o dinku ipele ifihan titẹ sii si 50-60%.

OpenVINO hackathon: idanimọ ohun ati awọn ẹdun lori Rasipibẹri Pi
A ṣe atunṣe ara pẹlu faili kan ati pe ohun gbogbo baamu, o le paapaa tii pẹlu ideri kan

Nfi bọtini itọka kan kun

Lakoko ti o mu Apo Ohun elo AIY yato si, a ranti pe bọtini RGB wa, ina ẹhin eyiti o le ṣakoso nipasẹ sọfitiwia. A wa “Google AIY Led” ati wa iwe: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Kilode ti o ko lo bọtini yii lati ṣafihan imolara ti a mọ, a ni awọn kilasi 7 nikan, ati bọtini naa ni awọn awọ 8, o kan to!

A so bọtini pọ nipasẹ GPIO si Voice Bonnet, fifuye awọn ile-ikawe pataki (wọn ti fi sii tẹlẹ ninu ohun elo pinpin lati awọn iṣẹ akanṣe AIY)

from aiy.leds import Leds, Color
from aiy.leds import RgbLeds

Jẹ ki a ṣẹda dict kan ninu eyiti ẹdun kọọkan yoo ni awọ ti o baamu ni irisi RGB Tuple ati ohun kan ti kilasi aiy.leds.Leds, nipasẹ eyiti a yoo ṣe imudojuiwọn awọ naa:

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()

Ati nikẹhin, lẹhin asọtẹlẹ tuntun kọọkan ti ẹdun, a yoo ṣe imudojuiwọn awọ ti bọtini ni ibamu pẹlu rẹ (nipasẹ bọtini).

leds.update(Leds.rgb_on(led_dict.get(classes[prediction])))

OpenVINO hackathon: idanimọ ohun ati awọn ẹdun lori Rasipibẹri Pi
Bọtini, sun!

Ṣiṣẹ pẹlu ohun

A yoo lo pyaudio lati gba ṣiṣan lati gbohungbohun ati webrtcvad lati ṣe àlẹmọ ariwo ati ri ohun. Ni afikun, a yoo ṣẹda isinyi si eyiti a yoo ṣafikun asynchronously ati yọkuro awọn ipin ohun.

Niwọn igba ti webrtcvad ni aropin lori iwọn ti ajẹkù ti a pese - o gbọdọ jẹ dogba si 10/20/30ms, ati ikẹkọ ti awoṣe fun idanimọ awọn ẹdun (bii a yoo kọ ẹkọ nigbamii) ni a ṣe lori ipilẹ data 48kHz, a yoo ṣe. Yaworan chunks ti iwọn 48000×20ms/1000×1( mono)=960 baiti. Webrtcvad yoo pada Otitọ/Iro fun ọkọọkan awọn chunks wọnyi, eyiti o ni ibamu si wiwa tabi isansa ti Idibo ni chunk.

Jẹ ki a ṣe ilana ọgbọn wọnyi:

  • A yoo ṣafikun si atokọ naa awọn ege nibiti ibo kan wa; ti ko ba si ibo, lẹhinna a yoo ṣafikun counter ti awọn ege ofo.
  • Ti counter ti awọn chunks ofo jẹ> = 30 (600 ms), lẹhinna a wo iwọn ti atokọ ti awọn chunks ti a kojọpọ; ti o ba jẹ> 250, lẹhinna a ṣafikun si isinyi; ti kii ba ṣe bẹ, a ro pe gigun naa ti igbasilẹ ko to lati ifunni rẹ si awoṣe lati ṣe idanimọ agbọrọsọ.
  • Ti counter ti awọn ṣofo ti o ṣofo jẹ ṣi <30, ati iwọn ti atokọ ti awọn ege ti a kojọpọ kọja 300, lẹhinna a yoo ṣafikun ajẹkù si isinyi fun asọtẹlẹ deede diẹ sii. (nitori awọn ẹdun ṣọ lati yipada ni akoko pupọ)

 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 = []

O to akoko lati wa awọn awoṣe ti a ti kọkọ tẹlẹ ni agbegbe gbangba, lọ si github, Google, ṣugbọn ranti pe a ni aropin lori faaji ti a lo. Eyi jẹ apakan ti o nira pupọ, nitori o ni lati ṣe idanwo awọn awoṣe lori data titẹ sii rẹ, ati ni afikun, yi wọn pada si ọna kika inu OpenVINO - IR (Aṣoju agbedemeji). A gbiyanju nipa 5-7 awọn solusan oriṣiriṣi lati github, ati pe ti awoṣe fun idanimọ awọn ẹdun ṣiṣẹ lẹsẹkẹsẹ, lẹhinna pẹlu idanimọ ohun a ni lati duro pẹ diẹ - wọn lo awọn faaji eka sii.

A fojusi lori awọn wọnyi:

Nigbamii ti a yoo sọrọ nipa iyipada awọn awoṣe, bẹrẹ pẹlu imọran. OpenVINO pẹlu ọpọlọpọ awọn modulu:

  • Ṣii Awoṣe Zoo, awọn awoṣe lati eyiti o le ṣee lo ati pe o wa ninu ọja rẹ
  • Awoṣe Optimzer, o ṣeun si eyiti o le ṣe iyipada awoṣe lati ọpọlọpọ awọn ọna kika ilana (Tensorflow, ONNX ati bẹbẹ lọ) sinu ọna kika Agbedemeji, pẹlu eyiti a yoo ṣiṣẹ siwaju
  • Engine Inference ngbanilaaye lati ṣiṣe awọn awoṣe ni ọna kika IR lori awọn ilana Intel, awọn eerun Myriad ati awọn ohun imuyara Kọnpiti Neural
  • Ẹya ti o munadoko julọ ti OpenCV (pẹlu atilẹyin Inference Engine)
    Awoṣe kọọkan ni ọna kika IR jẹ apejuwe nipasẹ awọn faili meji: .xml ati .bin.
    Awọn awoṣe ti yipada si ọna kika IR nipasẹ Awoṣe Optimizer bi atẹle:

    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 gba ọ laaye lati yan ọna kika data pẹlu eyiti awoṣe yoo ṣiṣẹ. FP32, FP16, INT8 ni atilẹyin. Yiyan iru data to dara julọ le fun igbelaruge iṣẹ ṣiṣe to dara.
    --input_shape tọkasi iwọn ti data titẹ sii. Agbara lati yipada ni agbara dabi ẹni pe o wa ninu C ++ API, ṣugbọn a ko ma wà ti o jinna ati pe o rọrun fun ọkan ninu awọn awoṣe.
    Nigbamii, jẹ ki a gbiyanju lati ṣaja awoṣe ti o ti yipada tẹlẹ ni ọna kika IR nipasẹ module DNN sinu OpenCV ki o si firanṣẹ siwaju si.

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

    Laini ti o kẹhin ninu ọran yii gba ọ laaye lati ṣe atunṣe awọn iṣiro si Stick Compute Neural, awọn iṣiro ipilẹ ni a ṣe lori ero isise, ṣugbọn ninu ọran ti Rasipibẹri Pi eyi kii yoo ṣiṣẹ, iwọ yoo nilo ọpá kan.

    Nigbamii, ọgbọn naa jẹ bi atẹle: a pin ohun wa si awọn ferese ti iwọn kan (fun wa o jẹ 0.4 s), a yipada ọkọọkan awọn window wọnyi sinu MMFC, eyiti a jẹun si akoj:

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

    Nigbamii, jẹ ki a mu kilasi ti o wọpọ julọ fun gbogbo awọn window. Ojutu ti o rọrun, ṣugbọn fun hackathon o ko nilo lati wa pẹlu nkan ti abstruse pupọ, nikan ti o ba ni akoko. A tun ni ọpọlọpọ iṣẹ lati ṣe, nitorinaa jẹ ki a tẹsiwaju - a yoo ṣe pẹlu idanimọ ohun. O jẹ dandan lati ṣe iru data kan ninu eyiti awọn iwoye ti awọn ohun ti a gbasilẹ tẹlẹ yoo wa ni ipamọ. Níwọ̀n bó ti jẹ́ pé àkókò díẹ̀ ló kù, a máa yanjú ọ̀ràn yìí bó bá ti lè ṣeé ṣe tó.

    Eyun, a ṣẹda iwe afọwọkọ kan fun gbigbasilẹ yiyan ohun (o ṣiṣẹ ni ọna kanna bi a ti salaye loke, nikan nigbati o ba da duro lati keyboard yoo fi ohun pamọ si faili).

    Jẹ ki a gbiyanju:

    python3 voice_db/record_voice.py test.wav

    A ṣe igbasilẹ awọn ohun ti ọpọlọpọ eniyan (ninu ọran wa, awọn ọmọ ẹgbẹ ẹgbẹ mẹta)
    Nigbamii, fun ohun kọọkan ti o gbasilẹ a ṣe iyipada iyara mẹrin, gba spectrogram kan ki o ṣafipamọ rẹ bi titobi nọmba (.npy):

    for file in glob.glob("voice_db/*.wav"):
            spec = get_fft_spectrum(file)
            np.save(file[:-4] + '.npy', spec)

    Awọn alaye diẹ sii ninu faili naa create_base.py
    Bi abajade, nigba ti a ba ṣiṣẹ iwe afọwọkọ akọkọ, a yoo gba awọn ifibọ lati awọn iwoye wọnyi ni ibẹrẹ:

    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)

    Lẹhin gbigba ifibọ lati apakan ti o dun, a yoo ni anfani lati pinnu ẹniti o jẹ ti nipasẹ gbigbe ijinna cosine lati aye si gbogbo awọn ohun ti o wa ninu ibi ipamọ data (kere, o ṣeeṣe diẹ sii) - fun demo a ṣeto iloro si 0.3):

            dist_list = cdist(emb, enroll_embs, metric="cosine")
            distances = pd.DataFrame(dist_list, columns = df.speaker)

    Ni ipari, Emi yoo fẹ lati ṣe akiyesi pe iyara ifọkasi ni iyara ati jẹ ki o ṣee ṣe lati ṣafikun awọn awoṣe 1-2 diẹ sii (fun apẹẹrẹ awọn aaya 7 gigun o gba 2.5 fun itọkasi). A ko ni akoko lati ṣafikun awọn awoṣe tuntun ati idojukọ lori kikọ apẹrẹ ti ohun elo wẹẹbu naa.

    Ohun elo ayelujara

    Ojuami pataki kan: a mu olulana pẹlu wa lati ile ati ṣeto nẹtiwọki agbegbe wa, o ṣe iranlọwọ lati so ẹrọ ati kọǹpútà alágbèéká pọ lori nẹtiwọki.

    Afẹyinti jẹ ikanni ifiranṣẹ ipari-si-opin laarin iwaju ati Rasipibẹri Pi, da lori imọ-ẹrọ websocket (http over tcp protocol).

    Ipele akọkọ ni lati gba alaye ti a ṣe ilana lati rasipibẹri, iyẹn ni, awọn asọtẹlẹ ti a kojọpọ ni json, eyiti a fipamọ sinu ibi ipamọ data ni agbedemeji irin-ajo wọn ki awọn iṣiro le ṣe ipilẹṣẹ nipa ipilẹṣẹ ẹdun olumulo fun akoko naa. A fi soso yii ranṣẹ si iwaju iwaju, eyiti o nlo ṣiṣe-alabapin ati gba awọn apo-iwe lati aaye ipari websocket. Gbogbo ẹrọ ẹhin ni a kọ ni ede golang; o ti yan nitori pe o baamu daradara fun awọn iṣẹ ṣiṣe asynchronous, eyiti awọn gorutines mu daradara.
    Nigbati o ba n wọle si aaye ipari, olumulo ti forukọsilẹ ati tẹ sinu eto, lẹhinna ifiranṣẹ rẹ gba. Mejeeji olumulo ati ifiranṣẹ ti wa ni titẹ sinu ibudo ti o wọpọ, lati eyiti awọn ifiranṣẹ ti firanṣẹ siwaju (si iwaju ti a ṣe alabapin), ati pe ti olumulo ba tilekun asopọ (rasipibẹri tabi iwaju), lẹhinna iforukọsilẹ rẹ ti fagile ati yọkuro lati ibudo.

    OpenVINO hackathon: idanimọ ohun ati awọn ẹdun lori Rasipibẹri Pi
    A n duro de asopọ lati ẹhin

    Iwaju-ipari jẹ ohun elo wẹẹbu ti a kọ ni JavaScript ni lilo ile-ikawe React lati yara ati irọrun ilana idagbasoke. Idi ti ohun elo yii ni lati wo data ti o gba nipa lilo awọn algoridimu ti n ṣiṣẹ ni apa ẹhin-ipari ati taara lori Rasipibẹri Pi. Oju-iwe naa ni ipa-ọna apakan ti a ṣe imuse nipa lilo ipa-ọna ipa-ọna, ṣugbọn oju-iwe akọkọ ti iwulo ni oju-iwe akọkọ, nibiti a ti gba ṣiṣan data lemọlemọfún ni akoko gidi lati ọdọ olupin ni lilo imọ-ẹrọ WebSocket. Rasipibẹri Pi ṣe awari ohun kan, pinnu boya o jẹ ti eniyan kan pato lati ibi ipamọ data ti o forukọsilẹ, ati firanṣẹ atokọ iṣeeṣe kan si alabara. Onibara ṣafihan data tuntun ti o wulo, ṣafihan avatar ti eniyan ti o ṣee ṣe pupọ julọ sọrọ sinu gbohungbohun, ati imolara pẹlu eyiti o sọ awọn ọrọ naa.

    OpenVINO hackathon: idanimọ ohun ati awọn ẹdun lori Rasipibẹri Pi
    Oju-iwe ile pẹlu awọn asọtẹlẹ imudojuiwọn

    ipari

    Ko ṣee ṣe lati pari ohun gbogbo bi a ti pinnu, a ko ni akoko nikan, nitorinaa ireti akọkọ wa ninu demo, pe ohun gbogbo yoo ṣiṣẹ. Ninu igbejade wọn sọrọ nipa bi ohun gbogbo ṣe n ṣiṣẹ, kini awọn awoṣe ti wọn mu, kini awọn iṣoro ti wọn ba pade. Nigbamii ti apakan demo - awọn amoye rin ni ayika yara ni aṣẹ laileto ati sunmọ ẹgbẹ kọọkan lati wo apẹrẹ iṣẹ. Wọn tun beere awọn ibeere fun wa, gbogbo eniyan dahun apakan wọn, wọn fi wẹẹbu silẹ lori kọǹpútà alágbèéká, ati pe ohun gbogbo ṣiṣẹ gaan bi o ti ṣe yẹ.

    Jẹ ki n ṣe akiyesi pe apapọ iye owo ojutu wa jẹ $150:

    • Rasipibẹri Pi 3 ~ $35
    • Google AIY Voice Bonnet (o le gba ọya agbohunsoke) ~ 15$
    • Intel NCS 2 ~ 100$

    Bi o ṣe le ni ilọsiwaju:

    • Lo iforukọsilẹ lati ọdọ alabara - beere lati ka ọrọ ti o ṣẹda laileto
    • Ṣafikun awọn awoṣe diẹ sii: o le pinnu akọ ati ọjọ-ori nipasẹ ohun
    • Yatọ si awọn ohun ti n dun nigbakanna (diarization)

    Ibi ipamọ: https://github.com/vladimirwest/OpenEMO

    OpenVINO hackathon: idanimọ ohun ati awọn ẹdun lori Rasipibẹri Pi
    A ti rẹ wa ṣugbọn dun

    Ni ipari, Emi yoo fẹ lati sọ o ṣeun si awọn oluṣeto ati awọn olukopa. Lara awọn iṣẹ akanṣe ti awọn ẹgbẹ miiran, a tikalararẹ fẹran ojutu fun ibojuwo awọn aaye idaduro ọfẹ. Fun wa, o jẹ iriri itutu nla ti immersion ninu ọja ati idagbasoke. Mo nireti pe awọn iṣẹlẹ ti o nifẹ si ati siwaju sii yoo waye ni awọn agbegbe, pẹlu lori awọn akọle AI.

orisun: www.habr.com

Fi ọrọìwòye kun