BLOG Y NOTICIAS

21.11.2017

Nuestro primer ejemplo aborda un caso muy sencillo, en el cual el reconocimiento del habla con base en el entrenamiento predeterminado con el que cuenta Watson Speech To Text, reconoce nuestra frase, por ejemplo, “quiero un regalo para mi cumpleaños”, cuyo archivo de audio podemos escuchar en el siguiente enlace:

 

El resultado de la transcripción de dicho audio que ha sido devuelto por Watson Speech to Text es:

 {

    "results": [

        {

            "alternatives": [

                {

                    "confidence": 0.984,

                    "transcript": "quiero un regalo para mi cumpleaños "

                }

            ],

            "final": true

        }

    ],

    "result_index": 0

}

 

Como podemos ver, este resultado cumple nuestras expectativas en cuanto a lo que hemos hablado.

 Pero ¿Qué sucede si nos encontramos en una situación en la que deseamos que Watson Speech to Text pueda reconocer, por ejemplo, nombres de medicamentos dentro de la industria médica?

 Tomemos por ejemplo, el siguiente audio cuya habla es “debemos recetar Diazepam a este paciente”:

 

Con la frase de este audio, el resultado por defecto de Watson Speech to Text es:

{

    "results": [

        {

            "alternatives": [

                {

                    "confidence": 0.765,

                    "transcript": "debemos trece tardía sepan a este paciente "

                }

            ],

            "final": true

        }

    ],

    "result_index": 0

}

 El hecho de tener una o más palabras fuera del vocabulario predeterminado que reconoce Watson Speech to Text, hace que la respuesta devuelta por este servicio no sea la que esperamos, principalmente si vamos a utilizar más nombres de medicamentos a lo largo de nuestro proyecto.

 Para este tipo de casos, Watson Speech to Text nos permite crear y entrenar un modelo personalizado de lenguaje que se incluye en el entrenamiento base que este servicio ya de por sí nos brinda.

 ¿Cómo lo hacemos?

 Lo primero que debemos hacer es crear el modelo personalizado de lenguaje. Para esto hacemos una llamada a la API, que, en este caso, el ejemplo más básico consiste en usar la aplicación Curl de la siguiente forma:

curl -X POST -u "{username}":"{password}"

--header "Content-Type: application/json"

--data "{\"name\": \"Modelo de medicamentos\",

  \"base_model_name\": \"es-ES_NarrowbandModel\",

  \"dialect\": \"es-LA\",

  \"description\": \"Ejemplo de modelo de lenguaje personalizado\"}"

"https://stream.watsonplatform.net/speech-to-text/api/v1/customizations"

La respuesta de la llamada anterior devolverá el “customization ID” del nuevo modelo creado y que resultará necesario copiarlo para futuras llamadas que necesitaremos hacer.

En la llamada anterior, debemos tomar en cuenta el parámetro “dialect”, que, en el caso del idioma español, es importante incluirlo para que Watson Speech to Text tome en cuenta la fonética utilizada para reconocer el habla. En este caso, se indicó el español latinoamericano.

Lo otro que debemos tomar en cuenta, es el modelo base que vamos a indicar para nuestro nuevo modelo personalizado. En este caso, hemos utilizado el modelo “es-ES_NarrowbandModel” pero para español también se encuentra disponible el modelo base “es-ES_BroadbandModel” que se puede utilizar y probar versus el anterior con el fin de determinar el mejor modelo para nuestra necesidad.

El siguiente paso es recopilar todos esos nombres de medicamentos e incluirlos en un archivo de texto plano junto con frases típicas en las que dichos nombres se utilizan. Se debe incluir un medicamento por línea ya que el modelo personalizado de lenguaje analiza una línea por vez en el archivo y con sólo una vez que detecte esa palabra fuera de vocabulario es más que suficiente. Ejemplos de estas líneas son:

Voy a recomendar Diazepam para este paciente

Con base en el análisis que hemos llevado a cabo, debemos recetar Clonazepam

