Pythonでチャットボット(chatbot):tkinterを使う

前回の続きになります。前回の記事はこちら。

「パターン2.自分のPCでボットとチャットする(画面あり)」を作ってみます。

なお、前回までの記事で説明済みの内容については繰り返し書くことはしませんので、プログラミング初心者の方は最初から読むことをお勧めします。

ボットのプログラムを動かしてみる

プログラム内容の詳しい説明は後で。まずは動かしてみましょう。

以下のプログラムをテキストエディタに書いて、pythonの拡張子「.py」で保存して、それを実行します。chat.txt、chat2.txtの利用に関してのロジックは前回と同じなので説明を割愛します。

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
from tkinter import *

bot = ChatBot("チャットボット試作版")

training_ = open('chat.txt', 'r').readlines()
training2_ = open('chat2.txt', 'r').readlines()

trainer = ListTrainer(bot)
trainer.train(training_)
trainer.train(training2_)

root = Tk()
root.geometry("600x400")
root.title("チャットボット試作版")
frame = Frame(root)

sc = Scrollbar(frame)
sc.pack(side=RIGHT, fill=Y)

msgs = Listbox(frame, width=80, height=20, yscrollcommand=sc.set)
msgs.pack(side=LEFT, fill=BOTH, pady=10)

frame.pack()


textF = Entry(root, font=("Courier", 10),width=50)
textF.pack()


def ask_from_bot():
    query = textF.get()
    answer_from_bot = bot.get_response(query)
    msgs.insert(END, "you : " + query)
    msgs.insert(END, "bot : " + str(answer_from_bot))
    textF.delete(0, END)
    msgs.yview(END)

btn = Button(root, text="質問をどうぞ", font=("Courier", 10),bg='white', command=ask_from_bot)
btn.pack()

def enter_function(event):
    btn.invoke()

root.bind('<Return>', enter_function)


root.mainloop()

上記のpythonプログラムを実行すると、今度はGUI画面が表示されます。

画面下部の入力欄に文字を入力して、「質問をどうぞ」ボタンかエンターキーを押すと、画面上部に入力文言とその応答のやり取りを表示します。

ボットのプログラムの説明

このプログラムはtkinterというPythonのGUI用パッケージを使っています。このパッケージはスタンドアロンPC(他のサーバー・PCと通信をしないネットワーク的に孤立したPC)での稼働を前提としています。

最近ではブラウザ上で提供するWebサービスの形態が一般的ですが、tkinterで作ったアプリケーションはブラウザ上で稼働させることはできません。

次にボットのプログラムの説明です。それぞれのソースの上に説明文を追記しました。

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer

# GUI用パッケージtkinterを読み込みます。
from tkinter import *

bot = ChatBot("チャットボット試作版")
training_ = open('chat.txt', 'r').readlines()
training2_ = open('chat2.txt', 'r').readlines()

trainer = ListTrainer(bot)
trainer.train(training_)
trainer.train(training2_)

'''
ここからTkinterでGUI画面の要素を定義していきます。
まず、GUI画面の土台を定義します。この後、画面上の各パーツを定義してセットすることを繰り返します。
'''
root = Tk()

# 画面のサイズを定義
root.geometry("600x400")

# 画面のタイトルを定義
root.title("チャットボット試作版")

# フレーム(画面上の各パーツを配置するための枠)を定義
frame = Frame(root)


# スクロールバーを定義
sc = Scrollbar(frame)
# スクロールバーをセット
sc.pack(side=RIGHT, fill=Y)


# リストボックスを定義
msgs = Listbox(frame, width=80, height=20, yscrollcommand=sc.set)
# リストボックスをセット
msgs.pack(side=LEFT, fill=BOTH, pady=10)

#フレームをセット
frame.pack()


# テキストボックスを定義
textF = Entry(root, font=("Courier", 10),width=50)
# テキストボックスをセット
textF.pack()


# ボタンを押したときの動きについて関数を定義
def ask_from_bot():
    query = textF.get()
    answer_from_bot = bot.get_response(query)
    msgs.insert(END, "you : " + query)
    msgs.insert(END, "bot : " + str(answer_from_bot))
    textF.delete(0, END)
    msgs.yview(END)

# ボタンを定義
btn = Button(root, text="質問をどうぞ", font=("Courier", 10),bg='white', command=ask_from_bot)
# ボタンをセット
btn.pack()

