Introduction: A Learning Chatterbot in C++

The following will provide instructions on how to write a fun and simple chatterbot like application in C++. The user enters a phrase and then the learner responds if the initial phrase exists in memory. If it doesn't exist in memory, then the user can teach the learner what to say. The open source speech synthesiser espeak is used to create audible output. You can get it here:

The code does assume you have this in the same dir as the chatterbot application, but if it is not, you just won't hear any audible message along with the textual output.

If you can't be bothered typing up the code, we have it attached..... but we wouldn't recommend that :P

We are assuming that you have a basic understanding of C++, and compilation of multifile projects.

Step 1: Learner.h

Let's first create our learner class. A learner will respond to phrases if it knows how to, and learn how, if it doesn't.
Open up your favourite editor/IDE, create a header file called learner.h and type up the code in the image.
Again, I assume you understand what all this means, but I will explain the algorthmic details in the the next step.

Step 2: Learner.cpp

Create another file called learner.cpp and copy the code in the image.

Let’s take a look at the respond function. The algorithm is fundamentally simple, but the file operations can be confusing.

On line 15 we create a file stream object and then assign the memory file on line 16. Notice the ios::in argument. This means that we want to open the file for input, i.e. to read the file.

At line 19 we begin a while loop which will continue until the end of file is reached.

Line 21, getline, will read a multi word line, where the cursor is currently sat, and then move to the next line for the future operation. The phrase is stored in the identifier variable.

On line 23 we see if the current phrase matches the user’s phrase. If it does we use getline again on line 25 to get the response underneath the matched phrase. The response is then said using the learner’s voice object, and then we leave the function on line 27.

If we reach the end of file and we have found no response, then we go to line 31, where we close the file.

On 32 we again open the file, but this time for output, i.e. program to file. We also add the ios::app argument to ensure that we append to the end of the file.

On 33 we write the initial phrase, and then repeat the phrase on 35 to prompt the user for an ideal response. The user’s response is then written, and the file is closed.

The say function on line 46 simply passes the phrase to the voice objects say function for textual and audible output.

Step 3: Voice.h

Create another file called voice.h, and copy the code in the image. You may be questioning the need for this class, but we did this for portability and reusability. The class is actually quite good for any other projects where you want audible output.

This header file doesn’t require much description. This will come in the next step.

Step 4: Voice.cpp

Create another file called voice.cpp, and copy the code in the image. As expected it’s quite straight forward.

We are basically just executing the espeak application from current one, passing the phrase as an argument, hence the call to the system function…. The simplest way of executing cmd commands.

On 13 we use string summation to add our phrase to the command.

On 14 we convert from string to const char* so that we can pass it to the system function.

On 15 we output the text.

On 16 we call system, and execute espeak with the phrase as the argument to be said.

Make sure you put espeak.exe in the immediate directory of the compiled program.

Step 5: Main.cpp

Create another file named main.cpp, and copy the code in the image.

This is where are main function resides, hence where we start the program.

On line 7 we create a learner object and call it AI.

On 13 we begin the main program loop. It is infinite, therefore the only way to stop execution is if you close the application. The code from 13 to 19 is repeated.

Lines 14 to 16 prompt the user for input.

Lines 18 to 19 represent the learner output. We call AI’s respond function and get a response, or teach him what to say.

Step 6: Compilation and Setting Up for First Run

Now we are all done with the code.

Go ahead and compile.

Make sure you add a memory directory to the directory where the exe is. The memory file will be created in this folder on first run. You can actually edit the memory file directly if you wish to correct or add anything!

Also make sure you have the espeak exe in here too.

Now everything should be set up for the first execution :D


GustavoR31 (author)2015-12-09

sorry, I have a problem, when I execute the program it runs, but when i tap something and then appears the line of computer, it doesn´t appears any text and also it doesn´t appears the directory of memmory, how can i solve this?

zxl109276 (author)GustavoR312017-08-16

Instead of creating "memory.txt", just creat a text file and name it "memory"

AlexskYe (author)2017-07-27

