De nos jours, les robots vocaux gagnent en popularité, de la commande banale d'un taxi à la vente aux clients. La création d'un bot vocal se résume à trois étapes de base.
- Reconnaissance vocale ASR.
- Clarification de la signification de ce qui a été dit et recherche des entités nécessaires dans le texte (par exemple, adresse, montant, nom complet, etc.)
- Génération d'une réponse, conversion de texte en parole TTS. Nous passerons du chemin de la création d'un robot de texte simple à l'intégration avec le système de téléphonie freeswitch avec reconnaissance vocale et voix off des réponses préparées. Cet article décrit les outils utilisés et la manière de les intégrer ensemble pour créer un robot vocal.
Dans la première partie, nous parlerons de la création d'un robot de texte simple que vous pouvez intégrer dans une discussion.
Exemple de conversation B-bot W-man
:
:
:
: ?
:
: ?
:?
:
:
Un peu de théorie Le
bot fonctionne sur le principe de l'intention de l'utilisateur. Chaque intention a une liste de réponses préparées. Pour que le bot comprenne l'intention de l'utilisateur, il est nécessaire de former le modèle sur l'ensemble de données avec des intentions et des phrases qui peuvent activer cette intention
Par exemple
Intention: Dites bonjour
Phrases possibles: bonjour, bon après-midi, gratuti ...
Réponse: Bonjour
Intention: Dites au revoir
Phrases possibles: Au revoir, au revoir , Adieu ...
Réponse: Au revoir
Étape 1: prétraitement de l'ensemble de données
Il est basé sur un ensemble de données de la formation ouverte de Skillbox pour écrire un chat bot dans des télégrammes qui peuvent vous parler de films. Je ne peux pas le publier pour des raisons évidentes.
Le prétraitement est une étape très importante.
La première étape consiste à supprimer tous les symboles et chiffres du texte et à tout mettre en minuscules.
Ensuite, vous devez corriger les fautes de frappe et les erreurs de mots.
-
Cette tâche n'est pas facile, il existe un bon outil de Yandex appelé Speller, mais il est limité dans le nombre de requêtes par jour, nous chercherons donc des alternatives gratuites.
Pour python, il existe une merveilleuse bibliothèque jamspell qui corrige bien les fautes de frappe. Il existe un bon modèle de langue russe pré - formé pour elle. Exécutons toutes les données d'entrée via cette bibliothèque. Pour un robot vocal, cette étape n'est pas si pertinente, puisque le système de reconnaissance vocale ne doit pas donner de mots avec des erreurs, il peut donner le mauvais mot. Ce processus est nécessaire pour un chat bot. De plus, pour minimiser l'influence des fautes de frappe, vous pouvez entraîner le réseau non pas en mots, mais en n-grammes.
Les N-grammes sont des parties de mots en n lettres. par exemple, les 3 grammes pour le mot bonjour seront
à, riv, saule, vétérinaire. Cela vous aidera à être moins dépendant des fautes de frappe et à augmenter la précision de la reconnaissance.
Ensuite, vous devez ramener les mots à leur forme normale, le soi-disant processus de lemmatisation des mots.
-
La bibliothèque rulemma est bien adaptée à cette tâche .
Vous pouvez également supprimer les mots vides des phrases qui portent peu de charge sémantique, mais augmenter la taille du réseau neuronal (j'ai pris stopwords.words ("russe") de la bibliothèque nltk), mais dans notre cas, il vaut mieux ne pas les supprimer, car l'utilisateur peut répondre un robot avec un seul mot, mais cela peut provenir de la liste des mots vides.
Étape 2: Conversion de l'ensemble de données en une forme compréhensible pour NN
Tout d'abord, vous devez créer un dictionnaire de tous les mots de l'ensemble de données.
Pour entraîner le modèle, vous devez traduire tous les mots en un seul HotVector
Il s'agit d'un tableau égal à la longueur du dictionnaire de mots, dans lequel toutes les valeurs sont 0 et une seule est 1 à la position du mot dans le dictionnaire.
De plus, toutes les phrases d'entrée sont converties en un tableau à 3 dimensions qui contient toutes les phrases, la phrase contient une liste de mots au format oneHotVector - ce sera notre ensemble de données X_train d'entrée.
Chaque phrase d'entrée doit être mise en correspondance avec une intention appropriée dans le même format HotVector - c'est notre sortie y_train.
Étape 3: création du modèle
Pour un petit bot, un petit modèle avec deux couches lstm et deux couches entièrement connectées suffit:
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'))
Nous compilons le modèle et sélectionnons un optimiseur, j'ai choisi Adam, car il a donné le meilleur résultat.
Étape 4: former le modèle
Après avoir préparé l'ensemble de données et compilé le modèle, vous pouvez commencer à l'entraîner. Le jeu de données étant petit, nous avons dû entraîner le modèle pour 250 à 500 époques, après quoi le recyclage a eu lieu.
Étape 5: essayer de parler à notre bot
Pour parler à notre bot, vous devez soumettre des données correctement préparées à l'entrée du modèle entraîné. L'entrée utilisateur doit être traitée de la même manière que l'ensemble de données de la première étape. Puis transformez-le en une forme compréhensible par NN comme dans la deuxième étape en utilisant le même dictionnaire de mots et leurs index afin que les mots d'entrée correspondent aux mots sur lesquels l'apprentissage a été effectué.
L'entrée traitée est introduite dans le modèle et nous obtenons un tableau de valeurs dans lesquelles les probabilités de notre phrase frappant une intention particulière sont présentes, mais nous devons sélectionner l'intention avec la probabilité la plus élevée, cela peut être fait via la bibliothèque numpy
np.argmax(results)
Il est nécessaire d'évaluer la confiance du réseau dans cette réponse et de sélectionner le seuil à partir duquel émettre des phrases d'échec à l'utilisateur, comme - je ne vous comprends pas. Pour mes besoins, j'ai fixé un seuil de confiance de 50%, en dessous duquel le bot dira qu'il ne vous a pas compris.
Ensuite, dans la liste de nos intentions, nous sélectionnons la réponse appropriée et la donnons à l'utilisateur
PS: Le modèle peut être formé non seulement sur la base de mots, mais également en divisant des phrases en lettres ou en n-grammes, auquel cas un modèle plus sérieux sera nécessaire.
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'))