4. Configuración de reconocimiento de intenciones y comprensión del lenguaje natural4. Setting up intent and natural language understanding

En este tutorial, explorarás el reconocimiento de la intención del servicio Voz de Azure.In this tutorial, you will explore the Azure Speech Service's intent recognition. El reconocimiento de la intención te permite equipar nuestra aplicación con comandos de voz con tecnología de IA que permite a los usuarios indicar comandos de voz no específicos y conseguir, igualmente, que les entienda el sistema.The intent recognition allows you to equip our application with AI-powered speech commands, where users can say non-specific speech commands and still have their intent understood by the system.

ObjetivosObjectives

  • Aprender a configurar la intención, las entidades y las expresiones en el portal de LUISLearn how to set up intent, entities, and utterances in the LUIS portal
  • Aprender a implementar la comprensión del lenguaje natural y la intención en nuestra aplicaciónLearn how to implement intent and natural language understanding in our application

Preparación de la escenaPreparing the scene

En la ventaja Hierarchy (Jerarquía), selecciona el objeto Lunarcom y, a continuación, en la ventana Inspector, usa el botón Add Component (Agregar componente) para agregar el componente Lunarcom Intent Recognizer (Script) (Reconocimiento de la intención de Lunarcom [script]):In the Hierarchy window, select the Lunarcom object, then in the Inspector window, use the Add Component button to add the Lunarcom Intent Recognizer (Script) component to the Lunarcom object:

mrlearning-speech

En la ventana Project (Proyecto), navega hasta la carpeta Assets > MRTK.Tutorials.GettingStarted > Prefabs > RocketLauncher (Recursos > MRTK.Tutorials.GettingStarted > Objetos prefabricados > RocketLauncher), arrastra el objeto prefabricado RocketLauncher_Complete a la ventana Hierarchy (Jerarquía) y, a continuación, colócalo en una ubicación adecuada; por ejemplo, delante de la cámara:In the Project window, navigate to the Assets > MRTK.Tutorials.GettingStarted > Prefabs > RocketLauncher folder, drag the RocketLauncher_Complete prefab into your Hierarchy window, and place it at a suitable location in front of the camera, for example:

  • Transforma el valor de Position (Posición) X = 0, Y = 0,4, Z = 1Transform Position X = 0, Y = -0.4, Z = 1
  • Transforma el valor de Rotation (Giro) X = 0, Y = 90, Z = 0Transform Rotation X = 0, Y = 90, Z = 0

mrlearning-speech

En la ventana Hierarchy (Jerarquía), selecciona de nuevo el objeto Lunarcom, expande el objeto RocketLauncher_Complete > Button (Botón) y asigna cada uno de los objetos secundarios del objeto Buttons (Botones) al campo Lunar Launcher Buttons (Botones del lanzacohetes lunar):In the Hierarchy window, select the Lunarcom object again, then expand the RocketLauncher_Complete > Button object and assign each of the Buttons object's child objects to the corresponding Lunar Launcher Buttons field:

mrlearning-speech

Creación del recurso de Azure Language UnderstandingCreating the Azure Language Understanding resource

En esta sección, crearás un recurso de predicción de Azure para la aplicación de Language Understanding Intelligent Service (LUIS) que crearás en la próxima sección.In this section, you will create an Azure prediction resource for the Language Understanding Intelligent Service (LUIS) app you will create in the next section.

Inicia sesión en Azure y haz clic en Crear un recurso.Sign in to Azure and click Create a resource. A continuación, busca y selecciona Language Understanding:Then search for and select Language Understanding:

mrlearning-speech

Haz clic en el botón Crear para crear una instancia de este servicio:Click the Create button to create an instance of this service:

mrlearning-speech

En la página Crear, haz clic en la opción Predicción y escribe los valores siguientes:On the Create page, click the Prediction option and enter the following values:

  • En Suscripción, selecciona Free Trail (Prueba gratuita) si tienes una suscripción de prueba. De lo contrario, selecciona una de las otras suscripciones.For Subscription, select Free Trail if you have a trial subscription, otherwise, select one of your other subscriptions
  • Para Grupo de recursos, haz clic en el vínculo Crear nuevo, escribe un nombre adecuado; por ejemplo, MRKT-Tutorials y, a continuación, haz clic en Aceptar.For the Resource group, click the Create new link, enter a suitable name, for example, MRKT-Tutorials, and then click the OK

mrlearning-speech

Nota

En el momento de redactar este documento, no es necesario crear un recurso de creación porque se generará automáticamente una clave de prueba de creación en LUIS cuando crees Language Understanding Intelligent Service (LUIS) en la sección siguiente.As of the time of this writing, you do not need to create an authoring resource because an authoring trial key will automatically be generated within LUIS when you create the Language Understanding Intelligent Service (LUIS) in the next section.

Sugerencia

Si ya tienes otro grupo de recursos adecuado en tu cuenta de Azure; por ejemplo, si completaste el tutorial de Azure Spatial Anchors, puedes usar este grupo de recursos en lugar de crear uno nuevo.If you already have another suitable resource group in your Azure account, for example, if you completed the Azure Spatial Anchors tutorial, you may use this resource group instead of creating a new one.

Mientras sigues en la página Crear, escribe los valores siguientes:While still on the Create page, enter the following values:

  • En Nombre, escribe un nombre adecuado para el servicio; por ejemplo, MRTK-tutoriales-AzureSpeechServicesFor Name, enter a suitable name for the service, for example, MRTK-Tutorials-AzureSpeechServices
  • Para Ubicación de la predicción, elige una ubicación cercana a la ubicación física de los usuarios de la aplicación; por ejemplo, (EE. UU.) Oeste de EE. UU.For Prediction location, choose a location close to your app users' physical location, for example, (US) West US
  • Para Plan de tarifa de predicción, para los fines de este tutorial, selecciona F0 (5 llamadas por segundo, 10 000 llamadas al mes) .For Prediction pricing tier, for the purpose of this tutorial, select F0 (5 Calls per second, 10K Calls per month)

mrlearning-speech

A continuación, ve a la pestaña Revisar y crear, revisa los detalles y haz clic en el botón Crear, situado en la parte inferior de la página, para crear el recurso, así como el nuevo grupo de recursos, si configuraste alguno para su creación:Next, go to the Review + create tab, review the details, and then click the Create button, located at the bottom of the page, to create the resource, as well as, the new resource group if you configured one to be created:

mrlearning-speech

Nota

Después de hacer clic en el botón Crear, tendrás que esperar a que se cree el servicio, lo que puede tardar unos minutos.After you click the Create button, you will have to wait for the service to be created, which might take a few minutes.

Una vez completado el proceso de creación de recursos, se mostrará el mensaje Se completó la implementación:Once the resource creation process is completed, you will see the message Your deployment is complete:

mrlearning-speech

Creación de Language Understanding Intelligent Service (LUIS)Creating the Language Understanding Intelligent Service (LUIS)

En esta sección, crearás una aplicación de LUIS, configurarás y entrenarás su modelo de predicción y lo conectará al recurso de predicción de Azure que creaste en el paso anterior.In this section, you will create a LUIS app, configure and train its prediction model, and connect it to the Azure prediction resource you created in the previous step.

En concreto, crearás una intención: si el usuario dice que se debe realizar una acción, la aplicación desencadenará el evento Interactable.OnClick() en uno de los tres botones rojos de la escena, dependiendo del botón al que haga referencia el usuario.Specifically, you will create an intent that if the user says an action should be taken, the app will trigger the Interactable.OnClick() event on one of the three red buttons in the scene, depending on which button the user references.

Por ejemplo, si el usuario dice go ahead and launch the rocket (adelante, lanza el cohete), la aplicación predecirá que adelante significa que se debe realizar alguna acción y que el evento Interactable.OnClick() de destino está en el botón launch (lanzar).For example, if the user says go ahead and launch the rocket, the app will predict that go ahead means some action should be taken, and that the Interactable.OnClick() event to target is on the launch button.

Los principales pasos que debes seguir para lograrlo son:The main steps you will take to achieve this are:

  1. Crear una aplicación de LUISCreate a LUIS app
  2. Crear intencionesCreate intents
  3. Crear expresiones de ejemploCreate example utterances
  4. Crear entidadesCreate entities
  5. Asignar entidades a las expresiones de ejemploAssign entities to the example utterances
  6. Entrenar, probar y publicar la aplicaciónTrain, test, and publish the app
  7. Asignar un recurso de predicción de Azure a la aplicaciónAssign an Azure prediction resource to the app

1. Crear una aplicación de LUIS1. Create a LUIS app

Con la misma cuenta de usuario que usaste para crear el recurso de Azure en la sección anterior, inicia sesión en LUIS, selecciona tu país y acepta los términos de uso.Using the same user account you used when creating the Azure resource in the previous section, sign in to LUIS, select your country, and agree to the terms of use. En el paso siguiente, cuando se te pida vincular la cuenta de Azure, elige Continuar usando la clave de prueba para usar un recurso de creación de Azure en su lugar.In the next step, when asked to Link your Azure account, choose Continue using your trial key, to use an Azure authoring resource instead.

Nota

Si ya te has registrado en LUIS y ha expirado la clave de prueba de creación, puedes consultar la documentación Migración a una clave de creación de recursos de Azure para cambiar el recurso de creación de LUIS a Azure.If you have already signed up for LUIS and your authoring trial key has expired, you can refer to the Migrate to an Azure resource authoring key documentation to switch your LUIS authoring resource to Azure.

Una vez iniciada la sesión, desplázate a la página Mis aplicaciones, haz clic en Crear una aplicación y escribe los valores siguientes en la ventana emergente Crear una aplicación:Once signed in, navigate to the My apps page, then click Create new app and enter the following values in the Create new app popup window:

  • En Nombre, escribe un nombre adecuado; por ejemplo, MRTK Tutorials - AzureSpeechServices.For Name, enter a suitable name, for example, MRTK Tutorials - AzureSpeechServices
  • En Referencia cultural, selecciona InglésFor Culture, select English
  • En Descripción, puedes escribir una descripción adecuada.For Description, optionally enter a suitable description

A continuación, haz clic en el botón Listo para crear la aplicación:Then click the Done button to create the new app:

mrlearning-speech

Una vez creada la aplicación, se te dirigirá a su página Panel:When the new app has been created, you will be taken to that app's Dashboard page:

mrlearning-speech

2. Crear intenciones2. Create intents

Desde la página Panel, ve a la página Compilación > Activos de la aplicación > Intenciones, haz clic en Crear intención y escribe el siguiente valor en la ventana emergente Crear intención:From the Dashboard page, navigate to the Build > App Assets > Intents page, then click Create new intent and enter the following value in the Create new intent popup window:

  • En Nombre de la intención, escribe PressButton.For Intent name, enter PressButton

A continuación, haz clic en el botón Listo para crear la nueva intención:Then click the Done button to create the new intent:

mrlearning-speech

Precaución

Para los fines de este tutorial, el proyecto de Unity hará referencia a esta intención por su nombre, "PressButton".For the purpose of this tutorial, your Unity project will reference this intent by its name, i.e. 'PressButton'. Por lo tanto, es muy importante que asignes exactamente el mismo nombre a la intención.Consequently, it is extremely important that you name your intent exactly the same.

Una vez creada la intención, se te dirigirá a su página:When the new intent has been created, you will be taken to that intent's page:

mrlearning-speech

3. Crear expresiones de ejemplo3. Create example utterances

En la lista Expresión de ejemplo de la intención PressButton, agrega las siguientes expresiones de ejemplo:To the PressButton intent's Example utterance list, add the following example utterances:

  • activate launch sequence (activar secuencia de lanzamiento)activate launch sequence
  • show me a placement hint (mostrar sugerencia de selección de ubicación)show me a placement hint
  • initiate the launch sequence (iniciar secuencia de lanzamiento)initiate the launch sequence
  • press placement hints button (presionar botón de sugerencias)press placement hints button
  • give me a hint (proporcionar sugerencia)give me a hint
  • push the launch button (presionar botón de lanzamiento)push the launch button
  • i need a hint (necesito una sugerencia)i need a hint
  • press the reset button (presionar botón de restablecimiento)press the reset button
  • time to reset the experience (hora de restablecer la experiencia)time to reset the experience
  • go ahead and launch the rocket (adelante, lanza el cohete)go ahead and launch the rocket

Una vez agregadas todas las expresiones de ejemplo, la página de la intención PressButton debería tener un aspecto similar al siguiente:When all the example utterances have been added, your PressButton intent page should look similar to this:

mrlearning-speech

Precaución

Para los fines de este tutorial, el proyecto de Unity hará referencia a las palabras "hint" (sugerencia), "hints" (sugerencias), "reset" (restablecimiento) y "launch" (lanzar).For the purpose of this tutorial, your Unity project will reference the words 'hint', 'hints', 'reset', and 'launch'. Por lo tanto, es muy importante que escribas estas palabras exactamente de la misma manera.Consequently, it is extremely important that you spell these words in the exact same way.

4. Crear entidades4. Create entities

Desde la página de la intención PressButton, ve a la página Compilación > Activos de la aplicación > Entidades, haz clic en Crear una nueva entidad y escribe los valores siguientes en la ventana emergente Crear una nueva entidad:From the PressButton intent page, navigate to the Build > App Assets > Entities page, then click Create new entity and enter the following values in the Create new entity popup window:

  • En Nombre de entidad, escribe Action.For Entity name, enter Action
  • En Tipo de entidad, selecciona Simple.For Entity type, select Simple

A continuación, haz clic en el botón Listo para crear la nueva identidad:Then click the Done button to create the new entity:

mrlearning-speech

Repite el paso anterior para crear otra entidad denominada Target. De este modo, tendrás dos entidades denominadas Action y Target:Repeat the previous step to create another entity named Target, so you have two entities named Action and Target:

mrlearning-speech

Precaución

Para los fines de este tutorial, el proyecto de Unity hará referencia a estas entidades por su nombre, "Action" y "Target".For the purpose of this tutorial, your Unity project will reference these entities by their names, i.e. 'Action' and 'Target'. Por lo tanto, es muy importante que asignes exactamente el mismo nombre a las entidades.Consequently, it is extremely important that you name your entities exactly the same.

5. Asignar entidades a las expresiones de ejemplo5. Assign entities to the example utterances

Desde la página Entidades, vuelve a la página de la intención PressButton.From the Entities page, navigate back to the PressButton intent page.

De vuelta a la página de la intención PressButton, haz clic en la palabra go y, después, en la palabra ahead y, a continuación, selecciona Action (Simple) en el menú contextual para etiquetar go ahead como valor de la entidad Action:Once back on the the PressButton intent page, click on the word go and then on the word ahead, and then select Action (Simple) from the contextual popup menu to label go ahead as an Action entity value:

mrlearning-speech

Ahora, la frase go ahead está definida como un valor de la entidad Action.The go ahead phrase is now defined as an Action entity value. Si pasas el ratón por encima del nombre de entidad Action, podrás ver el valor de la entidad Action asociado:If you hover your mouse cursor above the Action entity name, you can see the associated Action entity value:

mrlearning-speech

Nota

La línea roja que aparece debajo de la etiqueta en la imagen anterior indica que el valor de la entidad no se ha predicho, lo que se resolverá al entrenar el modelo en la siguiente sección.The red line you see under the label in the image above indicates that the entity value has not been predicted, this will be resolved when you train the model in the next section.

A continuación, haz clic en la palabra launch y selecciona Target (Simple) en el menú contextual emergente para etiquetar launch como valor de la entidad Target:Next, click on the word launch, and then select Target (Simple) from the contextual popup menu to label launch as a Target entity value:

mrlearning-speech

Ahora, la palabra launch está definida como valor de la entidad Target.The launch word is now defined as a Target entity value. Si pasas el ratón por encima del nombre de la entidad Target, podrás ver el valor de la entidad Target asociado:If you hover your mouse cursor above the Target entity name, you can see the associated Target entity value:

mrlearning-speech

Ahora, la expresión de ejemplo de la intención PressButton "go ahead and launch the rocket" (adelante, lanza el cohete) se ha configurado para predecirse como se indica a continuación:The PressButton intent example utterance 'go ahead and launch the rocket' is now configured to be predicted as follows:

  • Intención: PressButtonIntent: PressButton
  • Entidad Action: go aheadAction entity: go ahead
  • Entidad Target: launchTarget entity: launch

Repite el proceso anterior de dos pasos para asignar una etiqueta de entidad Action y Target a cada una de las expresiones de ejemplo, teniendo en cuenta que las siguientes palabras se deben etiquetar como entidades Target:Repeat the previous two-step process to assign an Action and a Target entity label to each of the example utterances, keeping in mind that the following words should be labeled as Target entities:

  • hint (destinada a HintsButton en el proyecto de Unity)hint (targets the HintsButton in the Unity project)
  • hints (destinada a HintsButton en el proyecto de Unity)hints (targets HintsButton in the Unity project)
  • reset (destinada a ResetButton en el proyecto de Unity)reset (targets the ResetButton in the Unity project)
  • launch (destinada a LaunchButton en el proyecto de Unity)launch (targets the LaunchButton in the Unity project)

Una vez etiquetadas todas las expresiones de ejemplo, la página de la intención PressButton debería tener un aspecto similar al siguiente:When all the example utterances have been labeled, your PressButton intent page should look similar to this:

mrlearning-speech

Una forma alternativa de comprobar que has asignado las entidades correctas es hacer clic en el menú Opciones de visualización y cambiar la vista a Mostrar valores de entidad:For an alternative way to double-check that you have assigned the correct entities, click the View options menu and switch the view to Show entity values:

mrlearning-speech

Ahora, con la vista definida para mostrar valores de entidad, puedes pasar el ratón por encima de las palabras y frases etiquetadas para comprobar rápidamente el nombre de entidad asignado:Now, with the view set to show entity values, you can hover the mouse courser over the labeled words and phrases to quickly verify the assigned entity name:

mrlearning-speech

6. Entrenar, probar y publicar la aplicación6. Train, test, and publish the app

Para entrenar la aplicación, haz clic en el botón Entrenar y espera a que se complete el proceso de entrenamiento:To train the app, click the Train button and wait for the training process to complete:

mrlearning-speech

Nota

Como puedes ver en la imagen anterior, se han quitado las líneas rojas de todas las etiquetas, lo que indica que se han predicho todos los valores de entidad.As you can see in the image above, the red lines under all the labels have been removed, indicating that all the entity values have been predicted. Observa también que el icono de estado situado a la izquierda del botón Entrenar ha cambiado de color rojo a verde.Also notice that the status icon to the left of the Train button has changed color from red to green.

Cuando se acabe de procesar el entrenamiento, haz clic en el botón Probar, escribe go ahead and launch the rocket y presiona la tecla Entrar:When the training is finished processing, click the Test button, then type in go ahead and launch the rocket and press the Enter key:

mrlearning-speech

Una vez procesada la expresión de prueba, haz clic en Inspeccionar para ver el resultado de la prueba:When the test utterance has been processed, click Inspect to see the test result:

  • Intención: PressButton (con una certeza del 98,5 %)Intent: PressButton (with a 98.5% certainty)
  • Entidad Action: go aheadAction entity: go ahead
  • Entidad Target: launchTarget entity: launch

mrlearning-speech

Para publicar la aplicación, haz clic en el botón Publicar de la parte superior derecha y, a continuación, en la ventana emergente Elige el espacio de publicación y la configuración, selecciona Producción y haz clic en el botón Publicar:To publish the app, click the Publish button in the top right, then in the Choose your publishing slot and settings popup window, select Production and click the Publish button:

mrlearning-speech

Espera hasta que se complete el proceso de publicación:Wait for the publishing process to complete:

mrlearning-speech

7. Asignar un recurso de predicción de Azure a la aplicación7. Assign an Azure prediction resource to the app

Ve a la página Administrar > Configuración de la aplicación > Recursos de Azure:Navigate to the Manage > Application Settings > Azure Resources page:

mrlearning-speech

En la página Recursos de Azure, haz clic en el botón Agregar recurso de predicción y selecciona los valores siguientes en la ventana emergente Asignar un recurso a la aplicación:On the Azure Resources page, click the Add prediction resource button and select the following values in the Assign a resource to your app popup window:

A continuación, haz clic en el botón Asignar recurso para asignar el recurso de predicción de Azure a la aplicación:Then click the Assign resource button to assign the Azure prediction resource to your app:

mrlearning-speech

Una vez asignado el recurso, la página de recursos de Azure debería tener un aspecto similar al siguiente:When the resource has been assigned, your Azure Resources page should look similar to this:

mrlearning-speech

Conexión del proyecto de Unity con la aplicación de LUISConnecting the Unity project to the LUIS app

En la página Administrar > Configuración de la aplicación > Recursos de Azure, haz clic en el icono copiar para copiar el Ejemplo de consulta:On the Manage > Application Settings > Azure Resources page, click the copy icon to copy the Example Query:

mrlearning-speech

Desde el proyecto de Unity, en la ventana Hierarchy (Jerarquía), selecciona el objeto Lunarcom y, a continuación, en la ventana Inspector, busca el componente Lunarcom Intent Recognizer (Script) (Reconocimiento de la intención de Lunarcom [script]) y configúralo como se indica a continuación:Back in your Unity project, in the Hierarchy window, select the Lunarcom object, then in the Inspector window, locate the Lunarcom Intent Recognizer (Script) component and configure it as follows:

  • En el campo LUIS Endpoint (Punto de conexión de LUIS), después del Ejemplo de consulta que copiaste en el paso anterior:In the LUIS Endpoint field, past the Example Query you copied in the previous step:

mrlearning-speech

Probar y mejorar el reconocimiento de la intenciónTesting and improving the intent recognition

Para usar el reconocimiento de la intención directamente en el editor de Unity, debes permitir que el equipo de desarrollo use el dictado.To use intent recognition directly in the Unity editor, you must allow your development computer to use dictation. Para comprobar esta configuración, abre la Configuración de Windows, elige Privacidad > Voz y asegúrate de que el Reconocimiento de voz en línea esté activado:To verify this setting, open Windows Settings then choose Privacy > Speech and ensure Online speech recognition is turned on:

mrlearning-speech

Si ahora entras en el modo de juego, puedes probar el reconocimiento de la intención presionando el botón del cohete:If you now enter Game mode, you can test the intent recognition by first pressing the rocket button. Después, suponiendo que el equipo tiene micrófono, al decir la primera expresión de ejemplo, go ahead and launch the rocket (adelante, lanza el cohete), verás el lanzamiento al espacio de LunarModule:Then, assuming your computer has a microphone, when you say the first example utterance, go ahead and launch the rocket, you will see the LunarModule launch into space:

mrlearning-speech

Prueba todas las expresiones de ejemplo, algunas variaciones de las expresiones de ejemplo y algunas expresiones aleatorias.Try all the example utterances, then some variation of the example utterances, as well as, a few random utterances.

A continuación, vuelve a LUIS y ve a la página Compilación > Mejorar el rendimiento de la aplicación > Revisar las expresiones de punto de conexión, usa el botón de alternancia para cambiar ente la vista predeterminada de entidades y la de tokens y, a continuación, revisa las expresiones:Next, return to LUIS and navigate to Build > Improve app performance > Review endpoint utterances page, use the toggle button to switch from the default Entities View to Tokens View, and then review the utterances:

  • En la columna Expresión, cambia y quita las etiquetas asignadas según sea necesario para alinearlas con tu intención.In the Utterance column, change and remove the assigned labels as needed so they align with your intent
  • En la columna Intención alineada, comprueba que la intención sea correcta.In the Aligned intent column, verify that the intent is correct
  • En la columna Agregar o eliminar, haz clic en el botón de marca de verificación verde para agregar la expresión o en el botón x rojo para eliminarla.In the Add/Delete column, click the green check mark button to add the utterance or the red x button to delete it

Cuando haya revisado todas las expresiones que quieras, haz clic en el botón Entrenar para volver a entrenar el modelo y, luego, en el botón Publicar para volver a publicar la aplicación actualizada:When you have reviewed as many utterances as you like, click the Train button to retrain the model, then the Publish button to republish the updated app:

mrlearning-speech

Nota

Si una expresión de punto de conexión no está alineada con la intención de PressButton, pero quieres que el modelo sepa que la expresión no tiene ninguna intención, puedes cambiar la intención alineada a Ninguna.If an endpoint utterance does not align with the PressButton intent, but you would like your model to know that the utterance has no intent, you can change the Aligned intent to None.

Repite este proceso tantas veces como quieras para mejorar el modelo de la aplicación.Repeat this process as many times as you like to improve your app model.

EnhorabuenaCongratulations

Ahora, el proyecto tiene comandos de voz con tecnología de IA, lo que permite que la aplicación reconozca la intención de los usuarios aunque no usen comandos precisos.Your project now have AI-powered speech commands, allowing your application to recognize the users' intent even if they do not utter precise commands. Ejecuta la aplicación en el dispositivo para asegurarte de que la característica funciona correctamente.Run the application on your device to ensure the feature is working properly.