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