What IDE you use friend?

anmol1311 (author)2017-07-05

Can someone help me with the infinite loop in learner.cpp it's not working at all he to fix

asdfghjkllqwertyuiopp (author)2017-07-04

Voice header file in Codelite IDE

anmol1311 (author)2017-06-28

Can someone pls explain line 14 in voice.cpp

JoshuaZ29 (author)2017-04-20

What about the Windows.h file anyone else have this problem.( If not then I will edit this comment later when I use a actual IDE not a online one, Thanks!

examplegk13 (author)2017-04-01

Hello! Thanks for the tutorial! Do you have any links or other tutorials about weighted strings? I mean, i want to update the intelligence of this chatbot in order to understand and answer phrases without "ready" questions and answers. Any help will be appreciated. Thank you in advance!

ashawe (author)2016-12-02

I get a error while building main.cpp which says that 'getline' : undeclared Identifier,

When I include the header file <string> I get an error:

main.obj : error LNK2001: unresolved external symbol "public: void __thiscall Learner::respond(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?respond@Learner@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?

Please Help me out

Using Visual C++ 6.0

BrokeG (author)2016-11-20

where do i put the memory.txt file and what do i put in it

SoorajS15 (author)2016-10-10

I tried running it in turbo c7 IDE......not compiling at all

SagarL4 (author)SoorajS152016-11-05

You dumb man!!! It is coded in ANSI C++, rather turbo uses its own standards.

Don't know why people still code in Turbo...

JoshuaB225 (author)2016-10-24

amazing!! thank you so so much! YAYYYY!!!!!!!!!

UskoD made it! (author)2016-09-03

Did it! It's an awesome program, and a great place to start with AI. I'm learning more about AI and C++, so this has helped to visualize how it all goes together. I had to add a Memory folder with a Memory.txt in it for the program to function, otherwise it would not reply, but it's all working great! I'm more than pleased, and your instructions were easy to follow. I do have a few questions though, how can this program be expanded upon? And what else can we do besides creating a database of responses?

PanagiotisN2 (author)2016-08-28

Hello, i made everything but then when i build it and say something like hi the ai responds with nothing and i cant type anything. The only prob i have is with the memory file i dont get it :/


Like i everything works but it doesnt respond to anything

. i say hi it says hi, i say sup it says sup so i say nice it sais nce :/

DeeptG (author)2016-07-05

@GustavoR31: I face the same issue. It is because the while(!eof()) is being executed infinitely. You can modify the file read to tailor your needs accordingly.

Felix_Aadish (author)2016-05-28

Where is Learner.exe???

SruthiA1 (author)2016-03-28

I am not getting any memory directory. what should i do?

SuperViper (author)SruthiA12016-03-31

It says to make one

SuperViper (author)2016-03-31

I'm using code::blocks and it won't compile because of this error:

C:\Users\Link\Desktop\chatbot\main.cpp|19|undefined reference to `Learner::respond(std::string)'|

NicolasG24 (author)2015-12-17


For this code to work for me, I have to create and put the file memory.txt in the same directory of my project.

ps: I use the CodeBlocks IDE.

jahangeerq1 (author)NicolasG242016-02-28

how do i create a file memory.txt , i tried running it on visual studio 2015(i know basic c++ /learning object oriented)

shubham_bhatt (author)2015-02-04

simplest form of ai i have ever seen...keep up the good work

EngyFun (author)shubham_bhatt2015-02-05

Thanks shubham_bhatt! The simplicity is a great aspect of this system.

JavaProgrammer (author)2015-02-03

that's cool. I made one just like that once on petit computer(a version of basic for ds) I thought it was cool but none else did :(

EngyFun (author)JavaProgrammer2015-02-04

Thanks JavaProgrammer! I sure think it's cool, especially when you start to work from this concept, and make the system more intelligent. Perhaps to understand the semantics of a phrase!

About This Instructable



More by EngyFun:Arduino Library for 28BYJ-48 Stepper Motor and ULN2003 DriverA Learning Chatterbot in C++
Add instructable to: