OpenVINO hackathon: ag aithneachadh guth agus faireachdainnean air Raspberry Pi

Samhain 30 - Dùbhlachd 1 ann an Nizhny Novgorod chaidh a chumail Luchdaich a-nuas openVINO hackathon. Chaidh iarraidh air com-pàirtichean prototype de fhuasgladh toraidh a chruthachadh a’ cleachdadh pasgan inneal Intel OpenVINO. Mhol an luchd-eagrachaidh liosta de chuspairean tuairmseach a dh’ fhaodadh a bhith air an stiùireadh le bhith a’ taghadh gnìomh, ach dh’ fhan an co-dhùnadh deireannach aig na sgiobaidhean. A bharrachd air an sin, chaidh cleachdadh mhodalan nach eil air an toirt a-steach don toradh a bhrosnachadh.

OpenVINO hackathon: ag aithneachadh guth agus faireachdainnean air Raspberry Pi

San artaigil seo innsidh sinn dhut mu mar a chruthaich sinn ar prototype den toradh, leis an do ghabh sinn a’ chiad àite mu dheireadh.

Ghabh còrr is 10 sgiobaidhean pàirt anns an hackathon. Tha e math gun tàinig cuid dhiubh à sgìrean eile. B’ e ionad an hackathon an togalach “Kremlinsky on Pochain”, far an deach seann dhealbhan de Nizhny Novgorod a chrochadh a-staigh, ann an entourage! (Tha mi gad chuimhneachadh gu bheil prìomh oifis Intel aig an àm seo suidhichte ann an Nizhny Novgorod). Fhuair com-pàirtichean 26 uairean airson còd a sgrìobhadh, agus aig an deireadh bha aca ri am fuasgladh aca a thaisbeanadh. B’ e buannachd eile a bh’ ann gun robh seisean demo an làthair gus dèanamh cinnteach gun deach a h-uile dad a bha san amharc a chuir an gnìomh agus nach robh beachdan fhathast anns an taisbeanadh. Merch, greimean-bìdh, biadh, bha a h-uile dad ann cuideachd!

A bharrachd air an sin, thug Intel seachad camarathan gu roghnach, Raspberry PI, Neural Compute Stick 2.

Taghadh gnìomh

Is e aon de na pàirtean as duilghe de bhith ag ullachadh airson hackathon cruth an-asgaidh a bhith a’ taghadh dùbhlan. Cho-dhùin sinn sa bhad rudeigin a chruthachadh nach robh fhathast san toradh, oir thuirt an naidheachd gun robh fàilte mhòr air seo.

An dèidh mion-sgrùdadh modalan, a tha air a ghabhail a-steach don toradh anns an fhoillseachadh gnàthach, tha sinn a’ tighinn chun cho-dhùnadh gu bheil a ’mhòr-chuid dhiubh a’ fuasgladh diofar dhuilgheadasan lèirsinn coimpiutair. A bharrachd air an sin, tha e gu math duilich duilgheadas a lorg ann an raon lèirsinn coimpiutair nach gabh fhuasgladh le bhith a ’cleachdadh OpenVINO, agus eadhon ged a dh’ fhaodar fear a chruthachadh, tha e duilich modalan ro-thrèanadh a lorg san raon phoblach. Bidh sinn a 'co-dhùnadh a bhith a' cladhach ann an taobh eile - a dh'ionnsaigh giollachd cainnt agus anailis. Beachdaichidh sinn air obair inntinneach a thaobh a bhith ag aithneachadh faireachdainnean bho chainnt. Feumar a ràdh gu bheil modal aig OpenVINO mu thràth a bhios a ’dearbhadh faireachdainnean neach stèidhichte air an aghaidh, ach:

  • Ann an teòiridh, tha e comasach algairim aonaichte a chruthachadh a bhios ag obair air an dà chuid fuaim agus ìomhaigh, a bu chòir àrdachadh ann an cruinneas a thoirt seachad.
  • Mar as trice bidh ceàrn seallaidh cumhang aig camarathan; tha feum air barrachd air aon chamara gus farsaingeachd mhòr a chòmhdach; chan eil an leithid de chuingealachadh aig fuaim.

