Samhain 30 - DĂšbhlachd 1 ann an Nizhny Novgorod chaidh a chumail. 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.

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 , 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 .
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 , air a bheil microfòn stereo uèirleas.
Luchdaich a-nuas Raspbian bho 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.wavBu 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%.

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:
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 RgbLedsCruthaichidh 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])))
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 -
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 agus an uairsin cuir a-steach iad mar chur-a-steach gu CNN - Aithneachadh guth -
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_typeaâ 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_shapeaâ 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.wavBidh 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.
Tha sinn aâ feitheamh ri ceangal bhon chĂšlIs 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.

Duilleag dachaigh le ro-innse Ăšraichteco-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:

Sgith ach toilichte tha sinnGu 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



