Hoy en d铆a, los robots de voz est谩n ganando una inmensa popularidad, desde el pedido banal de un taxi hasta la venta a los clientes. La creaci贸n de un robot de voz se reduce a tres pasos b谩sicos.
- Reconocimiento de voz ASR.
- Aclaraci贸n del significado de lo dicho y b煤squeda de las entidades necesarias en el texto (por ejemplo, direcci贸n, monto, nombre completo, etc.)
- Generaci贸n de una respuesta, conversi贸n de texto a voz TTS. Pasaremos del camino de la creaci贸n de un simple bot de texto a la integraci贸n con el sistema de telefon铆a freeswitch con reconocimiento de voz y voice-over de respuestas preparadas. Este art铆culo describe las herramientas utilizadas y la forma de integrarlas para crear un robot de voz.
En la primera parte, hablaremos sobre la creaci贸n de un bot de texto simple que puede incrustar en un chat.
Ejemplo de conversaci贸n B-bot W-man
:
:
:
: ?
:
: ?
:?
:
:
Un poco de teor铆a El
bot funciona seg煤n el principio de intenci贸n del usuario. Cada intenci贸n tiene una lista de respuestas preparadas. Para que el robot para entender la intenci贸n del usuario, es necesario entrenar el modelo en el conjunto de datos con intenciones y frases que se pueden activar esta intenci贸n
Por ejemplo
Intenci贸n: hola Diga
Posibles frases: hola, buenas tardes, gratuti ...
Respuesta: Hola
Intenci贸n: decir adi贸s
Posibles frases: Bye, bye Adi贸s ...
Respuesta: Adi贸s
Paso 1: preprocesar el conjunto de datos
Se basa en un conjunto de datos del entrenamiento abierto de skillbox para escribir un bot de chat en telegramas que pueda hablarte sobre pel铆culas. No puedo publicarlo por razones obvias.
El preprocesamiento es un paso muy importante.
El primer paso es eliminar todos los s铆mbolos y n煤meros del texto y poner todo en min煤sculas.
A continuaci贸n, debe corregir los errores tipogr谩ficos y los errores en las palabras.
-
Esta tarea no es f谩cil, hay una buena herramienta de Yandex llamada Speller, pero es limitada en la cantidad de solicitudes por d铆a, por lo que buscaremos alternativas gratuitas.Para
python hay una maravillosa biblioteca jamspell que corrige bien los errores tipogr谩ficos. Hay un buen modelo de idioma ruso previamente entrenado para ella. Ejecutemos todos los datos de entrada a trav茅s de esta biblioteca. Para un robot de voz, este paso no es tan relevante, ya que el sistema de reconocimiento de voz no deber铆a dar palabras con errores, puede dar la palabra incorrecta. Este proceso es necesario para un bot de chat. Adem谩s, para minimizar la influencia de los errores tipogr谩ficos, puede entrenar la red no en palabras, sino en n-gramas.
Los N-gramas son partes de palabras con n letras. por ejemplo, los 3 gramos de la palabra hola ser谩n
en, riv, sauce, veterinario. Esto le ayudar谩 a ser menos susceptible a los errores tipogr谩ficos y a mejorar la precisi贸n del reconocimiento.
A continuaci贸n, debe llevar las palabras a su forma normal, el llamado proceso de lematizaci贸n de palabras.
-
La biblioteca rulemma es adecuada para esta tarea .
Tambi茅n puede eliminar las palabras vac铆as de las frases que tienen poca carga sem谩ntica, pero aumentan el tama帽o de la red neuronal (tom茅 de la biblioteca nltk stopwords.words ("ruso")), pero en nuestro caso es mejor no eliminarlas, ya que el usuario puede responder un robot con solo una palabra, pero puede ser de la lista de palabras vac铆as.
Paso 2: convertir el conjunto de datos a un formato comprensible para NN
Primero, debe crear un diccionario de todas las palabras del conjunto de datos.
Para entrenar el modelo, es necesario traducir todas las palabras en oneHotVector
Esta es una matriz que es igual a la longitud del diccionario de palabras, en la que todos los valores son 0 y solo uno es 1 en la posici贸n de la palabra en el diccionario.
Adem谩s, todas las frases de entrada se convierten en una matriz tridimensional que contiene todas las frases, la frase contiene una lista de palabras en el formato oneHotVector; este ser谩 nuestro conjunto de datos de entrada X_train.
Cada frase de entrada debe coincidir con una intenci贸n adecuada en el mismo formatoHotVector; esta es nuestra salida y_train.
Paso 3: creaci贸n del modelo
Para un bot peque帽o, un modelo peque帽o con dos capas lstm y dos capas completamente conectadas es suficiente:
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'))
Compilamos el modelo y seleccionamos un optimizador, eleg铆 adam porque dio el mejor resultado.
Paso 4: entrena el modelo
Despu茅s de preparar el conjunto de datos y compilar el modelo, puede comenzar a entrenarlo. Dado que el conjunto de datos es peque帽o, tuvimos que entrenar el modelo durante 250-500 茅pocas, despu茅s de lo cual tuvo lugar el reentrenamiento.
Paso 5: intentando hablar con nuestro bot
Para hablar con nuestro bot, debe enviar datos correctamente preparados a la entrada del modelo entrenado. La entrada del usuario debe procesarse de la misma manera que el conjunto de datos del primer paso. Luego transf贸rmalo en una forma comprensible para NN como en el segundo paso utilizando el mismo diccionario de palabras y sus 铆ndices para que las palabras de entrada correspondan a las palabras sobre las que se realiz贸 el entrenamiento.
La entrada procesada se alimenta al modelo y obtenemos una matriz de valores en la que est谩n presentes las probabilidades de que nuestra frase alcance una intenci贸n particular, pero debemos seleccionar la intenci贸n con la mayor probabilidad, esto se puede hacer a trav茅s de la biblioteca numpy
np.argmax(results)
Es necesario evaluar la confianza de la red en esta respuesta y seleccionar el umbral en el que emitir frases de falla al usuario, como - No lo entiendo. Para mis prop贸sitos, establec铆 un umbral del 50% de confianza, por debajo del cual el bot dir谩 que no te entendi贸.
A continuaci贸n, de la lista de nuestras intenciones, seleccionamos la respuesta adecuada y se la damos al usuario
PD: El modelo se puede entrenar no solo en base a palabras, sino tambi茅n dividiendo frases en letras o n-gramas, en cuyo caso ser谩 necesario un modelo m谩s serio.
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'))