INHOUDSOPGAWE:
- Stap 1: Weet oor die wedstryd
- Stap 2: Waar het ek van die dinge geweet?
- Stap 3: Laat ons begin
- Stap 4: Hoe werk dit eintlik?
- Stap 5: Laat ons kodeer …………
- Stap 6: Klasse
- Stap 7: Funksies
- Stap 8: Die sake kan aangepak word deur ………
- Stap 9: Soek 'n sleutelwoord in die gebruikersinvoer
- Stap 10: Gevolgtrekking
Video: Stem geaktiveerde assistent - MAX: 10 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:27
Hey, in hierdie instruksies gaan ek praat oor hoe om 'n chat-bot MAX te maak (myself genoem !!!)
Met 'n mate van implementering kan u hierdie chatbot -stem beheer, of met die gebruik van verskillende sagteware kan u dit as 'n stemassistent maak. Ek hier gaan nie daaroor praat nie, want elkeen kan hierdie implementering maklik maak.
So ondersteun almal my asseblief ….
My eerste Instrueerbare !!!!!!!
Voel senuweeagtig oor wat gaan gebeur …………….
Stap 1: Weet oor die wedstryd
Hallo ingenieurs en ontwerpers ……..
Ek is self 'n rekenaarwetenskapstudent en hou altyd daarvan om speletjies te speel en is altyd geïnspireer op rekenaars. As ek kortliks praat, is ek mal daaroor om te weet hoe al hierdie dinge in die huidige werk werk. !!!) om die dinge te soek en te leer.
So kom ek eendag voor die skerm van Instructables. Dit het my regtig geamuseer deur verskillende projekte met 'n verskeidenheid idees oor verskillende aspekte. Daarna het ek van daardie dag af op hoogte gehou. wêreld.
STEMGeaktiveerde UITDAGING is my eerste platform met betrekking tot die skryf van 'n Instructable.
Pryse het my baie vermaak (ja !!! te veel ……..).
Ek wil ook my kennis op die gebied van rekenaars en die tegnologie daarvan met ander deel oor hoe verskillende dinge eintlik werk.
In hierdie instruksies wys ek jou hoe om jou eie stem -geaktiveerde assistent te bou.
Aangesien dit my eerste instruksies is, kan daar soveel foute wees (alhoewel ek dink dat dit alles opgelos is), so vergeef dit.
SO …
Laat ons die reis begin ………………
Stap 2: Waar het ek van die dinge geweet?
Dit is 'n belangrike vraag wat ek dink die meeste van u gedagtes moontlik deurgemaak het ………..
Ek het 'n groot passie vir kunsmatige intelligensie [AI] uit my skool, en ek het baie gesoek na hulpbronne om te studeer en om self 'n model te ontwikkel.
Aanvanklik was dit baie moeilik (ware toestand), want ek het verstaan dat dit 'n baie groot onderwerp was wat glad nie maklik is om te hanteer nie.
Die boeke wat opgesoek het, sluit in:
- Kunsmatige intelligensie 'n moderne benadering
- Kunsmatige. Intelligensie.in.die.21ste. Eeu2de. Edisie
- Diep leer
Dit is baie goeie boeke (ja sekerlik), maar dit is glad nie maklik om die dinge wat daaroor geskryf is te verstaan nie, en ek het dit eenkant gehou en gaan soek na die hulpbronne wat 'n kort idee gee van wat dit verteenwoordig werklik en maniere om dit te bereik.
Toe vind ek 'n belangstelling daarin. Deur die vakansie na skool het ek dieper begin leer.
Op daardie stadium het ek ook verskillende programmeertale (C ++, C, Python, Java….) Geleer, wat ook baie interessant is.
By die lees van meer oor die onderwerp het ek een belangrike ding verstaan ………………..
Die programmeertale is die basis vir elke masjienleerproses
Masjienleer is die toepassing van AI
Met 'n groot begrip van programmeertale en verskillende dinge wat deur die programmeerder gedoen kan word, om 'n rekenaar te maak om iets vir ons te doen.
Daarom het ek besluit om 'n goeie basis te skep vir die tale wat my die begrippe in die boek wat ek reeds genoem het, verstaan
U kan dit ook doen ……
Daar is soveel webwerwe op die internet om programmeertale vrylik aan te leer
U kan dus op die internet blaai om meer daarvan te verstaan as u wil ………
Stap 3: Laat ons begin
Voordat ek begin skryf het, het ek daaraan gedink om iets te skryf wat soortgelyk is aan:
- Mense wat 'n ervaring met kodering het
- Mense sonder koderingsagtergrond
So ek dink ek het die ding gedoen (hopelik) sonder enige foute.
Ek het dus besluit om 'n kletsbot te bou wat met die gebruiker kan praat en volgens ons praatjies kan reageer.
Die program (stel instruksies) kan nie alleen dink nie. Dit het 'n databasis ('n plek waar data gestoor is) met feite en reëls, wat tydens die gesprek deurgesoek word om die beste moontlike antwoord te gee wat met die gebruiker verband hou.
Dit werk volgens 'n proses wat ooreenstem met die aangeleenthede, maar in seldsame gevalle word 'n hele sin by 'n volledige sin aangepas.
Stap 4: Hoe werk dit eintlik?
Stap 1:
MAX vind uit of die gebruiker nul -insette gelewer het. As die gebruiker op so 'n manier ingevoer word, neem dit die feit uit die statiese databasis om te reageer.
Jammer ……
Ek het vergeet om te sê,
Statiese databasis: die plek waar ingeboude antwoorde gestoor word. Antwoorde soos:
1. As MAX nie verstaan waaroor die gebruiker praat nie.
2. Wanneer die gebruiker homself herhaal.
3. Vir groetverklarings.
4. As die gebruiker niks tik nie en net op Enter druk.
Trefwoord: woorde met spesiale betekenis.
Stap 2:
Daar is 'n paar ingeboude antwoorde wat MAX maklik en maklik kan herken. Dit vind die teenwoordigheid van so 'n sin na die identifisering van die gebruikersinvoer en onthou die gepaardgaande sleutelwoord.
Stap 3:
As daar geen ingeboude sin gevind word nie, selfs nadat die gegewe sin gefragmenteer is, dan soek MAX na die spesifieke sleutelwoord om die konteks te definieer. As daar geen konteks gevind word nie, is dit die volgende doel om die gebruiker doelbewus op 'n spesifieke manier oor die onderwerp te laat praat.
Stap 4:
Uit die statiese databasis waaroor ons reeds gepraat het, haal dit die antwoord op wat afhang van waaroor die gebruiker gepraat het.
Stap 5:
Ek het 'n behoefte om die woorde te verander, dit sal dit self doen (soos omskakeling van MY na JOU, ens.)
Stap 5: Laat ons kodeer …………
Ek gebruik Turbo C IDE 3.0, aangesien dit die IDE [Integrated Developmental Environment] is
Laat ons voor die kodering die struktuur van 'n voorbeelddatalêer sien.
MAX herken sekere sleutelwoorde.
As hierdie sleutelwoorde in die invoer van die gebruiker gevind word, word 'n ooreenstemmende antwoord uit die datalêer gekies en gekies en op die skerm vertoon.
'N Sleutelwoord word in die datalêer van die antwoorde geskei deur @ KWD @ token.
Token is 'n klein deel van elke programmeringsaspek.
Hierdie teken dui aan dat die volgende reël 'n sleutelwoord is en nie 'n antwoord nie.
@ KWD@ HALLO
HI HOE GAAN DIT MET JOU
HALLO LIEFIE !
DIT GAAN GOED MET MY
HOE WAS JOU WERK?
HOE OUD IS JY?
EK SAL
JY SAL DIT DOEN. EK GLO DIT OOK …
SAL JY DIT KAN DOEN?
SAL JY MY VERTROU?
JA
IS JY SEKER ?
HOE KAN JY SO SEKER WEES?
GEEN
Dit lyk asof u baie pessimisties is.
MOET NOOIT NEE S… NIE …
MOET NOOIT NOOIT SÊ NIE
MOET NOOIT onbeskof wees nie
MOET NOOIT ARROGANT wees NIE !!!!
MOET NOOIT Sê EK KAN DIT NIE
MOET NOOIT OPTIMISTIES WEES NIE
REKENAAR
EK WEET HOE OM TE WERK OP REKENAAR.
U GEBRUIK tans 'n REKENAAR. REGS?
Byvoorbeeld, 'Hallo', uit die woordeboek hierbo, gee MAX een van die volgende antwoorde:
HI, HOE IS JULLE GELIEFDE!
DIT GAAN GOED MET MY
HOE WAS JOU WERK?
HOE OUD IS JY?
Stap 6: Klasse
Sodra hierdie ding duidelik is, laat ons nou die datastrukture definieer wat ons gaan gebruik.
Ons skep twee klasse:
progstr - Dit word gebruik om die invoerverwante inligting van die gebruiker te stoor.
resp - Dit word gebruik om die inligting oor die verskillende antwoorde op te slaan
klasprogram {
publiek:
char userip [MAX_USER_INPUT];
char navraag [30];
int sleutelfond;
int keyno;
int nullip;
// konstrukteur
progstr () {keyno = -1; nullip = 0; sleutelfond = 0;
}
} ip;
klas resp
{
int tot_resp;
int last_resp;
char antwoord [MAX_RESP_NO] [MAX_RESP_LEN];
char woord [MAX_KWD_LEN];
publiek:
// konstrukteur
resp ()
{
tot_resp = 0;
laaste_resp = -1;
}
int getcount ()
{
stuur last_resp;
}
leë byvoegwoord (tekenstr. [MAX_KWD_LEN])
{
strcpy (woord, str);
}
char * getword ()
{
terugkeer woord;
}
void addresp (char str [MAX_RESP_LEN])
{
strcpy (antwoord [++ last_resp], str);
}
// later gedefinieer
leegte display_resp (int num);
void quit_display_resp (int num);
};
As ons kyk na die eerste klas, Die karakter array userip word gebruik om die sin wat deur die gebruiker verskaf word, op te slaan.
'N Ander sleutelwoord word gebruik om die sleutelwoord, indien enige, in die invoer te stoor. As 'n sleutelwoord gevind word, maak ons die sleutel tot 1 anders, dit bly 0, aangesien dit in die Constructor in 0 geïnitialiseer word.
keyno stoor die ooreenstemmende sleutelnommer van die ooreenstemmende sleutelwoord.
nullip dui aan of die gebruiker 'n Null -invoer gegee het, dws hy druk net op enter sonder om iets anders te doen.
Laat ons nou by die tweede klas kom, resp.
Die eerste data lid, tot_resp dui die aantal totale antwoorde vir 'n gegewe sleutelwoord aan.
Die antwoorde word eintlik gestoor in antwoorde [MAX_RESP_NO] [MAX_RESP_LEN] en die ooreenstemmende sleutelwoord word in die skikkingwoord gestoor.
Konstrukteur: Dit word gebruik om die totale aantal antwoorde op 0. te initialiseer. Waarom last_resp geïnitialiseer word na -1, sal duidelik wees as u na die funksie add_resp kyk.
int getcount ():
Hierdie funksie word gebruik om 'n telling te kry van hoeveel antwoorde daar vir 'n gegewe sleutelwoord is.
leë byvoegwoord (karakterstr [MAX_KWD_LEN]):
Dit word gebruik om 'n sleutelwoord by te voeg.
char * getword ():
Word gebruik om die sleutelwoord vir 'n bepaalde voorwerp van klas, resp.
leë addresp (…):
Dit word gebruik om 'n antwoord by te voeg wat ooreenstem met 'n gegewe sleutelwoord.
leegte display_resp (int):
Dit word gebruik om die antwoord aan die gebruiker te wys wat ooreenstem met 'n gegewe indeksnommer vir die antwoorde. (eintlik doen dit meer as dit!).
void quit_display_resp (int):
Die verskil tussen hierdie funksie en die bogenoemde funksie is dat dit uiteindelik gebruik word wanneer die gebruiker ophou. Die opdrag word dus nie aan die gebruiker teruggestuur nie.
Stap 7: Funksies
leemte initialize_global ()
{
strcpy (wordin [0], "IS");
strcpy (wordout [0], "AM");
strcpy (wordin [1], "AM");
strcpy (wordout [1], "IS");
strcpy (wordin [2], "WAS");
strcpy (wordout [2], "WAS");
strcpy (wordin [3], "WAS");
strcpy (wordout [3], "WAS");
strcpy (wordin [4], "JY");
strcpy (wordout [4], "ME");
strcpy (wordin [5], "ek");
strcpy (wordout [5], "JY");
strcpy (wordin [6], "JOU");
strcpy (wordout [6], "MY");
strcpy (wordin [7], "MY");
strcpy (wordout [7], "JOU");
strcpy (wordin [8], "I'VE");
strcpy (wordout [8], "YOU'VE");
strcpy (wordin [9], "YOU'VE");
strcpy (wordout [9], "I'VE");
strcpy (wordin [10], "EK IS");
strcpy (wordout [10], "YOU'RE");
strcpy (wordin [11], "YOU'RE");
strcpy (wordout [11], "I'M");
strcpy (wordin [12], "ME");
strcpy (wordout [12], "JY");
strcpy (wordin [13], "JY");
strcpy (wordout [13], "ME");
}
Laat ons nou 'n funksie skryf om die antwoorde aan die gebruiker te vertoon. Die eerste as-stelling in die for-lus word gebruik om 'n doelbewuste tikfout te maak om dit meer menslik te laat lyk;-). Een teken word lukraak gekies vir tikfout. Spesiale gevalle soos New Line en Backspace word afsonderlik oorweeg. (Dink hoekom?). Nou stel ek iets nuuts voor. 'N Spesiale karakter - *. Char * verteenwoordig al die teks wat gevind is NA die geïdentifiseerde sleutelwoord, en voor een van die volgende leestekens.
Oorweeg byvoorbeeld die gebruikersinvoer
AMIT> KAN EK MORG NA BINNE GAAN?
MAX> WAT AS JY NIE MORG NIE GAAN NIE?
Die onderstreepte gedeelte word nie in die woordeboek gestoor nie, dit word eerder uit die gebruikersinvoer geneem. In die lêer MAX. Dat stoor ons hierdie inligting as
KAN EK
WAT AS JY NIE *
Star (*) vra die program om alles wat na die sleutelwoord (hier CAN I) getik is, eenvoudig in die gebruikersinvoer te kopieer. Ek hoop dat die funksie van * as 'n spesiale sleutelwoord nou duidelik is. Laat ons dus 'n meer ingewikkelde saak oorweeg.
AMIT> KAN EK GAAN WINKEL?
MAX> WAT AS JY NIE WINKEL NIE?
Ons moet ook 'n mate van transformasie uitvoer. As ons aan transformasie dink, word die sin in die volgende drie afdelings verdeel:
- Teks voor Transposisie Woord. (hier, gaan inkopies doen hiermee)
- Die getransponeerde sleutelwoord. (hier, JOU, in die plek van MY)
- Teks na transposisie sleutelwoord. (hier, ek?)
Stap 8: Die sake kan aangepak word deur ………
Stap 9: Soek 'n sleutelwoord in die gebruikersinvoer
MAX_KEY dui die aantal sleutelwoorde in die DAT -lêer aan.
Ons soek eenvoudig of die sleutelwoord in die gebruikersinvoer voorkom.
Stap 10: Gevolgtrekking
Dit is al ………
Jy het dit gedoen !!!!!!!
Ek dink almal het die dinge duidelik verstaan …
Aanbeveel:
Multi -Channel Sonoff - Stem geaktiveerde ligte: 4 stappe (met foto's)
Multi-Channel Sonoff-Stem geaktiveerde ligte: 5 jaar gelede was die ligte in my kombuis die pad van die do-do. Die baanbeligting het misluk en die beligting onder die toonbank was net rommel. Ek wou ook die beligting in kanale opbreek sodat ek die kamer beter kon verlig
Stem -geaktiveerde LED's: 8 stappe
Stem -geaktiveerde LED's: Webduino gebruik die Chrome -internetblaaier om allerhande elektroniese komponente te beheer, sodat ons alle ander funksies wat Chrome bied, kan gebruik. In hierdie projekvoorbeeld gebruik ons Chrome se spraak -API. Gebruik Google se stemherkenning
Stem -geaktiveerde afstandsbedieningsknoppie: 4 stappe (met foto's)
Stem -geaktiveerde afstandsbedieningsknoppie: as u my ander instruksies gesien het, weet u dat ons seun spierdistrofie het. Dit is 'n enkele projek om dinge vir hom meer toeganklik te maak. Ons het 'n deur wat bedien word deur 'n afstandsbediening van 'n motordeur. Dit was fantasties in
Stem geaktiveerde BT: 3 stappe (met foto's)
Stem geaktiveer BT: Stembeheerde tuismotorisering met Arduino: In hierdie projek gebruik ek 'n stemfunksie om huistoestelle te beheer. Hierdie projek is deel van my Home Automation -reeks. Hierdie projek is baie maklik om in die werklike lewe te gebruik. Mense van enige ouderdom kan beheer
RabbitPi - die Alexa -geaktiveerde, IFTTT -gekoppelde, oorwisselende IoT -assistent: 12 stappe
RabbitPi - die Alexa Enabled, IFTTT Connected, Ear -Wiggling IoT Assistant: Dit is 'n verouderde 2005 Nabaztag " smart rabbit " wat ek herbou het tot 'n moderne IoT Assistant met behulp van 'n Raspberry Pi 3 en 'n Adafruit Motor HAT, met 'n webkamera -mikrofoon en 'n Philips Soundshooter -luidspreker in die oulike oorspronklike omhulsel