# この関数を呼ぶとボタンを押す動きになる。
def enter_function(event):
    btn.invoke()

# エンターキーを押すとenter_functionを呼ぶ(つまり、エンターキーを押すとボタンを押すのと同じ動きになる。)
root.bind('<Return>', enter_function)


# TkinterでGUI画面を起動する。
root.mainloop()

ボットのプログラム(バージョン2)

上記で説明したプログラムに音声パッケージとロギング処理を機能追加してみました。 プログラムはこちら。

from chatterbot import ChatBot
from chatterbot.trainers import ListTrainer
from tkinter import *

# テキストを読み上げてくれるライブラリです。
import pyttsx3 as pt

# 音声認識をしてくれるライブラリです。
import speech_recognition as s

import threading
import sys
import logging

# ログファイルを作成して、ボットとのやり取りをファイルに出力します。
logger = logging.getLogger('Logging')
logger.setLevel(10)
FH = logging.FileHandler("log.txt")
logger.addHandler(FH)

# テキスト読み上げのプロセス初期化
engine = pt.init()

# wordsを読み上げる関数の定義
def speak(words):
    engine.say(words)
    engine.runAndWait()

bot = ChatBot("チャットボット試作版")
training_ = open('chat.txt', 'r').readlines()
training2_ = open('chat2.txt', 'r').readlines()

trainer = ListTrainer(bot)
trainer.train(training_)
trainer.train(training2_)

root = Tk()
root.geometry("600x400")
root.title("チャットボット試作版")
frame = Frame(root)

sc = Scrollbar(frame)

msgs = Listbox(frame, width=80, height=20, yscrollcommand=sc.set)
sc.pack(side=RIGHT, fill=Y)

msgs.pack(side=LEFT, fill=BOTH, pady=10)
frame.pack()

textF = Entry(root, font=("Courier", 10),width=50)
textF.pack()


# 1秒おきに音声認識してテキスト化する関数の定義
def takeQuery():
    sr = s.Recognizer()
    sr.pause_threshold = 1
    print("音声を確認中")
    with s.Microphone() as source:
        try:
            sr.adjust_for_ambient_noise(source) #雑音対策
            audio = sr.listen(source)
            voice = sr.recognize_google(audio, language='ja-JP')
            logger.log(20,voice)
            textF.delete(0, END)
            textF.insert(0, voice)
            ask_from_bot()
        except Exception as e:
            print(e)
            print("わかりません")

def ask_from_bot():
    query = textF.get()
    response = bot.get_response(query)
    msgs.insert(END, "you : " + query)
    logger.log(20,query +":" + str(response))
    msgs.insert(END, "bot : " + str(response))
    speak(response)
    textF.delete(0, END)
    msgs.yview(END)

btn = Button(root, text="質問をどうぞ", font=("Courier", 10),bg='white', command=ask_from_bot)
btn.pack()

def enter_function(event):
    btn.invoke()

root.bind('&lt;Return&gt;', enter_function)


# 「音声認識の関数を無限ループさせる関数」を定義
def repeatL():
    while True:
        takeQuery()

# 「音声認識の関数を無限ループさせる関数」を呼び出し
t = threading.Thread(target=repeatL)
t.start()

root.mainloop()

「Pythonパッケージが見つからないエラー」がでたら、前回、説明したように「pip install 〇〇〇〇」でパッケージをインストールして下さい。

この時、1つ特殊なパッケージとして「pyaudio」があります。これは上記コマンドだとインストールに失敗する可能性があります。その場合は「pip install pipwin」をしてpipwinをインストール後、それを使って、「pipwin install pyaudio」としてみて下さい。

Pythonプログラムを起動したらPCのマイクにしゃべってみて下さい。音声を認識し、ボットも応答を音声付きで返してくれます。

また、実行フォルダにlog.txtという名前のファイルが作成されているはずです。ボットとのやり取りを出力しています。

まとめ

この記事ではチャットボットのGUIアプリケーションを作ってみました。私が初めて動かした時の感想は、Pythonパッケージの充実ぶりにただ驚くばかりでした。

次の記事では「パターン3.Web上でボットとチャットする(Pythonパッケージで作成)」について書きたいと思います。

<スポンサーリンク>

タイトルとURLをコピーしました