Leasaichidh sinn am beachd: gabhamaid am beachd airson an roinn reic mar bhunait. Faodaidh tu sàsachd luchd-cleachdaidh a thomhas aig àiteachan-pàighidh stòr. Ma tha aon den luchd-ceannach mì-riaraichte leis an t-seirbheis agus a 'tòiseachadh a' togail an tòna, faodaidh tu fios a chuir chun rianadair airson cuideachadh sa bhad.
Anns a ’chùis seo, feumaidh sinn aithne guth daonna a chuir ris, leigidh seo leinn eadar-dhealachadh a dhèanamh air luchd-obrach stòr bho luchd-ceannach agus mion-sgrùdaidhean a thoirt seachad airson gach neach. Uill, a bharrachd air an sin, bidh e comasach sgrùdadh a dhèanamh air giùlan luchd-obrach a ’bhùth fhèin, measadh a dhèanamh air àile na sgioba, tha e math!

Bidh sinn a’ cur ri chèile na riatanasan airson ar fuasgladh:

  • Meud beag an inneal targaid
  • Gnìomh fìor-ùine
  • Prìs ìseal
  • Scalability furasta

Mar thoradh air an sin, tha sinn a 'taghadh Raspberry Pi 3 c mar an inneal targaid Intel NCS 2.

An seo tha e cudromach toirt fa-near aon fheart cudromach de NCS - bidh e ag obair as fheàrr le ailtireachd àbhaisteach CNN, ach ma dh’ fheumas tu modal a ruith le sreathan àbhaisteach air, an uairsin bi an dùil optimization ìre ìosal.

Tha dìreach aon rud beag ri dhèanamh: feumaidh tu microfòn fhaighinn. Nì microfòn USB cunbhalach, ach cha bhith e a’ coimhead math còmhla ris an RPI. Ach eadhon an seo tha am fuasgladh gu litireil “na laighe faisg air làimh.” Gus guth a chlàradh, tha sinn a’ co-dhùnadh am bòrd Voice Bonnet a chleachdadh bhon chidsin Inneal Guth Google AIY, air a bheil microfòn stereo uèirleas.

Luchdaich a-nuas Raspbian bho Stòr-tasgaidh phròiseactan AIY agus luchdaich suas e gu draibhear flash, dèan deuchainn gu bheil am micreofon ag obair leis an àithne a leanas (clàraichidh e claisneachd 5 diogan a dh’ fhaid agus sàbhailidh e gu faidhle):

arecord -d 5 -r 16000 test.wav

Bu chòir dhomh a thoirt fa-near sa bhad gu bheil am micreofon gu math mothachail agus a’ togail fuaim gu math. Gus seo a chàradh, rachamaid gu alsamixer, tagh innealan Glac agus lughdaich ìre nan comharran cuir a-steach gu 50-60%.

OpenVINO hackathon: ag aithneachadh guth agus faireachdainnean air Raspberry Pi
Bidh sinn ag atharrachadh a ’chuirp le faidhle agus bidh a h-uile dad a’ freagairt, faodaidh tu eadhon a dhùnadh le mullach

A’ cur putan comharra ris

Fhad ‘s a bheir sinn an AIY Voice Kit às a chèile, tha sinn a’ cuimhneachadh gu bheil putan RGB ann, agus faodaidh an backlight a bhith air a smachdachadh le bathar-bog. Bidh sinn a’ lorg “Google AIY Led” agus a’ lorg sgrìobhainnean: https://aiyprojects.readthedocs.io/en/latest/aiy.leds.html
Carson nach cleachd thu am putan seo gus am faireachdainn aithnichte a thaisbeanadh, chan eil againn ach 7 clasaichean, agus tha 8 dathan air a’ phutan, dìreach gu leòr!

Bidh sinn a ’ceangal a’ phutan tro GPIO gu Voice Bonnet, luchdaich na leabharlannan riatanach (tha iad mu thràth air an stàladh anns a ’phasgan cuairteachaidh bho phròiseactan AIY)

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

Cruthaichidh sinn dict anns am bi dath co-chosmhail aig gach faireachdainn ann an cruth Tuple RGB agus nì den chlas aiy.leds.Leds, tro am bi sinn ag ùrachadh an dath:

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

Agus mu dheireadh, às deidh gach ro-innse ùr de fhaireachdainn, bheir sinn ùrachadh air dath a ’phutan a rèir e (le iuchair).

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

OpenVINO hackathon: ag aithneachadh guth agus faireachdainnean air Raspberry Pi
Putan, losgadh!

Ag obair le guth

Cleachdaidh sinn pyaudio gus an sruth a ghlacadh bhon mhaicreafòn agus webrtcvad gus fuaim a shìoladh agus guth a lorg. A bharrachd air an sin, cruthaichidh sinn ciudha ris am bi sinn a’ cur ris agus a’ toirt air falbh earrannan guth gu neo-chinnteach.

Leis gu bheil cuingealachadh aig webrtcvad air meud a ’chriomag a chaidh a thoirt seachad - feumaidh e a bhith co-ionann ri 10/20/30ms, agus chaidh trèanadh a’ mhodail airson faireachdainnean aithneachadh (mar a dh’ ionnsaicheas sinn nas fhaide air adhart) a dhèanamh air stòr-dàta 48kHz, nì sinn glacadh pìosan de mheud 48000 × 20ms / 1000 × 1 (mono) = 960 bytes. Tillidh Webrtcvad Fìor / Meallta airson gach aon de na pìosan sin, a tha a rèir làthaireachd no neo-làthaireachd bhòt sa phìos.

Leig leinn an loidsig a leanas a chur an gnìomh:

  • Cuiridh sinn ris an liosta na pìosan sin far a bheil bhòt ann; mura h-eil bhòt ann, àrdaichidh sinn a’ chunntair de phìosan falamh.
  • Mas e an cuntair de chnapan falamh > = 30 (600 ms), an uairsin bidh sinn a’ coimhead air meud liosta nan cnapan cruinnichte; mas e > 250 a th’ ann, cuiridh sinn ris a’ chiudha e; mura h-eil, tha sinn den bheachd gu bheil an fhaid ann den chlàr chan eil e gu leòr airson a bhiadhadh don mhodail gus an neach-labhairt aithneachadh.
  • Ma tha an àireamh de chnapan falamh fhathast <30, agus gu bheil meud liosta nan cnapan cruinnichte nas àirde na 300, cuiridh sinn a’ chriomag ris a’ chiudha airson ro-innse nas cinntiche. (seach gu bheil faireachdainnean buailteach atharrachadh thar ùine)

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

Tha an t-àm ann coimhead airson modalan ro-thrèanadh san raon phoblach, rachaibh gu github, Google, ach cuimhnich gu bheil cuingealachadh againn air an ailtireachd a thathar a’ cleachdadh. Is e pàirt caran duilich a tha seo, oir feumaidh tu na modailean a dhearbhadh air an dàta cuir a-steach agad, agus a bharrachd air sin, an tionndadh gu cruth a-staigh OpenVINO - IR (Riochdachadh Eadar-mheadhanach). Dh'fheuch sinn mu 5-7 diofar fhuasglaidhean bho github, agus ma dh'obraich am modail airson faireachdainnean aithneachadh sa bhad, an uairsin le aithneachadh guth bha againn ri feitheamh nas fhaide - bidh iad a 'cleachdadh ailtireachd nas iom-fhillte.

Bidh sinn a’ cur fòcas air na leanas:

  • Mothachaidhean bhon ghuth - https://github.com/alexmuhr/Voice_Emotion
    Bidh e ag obair a rèir a ’phrionnsapail a leanas: tha claisneachd air a ghearradh ann an earrannan de mheud sònraichte, airson gach aon de na h-earrannan sin a thaghas sinn MFCC agus an uairsin cuir a-steach iad mar chur-a-steach gu CNN
  • Aithneachadh guth - https://github.com/linhdvu14/vggvox-speaker-identification
    An seo, an àite MFCC, bidh sinn ag obair le spectrogram, às deidh FFT bidh sinn a’ biathadh an comharra gu CNN, far am faigh sinn aig an toradh riochdachadh vectar den ghuth.

An uairsin bruidhnidh sinn mu bhith ag atharrachadh mhodalan, a ’tòiseachadh le teòiridh. Tha grunn mhodalan ann an OpenVINO:

  • Fosgail Model Zoo, modailean às an gabhadh an cleachdadh agus an toirt a-steach don toradh agad
  • Modail Optimzer, leis an urrainn dhut modail a thionndadh bho dhiofar chruthan frèam (Tensorflow, ONNX msaa) gu cruth Riochdachaidh Eadar-mheadhanach, leis an obraich sinn nas fhaide.
  • Leigidh Inference Engine leat modalan a ruith ann an cruth IR air pròiseasairean Intel, chips Myriad agus luathadairean Neural Compute Stick
  • An dreach as èifeachdaiche de OpenCV (le taic Inference Engine)
    Tha gach modail ann an cruth IR air a mhìneachadh le dà fhaidhle: .xml agus .bin.
    Tha modalan air an tionndadh gu cruth IR tro Model Optimizer mar a leanas:

    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 a’ leigeil leat an cruth dàta a thaghadh leis am bi am modail ag obair. Tha FP32, FP16, INT8 a’ faighinn taic. Faodaidh taghadh an seòrsa dàta as fheàrr àrdachadh coileanaidh math a thoirt seachad.
    --input_shape a’ comharrachadh meud an dàta a-steach. Tha e coltach gu bheil an comas atharrachadh gu dinamach an làthair anns an C ++ API, ach cha do chladhaich sinn cho fada sin agus dìreach shuidhich sinn e airson aon de na modalan.
    An uairsin, feuchaidh sinn ris a’ mhodail a chaidh a thionndadh mu thràth a luchdachadh ann an cruth IR tron ​​​​mhodal DNN gu OpenCV agus a chuir air adhart thuige.

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

    Leigidh an loidhne mu dheireadh sa chùis seo dhut àireamhachadh ath-stiùireadh chun Neural Compute Stick, thèid àireamhachadh bunaiteach a dhèanamh air a’ phròiseasar, ach a thaobh an Raspberry Pi chan obraich seo, bidh feum agad air maide.

    An ath rud, tha an loidsig mar a leanas: bidh sinn a’ roinn ar claisneachd gu uinneagan de mheud sònraichte (dhuinne tha e 0.4 s), bidh sinn a’ tionndadh gach aon de na h-uinneagan sin gu MFCC, a bhios sinn an uairsin a’ biathadh don ghriod:

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

    An ath rud, gabhamaid an clas as cumanta airson a h-uile uinneag. Fuasgladh sìmplidh, ach airson hackathon chan fheum thu rudeigin a tha ro fhurasta a lorg, dìreach ma tha ùine agad. Tha tòrr obair againn ri dhèanamh fhathast, mar sin gluaisidh sinn air adhart - dèiligidh sinn ri aithneachadh guth. Feumar stòr-dàta de sheòrsa air choreigin a dhèanamh anns am biodh spectrograms de ghuthan ro-chlàraichte air an stòradh. Leis nach eil mòran ùine air fhàgail, fuasglaidh sinn a’ chùis seo mar as fheàrr as urrainn dhuinn.

    Is e sin, bidh sinn a’ cruthachadh sgriobt airson earrann guth a chlàradh (bidh e ag obair san aon dòigh ris a chaidh a mhìneachadh gu h-àrd, is ann dìreach nuair a thèid stad a chuir air bhon mheur-chlàr a shàbhaileas e an guth gu faidhle).

    Feuch sinn:

    python3 voice_db/record_voice.py test.wav

    Bidh sinn a’ clàradh guthan grunn dhaoine (anns a’ chùis againn, triùir bhall den sgioba)
    An ath rud, airson gach guth clàraichte bidh sinn a’ dèanamh cruth-atharrachadh nas luaithe nas luaithe, a’ faighinn spectrogram agus ga shàbhaladh mar raon numpy (.npy):

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

    Tuilleadh mion-fhiosrachaidh anns an fhaidhle create_base.py
    Mar thoradh air an sin, nuair a ruitheas sinn am prìomh sgriobt, gheibh sinn in-ghabhail bho na spectrograman sin aig an fhìor thoiseach:

    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)

    Às deidh dhuinn an in-ghabhail fhaighinn bhon roinn fhuaimneach, bidh e comasach dhuinn faighinn a-mach cò dha a bhuineas e le bhith a ’toirt an astar cosine bhon trannsa gu na guthan uile san stòr-dàta (mar as lugha, is ann as coltaiche) - airson an demo shuidhich sinn an stairsnich gu 0.3):

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

    Aig a ’cheann thall, bu mhath leam a thoirt fa-near gu robh an astar co-dhùnaidh luath agus air a dhèanamh comasach 1-2 a bharrachd mhodalan a chuir ris (airson sampall 7 diogan a dh’ fhaid thug e 2.5 airson co-dhùnadh). Cha robh tìde againn tuilleadh modalan ùra a chur ris agus chuir sinn fòcas air a bhith a’ sgrìobhadh prototype den tagradh lìn.

    Iarrtas lìn

    Puing chudromach: bidh sinn a’ toirt router leinn bhon taigh agus a’ stèidheachadh ar lìonra ionadail, bidh e a’ cuideachadh le bhith a’ ceangal an inneal agus na coimpiutairean-glùine thairis air an lìonra.

    Tha an backend na sheanal teachdaireachd deireadh-gu-deireadh eadar an aghaidh agus Raspberry Pi, stèidhichte air teicneòlas websocket (http over tcp protocol).

    Is e a’ chiad ìre fiosrachadh giullachd fhaighinn bho sùbh-craoibhe, is e sin, ro-innsearan air am pacadh ann an json, a thèid a shàbhaladh san stòr-dàta letheach slighe tron ​​​​turas aca gus an tèid staitistig a chruthachadh mu chùl-fhiosrachadh tòcail an neach-cleachdaidh airson na h-ùine seo. Thèid am pacaid seo an uairsin a chuir chun aghaidh, a chleachdas ballrachd agus a gheibh pacaidean bho phuing crìochnachaidh an t-socket lìn. Tha an uidheamachd backend gu lèir air a thogail anns a’ chànan golang; chaidh a thaghadh leis gu bheil e gu math freagarrach airson gnìomhan asyncronach, a bhios goroutines a’ làimhseachadh gu math.
    Nuair a gheibh e cothrom air a’ phuing crìochnachaidh, tha an neach-cleachdaidh clàraichte agus air a chuir a-steach don structar, agus an uairsin gheibhear an teachdaireachd aige. Tha an dà chuid an neach-cleachdaidh agus an teachdaireachd air an cur a-steach do mhòr-ionad cumanta, às am bi teachdaireachdan air an cur nas fhaide mu thràth (chun aghaidh fo-sgrìobhaidh), agus ma dhùineas an neach-cleachdaidh an ceangal (sùbh-craoibhe no aghaidh), thèid an fho-sgrìobhadh aige a chuir dheth agus thèid a thoirt air falbh. am mol.

    OpenVINO hackathon: ag aithneachadh guth agus faireachdainnean air Raspberry Pi
    Tha sinn a’ feitheamh ri ceangal bhon chùl

    Is e tagradh lìn a th’ ann an Front-end a chaidh a sgrìobhadh ann an JavaScript a’ cleachdadh leabharlann React gus am pròiseas leasachaidh a luathachadh agus a dhèanamh nas sìmplidhe. Is e adhbhar an tagraidh seo sealladh a dhèanamh air dàta a gheibhear le bhith a’ cleachdadh algorithms a tha a’ ruith air an taobh chùil agus gu dìreach air an Raspberry Pi. Tha slighe roinneil air an duilleag air a chuir an gnìomh le bhith a ’cleachdadh react-router, ach is e am prìomh dhuilleag inntinneach am prìomh dhuilleag, far am faighear sruth leantainneach de dhàta ann an àm fìor bhon t-seirbheisiche a’ cleachdadh teicneòlas WebSocket. Bidh Raspberry Pi a’ lorg guth, a’ dearbhadh am buin e do neach sònraichte bhon stòr-dàta clàraichte, agus a’ cur liosta coltachd chun neach-dèiligidh. Bidh an neach-dèiligidh a ’taisbeanadh an dàta buntainneach as ùire, a’ taisbeanadh avatar an neach as coltaiche a bhruidhinn a-steach don mhicreofon, a bharrachd air an fhaireachdainn leis am bi e ag ainmeachadh nam faclan.

    OpenVINO hackathon: ag aithneachadh guth agus faireachdainnean air Raspberry Pi
    Duilleag dachaigh le ro-innse ùraichte

    co-dhùnadh

    Cha robh e comasach a h-uile càil a choileanadh mar a bha dùil, dìreach cha robh ùine againn, agus mar sin bha am prìomh dòchas anns an demo, gun obraicheadh ​​​​a h-uile càil. Anns an taisbeanadh bhruidhinn iad air mar a tha a h-uile càil ag obair, dè na modailean a ghabh iad, dè na duilgheadasan a choinnich iad. An ath rud bha am pàirt demo - choisich eòlaichean timcheall an t-seòmair ann an òrdugh air thuaiream agus chaidh iad gu gach sgioba gus sùil a thoirt air a ’phròtacal obrach. Chuir iad ceistean oirnn cuideachd, fhreagair a h-uile duine am pàirt, dh’ fhàg iad an lìon air an laptop, agus dh’ obraich a h-uile càil mar a bha dùil.

    Thoir an aire dhomh gur e $150 cosgais iomlan an fhuasglaidh againn:

    • Raspberry Pi 3 ~ $35
    • Bonnet guth Google AIY (faodaidh tu cìs ath-labhairt a ghabhail) ~ 15$
    • Intel NCS 2 ~ 100$

    Ciamar a leasachadh:

    • Cleachd clàradh bhon neach-dèiligidh - iarr an teacsa a thèid a chruthachadh air thuaiream a leughadh
    • Cuir beagan mhodalan a bharrachd ris: faodaidh tu gnè agus aois a dhearbhadh le guth
    • Sgar guthan fuaimneach aig an aon àm (latha-latha)

    Stòr-tasgaidh: https://github.com/vladimirwest/OpenEMO

    OpenVINO hackathon: ag aithneachadh guth agus faireachdainnean air Raspberry Pi
    Sgith ach toilichte tha sinn

    Gu crìch, bu mhath leam taing a thoirt don luchd-eagrachaidh agus do na com-pàirtichean. Am measg phròiseactan sgiobaidhean eile, bu toil leinn gu pearsanta am fuasgladh airson sùil a chumail air àiteachan pàircidh an-asgaidh. Dhuinne, b’ e eòlas fìor fhionnar a bh’ ann de bhogadh ann an toradh agus leasachadh. Tha mi an dòchas gun tèid barrachd is barrachd thachartasan inntinneach a chumail anns na roinnean, a’ gabhail a-steach cuspairean AI.

Source: www.habr.com

Cuir beachd ann