From f3a951529aea1df6efce2f64bf7bfcd4c6302729 Mon Sep 17 00:00:00 2001 From: MikeTheWatchGuy Date: Mon, 5 Nov 2018 12:54:37 -0500 Subject: [PATCH] New Demo - Combined Chatterbot with Google TTS --- DemoPrograms/Demo_Chatterbot_With_TTS.py | 97 ++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 DemoPrograms/Demo_Chatterbot_With_TTS.py diff --git a/DemoPrograms/Demo_Chatterbot_With_TTS.py b/DemoPrograms/Demo_Chatterbot_With_TTS.py new file mode 100644 index 00000000..3872ffb8 --- /dev/null +++ b/DemoPrograms/Demo_Chatterbot_With_TTS.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python +import sys +if sys.version_info[0] >= 3: + import PySimpleGUI as sg +else: + import PySimpleGUI27 as sg + +from chatterbot import ChatBot +import chatterbot.utils + +from gtts import gTTS +from pygame import mixer +import time +import os + +''' +Demo_Chatterbot.py +A GUI wrapped arouind the Chatterbot package. +The GUI is used to show progress bars during the training process and +to collect user input that is sent to the chatbot. The reply is displayed in the GUI window +''' + +# Create the 'Trainer GUI' +# The Trainer GUI consists of a lot of progress bars stacked on top of each other +sg.ChangeLookAndFeel('NeutralBlue') +# sg.DebugWin() +MAX_PROG_BARS = 20 # number of training sessions +bars = [] +texts = [] +training_layout = [[sg.T('TRAINING PROGRESS', size=(20, 1), font=('Helvetica', 17))], ] +for i in range(MAX_PROG_BARS): + bars.append(sg.ProgressBar(100, size=(30, 4))) + texts.append(sg.T(' ' * 20, size=(20, 1), justification='right')) + training_layout += [[texts[i], bars[i]],] # add a single row + +training_window = sg.Window('Training').Layout(training_layout) +current_bar = 0 + +# callback function for training runs +def print_progress_bar(description, iteration_counter, total_items, progress_bar_length=20): + global current_bar + global bars + global texts + global training_window + # update the window and the bars + button, values = training_window.Read(timeout=0) + if button is None: # if user closed the window on us, exit + sys.exit(69) + if bars[current_bar].UpdateBar(iteration_counter, max=total_items) is False: + sys.exit(69) + texts[current_bar].Update(description) # show the training dataset name + if iteration_counter == total_items: + current_bar += 1 + +def speak(text): + global i + tts = gTTS(text=text, lang='en',slow=False) + tts.save('speech{}.mp3'.format(i%2)) + # playback the speech + mixer.music.load('speech{}.mp3'.format(i%2)) + mixer.music.play() + # wait for playback to end + while mixer.music.get_busy(): + time.sleep(.1) + mixer.stop() + i += 1 + +i = 0 +mixer.init() + +# redefine the chatbot text based progress bar with a graphical one +chatterbot.utils.print_progress_bar = print_progress_bar + +chatbot = ChatBot('Ron Obvious', trainer='chatterbot.trainers.ChatterBotCorpusTrainer') + +# Train based on the english corpus +chatbot.train("chatterbot.corpus.english") + +################# GUI ################# + +layout = [[sg.Output(size=(80, 20))], + [sg.Multiline(size=(70, 5), enter_submits=True), + sg.Button('SEND', bind_return_key=True), sg.Button('EXIT')]] + +window = sg.Window('Chat Window', auto_size_text=True, default_element_size=(30, 2)).Layout(layout) + +# ---===--- Loop taking in user input and using it to query HowDoI web oracle --- # +while True: + event, (value,) = window.Read() + if event is not 'SEND': + break + string = value.rstrip() + print(' '+string) + # send the user input to chatbot to get a response + response = chatbot.get_response(value.rstrip()) + print(response) + speak(str(response)) \ No newline at end of file