如今,语音机器人正变得越来越受欢迎,从平凡的订购出租车到向顾客销售。创建语音机器人可分为三个基本步骤。
- ASR语音识别。
- 阐明所讲内容的含义并在文本中搜索必要的实体(例如,地址,金额,全名等)
- 生成响应,将文本转换为语音TTS。我们将从创建一个简单的文本bot的路径,到与带有语音识别和准备好的响应的语音的freeswitch电话系统集成。本文介绍了所使用的工具以及将它们集成在一起以创建语音机器人的方法。
在第一部分中,我们将讨论创建一个可以嵌入聊天的简单文本机器人。
对话示例B-bot W-man
:
:
:
: ?
:
: ?
:?
:
:
一点理论
机器人根据用户意图原理工作。每个意图都有准备好的答案列表。为了使机器人能够理解用户的意图,有必要在数据集上训练模型并使用意图和可以激活该意图的短语
。例如,
意图:问好
可能的短语:你好,下午好,gratuti ...
答案:你好
意图:说再见
可能的短语:再见,再见,再见...
答案:再见
步骤1:预处理数据集
它基于来自Skillbox开放培训的数据集,该数据集用于编写可与您谈论电影的电报聊天机器人。出于明显原因,我无法发布。
预处理是非常重要的一步。
第一步是从文本中删除所有符号和数字,并将所有内容变为小写。
接下来,您需要纠正打字错误和单词错误。
-
这个任务是不容易的,有从Yandex的一个很好的工具,称为拼写,但它是在每天的请求数有限,因此我们将寻找免费的替代品。
对于蟒蛇有一个美好的jamspell库,纠正错别字好。她有一个很好的预先训练的俄语语言模型。让我们通过该库运行所有输入数据。对于语音机器人而言,此步骤并不重要,因为语音识别系统不应发出错误的单词,因此会发出错误的单词。对于聊天机器人,此过程是必需的。另外,为了最大程度地减少错别字的影响,您可以以词组而不是词组的形式训练网络。
N-gram是单词的n个字母部分。例如,单词hello的3克将为
在,里夫,柳树,兽医。这将帮助您减少打字错误的影响并提高识别准确性。
接下来,您需要将单词恢复为正常形式,即所谓的单词词素化过程。
-
Rulemma 库非常适合此任务。
您也可以从语义负载不大的短语中删除停用词,但是会增加神经网络的大小(我从nltk stopwords.words(“ russian”)库中获取),但是在我们这种情况下,最好不要删除它们,因为用户可以一个只有一个单词的机器人,但是它可以来自停用词列表。
步骤2:将数据集转换为NN的可理解形式
首先,您需要为数据集中的所有单词创建一个字典。
要训练模型,您需要将所有单词转换成一个hotVector
这是一个等于单词字典长度的数组,其中所有值等于0且单词在字典中的位置只有一个等于1。
此外,所有输入短语都将转换为包含所有短语的3维数组,该短语包含oneHotVector格式的单词列表-这将是我们的输入X_train数据集。
每个输入词组都需要与相同的意图以相同的HotVector格式进行匹配-这是我们的y_train输出。
步骤3:建立模型
对于小型机器人,具有两个lstm层和两个完全连接的层的小型模型就足够了:
model = Sequential()
model.add(LSTM(64,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(32))
model.add(Dropout(0.25))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))
我们编译模型并选择一个优化器,我选择了adam,因为它可以提供最佳结果。
步骤4:训练模型
准备数据集并编译模型后,您可以开始对其进行训练。由于数据集很小,我们必须训练模型250-500个时期,然后进行重新训练。
第5步:尝试与我们的机器人对话
要与我们的机器人对话,您需要将正确准备的数据提交到经过训练的模型的输入中。用户输入的处理方式与第一步中的数据集相同。然后,使用第二个步骤,使用相同的单词词典及其索引,将其转换为NN可以理解的形式,以使输入单词对应于对其进行训练的单词。
经过处理的输入被输入到模型中,我们得到了一个值数组,其中存在短语达到特定意图的概率,但是我们需要选择概率最高的意图,这可以通过numpy库完成
np.argmax(results)
有必要评估网络对此答案的信心,并选择向用户发布故障短语的阈值,例如-我不了解您。为了我的目的,我设置了50%的置信度阈值,在此阈值以下,机器人会说它不了解您。
接下来,从我们的意图列表中选择合适的答案并将其提供给用户
PS:不仅可以基于单词来训练模型,还可以通过将短语划分为字母或n-gram来训练模型,在这种情况下,将需要更严格的模型。
model = Sequential()
model.add(LSTM(512,return_sequences=True,input_shape=(description_length, num_encoder_tokens)))
model.add(LSTM(256))
model.add(Dropout(0.25))
model.add(Dense(len(set(y)), activation='softmax'))