El tratamiento con Acetaminofén le ayudará con sus dolores de cabeza

Considero recetar Ibuprofeno para este caso específico

Una vez que tenemos el archivo de texto plano con estas frases que contienen palabras que necesitamos sean reconocidas por Watson Speech to Text, debemos incluirlo como el “corpus” en nuestro nuevo modelo personalizado haciendo la llamada a la API de la siguiente forma:

curl -X POST -u "{username}":"{password}"

--data-binary "@corpusmed.txt"

"https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}/corpora/corpusmed”

Debido al trabajo que debe hacer Watson para incorporar estas frases a nuestro modelo personalizado, puede que no esté disponible de manera inmediata. Por lo que podemos consultar el estado del análisis de nuestro “corpus” para que del estatus “being_processed” pase a “analyzed”. Esto lo podemos hacer con la siguiente llamada a la API:

curl -u "{username}":"{password}" -X GET https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}/corpora

Mientras el análisis no haya terminado, recibiremos una respuesta parecida a la siguiente:

{"corpora": [{
 "out_of_vocabulary_words": 0,
 "total_words": 0,
 "name": "corpusmed",
 "status": "being_processed"
}]}

Podremos seguir realizando esta llamada a la API hasta que obtengamos una respuesta parecida a esta:

{"corpora": [{
 "out_of_vocabulary_words": 4,
 "total_words": 38,
 "name": "corpusmed",
 "status": "analyzed"
}]} 

En este caso, vemos que se han detectado algunas palabras “fuera de vocabulario”, que consisten precisamente en esas palabras nuevas que incluiremos dentro del entrenamiento de nuestro modelo personalizado.

Para observar cuáles fueron esas palabras OOV (fuera de vocabulario) debemos hacer la siguiente llamada a la API:

curl -u "{username}":"{password}" -X GET
https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}/words?sort=count

Y obtendremos una respuesta parecida a esta: (recortada)

{"words": [
   {
      "display_as": "Diazepam",
      "sounds_like": [
         "Diazepam"
      ],
      "count": 1,
      "source": ["corpusmed"],
      "word": "Diazepam"
   },
   ...
   {
      "display_as": "Clonazepam",
      "sounds_like": [         "Clonazepam"      ],
      "count": 1,
      "source": ["corpusmed"],
      "word": "Clonazepam"
   }, ...
]}

Finalmente, debemos entrenar a nuestro modelo para poder reconocer las nuevas palabras al utilizar Watson Speech to Text. Esto lo hacemos llamando a la API de esta forma:

curl -u "{username}":"{password}" -X POST -H "Content-type: application/json" --data "{}"
https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id}/train

NOTA: esta llamada devuelve una respuesta vacía.

De la misma forma, esto no es una operación inmediata, por lo que podemos estar consultando el estado de este entrenamiento para que del estatus “training” pase a “available”:

curl -u "{username}":"{password}" -X GET https://stream.watsonplatform.net/speech-to-text/api/v1/customizations/{customization_id} 

Una vez que nuestro modelo ya se encuentra disponible después del entrenamiento, podemos probar nuevamente nuestro archivo de audio en el servicio Watson Speech to Text añadiendo al request el parámetro “customization_id” cuyo valor es el ID de nuestro modelo personalizado. De esta forma, obtenemos una mejor respuesta de la que obtuvimos sin el modelo personalizado:

{

    "results": [

        {

            "alternatives": [

                {

                    "confidence": 0.815,

                    "transcript": "debemos recetar Diazepam a este paciente "

                }

            ],

            "final": true

        }

    ],

    "result_index": 0

}

Asimismo, el texto reconocido es mucho más preciso que con el entrenamiento original, además de que reconoce nuestras nuevas palabras del dominio de industria que estamos manejando.

De esta forma hemos mostrado una manera muy sencilla en la que podemos potenciar el valor de Watson Speech to Text para cualquier necesidad en cualquier industria que se necesite.

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *