Introducción a la adaptación de modelos

Descripción general

Puedes usar la función de adaptación de modelos para ayudar a Cloud Speech-to-Text a reconocer palabras o frases específicas con más frecuencia que otras opciones que podrían sugerirse. Por ejemplo, supongamos que tus datos de audio suelen incluir la palabra "hola". Cuando Cloud STT encuentra esta palabra, quieres que la transcriba como "hola" con más frecuencia que "ola". En este caso, puedes usar la adaptación de modelos para orientar a Cloud STT a que reconozca "hola".

La adaptación de modelos resulta útil en los casos de uso que se indican a continuación:

  • Mejorar la exactitud de las palabras y frases que aparecen con frecuencia en los datos de audio. Por ejemplo, puedes alertar al modelo de reconocimiento sobre los comandos por voz que suelen pronunciar los usuarios.

  • Expandir el vocabulario de palabras reconocidas por Cloud STT. Este modelo incluye un vocabulario muy amplio. Sin embargo, si tus datos de audio suelen incluir palabras poco comunes en el lenguaje general (como nombres propios o palabras específicas de un dominio), puedes agregarlas con la adaptación de modelos

  • Mejorar la exactitud de la transcripción de voz cuando el audio proporcionado contiene ruido o no es muy claro

Para ver si la función de adaptación de modelo está disponible en tu idioma, consulta la página de idiomas admitidos.

Mejora el reconocimiento de palabras y frases

Para aumentar la probabilidad de que Cloud STT reconozca la palabra "hola" cuando transcriba tus datos de audio, puedes pasar esta palabra única por el objeto PhraseSet en un recurso de SpeechAdaptation.

Cuando proporcionas una frase de varias palabras, es más probable que Cloud STT las reconozca en secuencia. Con esta frase, también aumenta la probabilidad de reconocer partes de ella, incluidas las palabras individuales. Consulta la página límites de contenido para conocer los límites de la cantidad y el tamaño de estas frases.

De manera opcional, puedes ajustar la intensidad de la adaptación de modelos con la función de mejora de la adaptación de modelos.

Mejora el reconocimiento con clases

Las clases representan conceptos comunes que aparecen en el lenguaje natural, como unidades monetarias y fechas del calendario. Con una clase, puedes mejorar la exactitud de la transcripción de grupos grandes de palabras que se asignan a un concepto común, pero que no siempre incluyen palabras o frases idénticas.

Por ejemplo, supongamos que tus datos de audio incluyen grabaciones de personas que mencionan su dirección. Podrías tener una grabación de audio de alguien que dice "Mi casa está en Calle Principal 123, la cuarta casa a la izquierda". En este caso, querrás que Cloud STT reconozca la primera secuencia de números ("123") como una dirección en lugar de un número ordinal ("ciento veintitrés"). Sin embargo, no todas las personas viven en "Calle Principal 123". No es práctico crear una lista de todas las direcciones posibles en un recurso PhraseSet. En su lugar, puedes usar una clase para indicar que un número de calle debe reconocerse sin importar cuál sea el número. En este ejemplo, Cloud STT podría transcribir con mayor exactitud frases como "Calle Principal 123" y "Gran Boulevard 987" porque ambas se reconocen como números de direcciones.

Tokens de clases

Para usar una clase en la adaptación de modelos, incluye un token de clase en el campo phrases de un recurso PhraseSet. Consulta la lista de tokens de clases admitidos para ver cuáles están disponibles para tu idioma. Por ejemplo, para mejorar la transcripción de los números de dirección de tu audio de origen, proporciona el valor $ADDRESSNUM en tu objeto SpeechContext.

Puedes usar clases como elementos independientes en el array phrases o incorporar uno o más tokens de clase en frases de varias palabras más largas. Por ejemplo, puedes indicar un número de dirección en una frase más larga incluyendo el token de clase en una cadena: ["my address is $ADDRESSNUM"]. Sin embargo, esta frase no será útil en los casos en los que el audio incluya una frase similar, pero no idéntica, como: "Estoy en Calle Principal 123". Para facilitar el reconocimiento de frases similares, es importante incluir, además, el token de clase por separado: ["my address is $ADDRESSNUM", "$ADDRESSNUM"]. Si usas un token de clase no válido o con errores de formato, Cloud STT lo ignorará sin activar un error, pero usará el resto de la frase para el contexto.

Clases personalizadas

También puedes crear tu propia CustomClass, una clase compuesta por tu lista personalizada de elementos o valores relacionados. Por ejemplo, puedes transcribir datos de audio que es probable que incluyan el nombre de cualquiera de cientos de restaurantes regionales. Los nombres de restaurantes no aparecen con frecuencia en el lenguaje general y, por lo tanto, es menos probable que el modelo de reconocimiento los elija como respuesta "correcta". Puedes orientar al modelo de reconocimiento para que identifique correctamente estos nombres cuando aparezcan en un audio con una clase personalizada.

Para usar una clase personalizada, crea un recurso CustomClass que incluya cada nombre de restaurante como ClassItem. Las clases personalizadas funcionan de la misma manera que los tokens de clases precompilados. Una phrase puede incluir tokens de clases precompilados y clases personalizadas.

Gramáticas de ABNF

También puedes usar las gramáticas en forma Backus-Naur aumentada (ABNF) para especificar patrones de palabras. Incluir una gramática ABNF en la adaptación de modelos de la solicitud aumentará la probabilidad de que Cloud STT reconozca todas las palabras que coincidan con la gramática especificada.

Para usar esta función, incluye un objeto ABNF grammar en el campo SpeechAdaptation de tu solicitud. Las gramáticas de ABNF también pueden incluir referencias a los recursos CustomClass y PhraseSet. Para obtener más información sobre la sintaxis de este campo, consulta Speech Recognition Grammar Specification y nuestro code sample en la siguiente sección.

Ajusta los resultados de transcripción con una mejora

De forma predeterminada, la adaptación de modelos ya debe proporcionar un efecto suficiente en la mayoría de los casos. La función de mejora de la adaptación de modelos permite orientar mejor al modelo de reconocimiento asignando más ponderaciones a algunas frases que a otras. Te recomendamos que implementes la mejora solo si, 1) ya implementaste la adaptación de modelos y, 2) deseas ajustar aún más la intensidad de los efectos de la adaptación de modelos en los resultados de la transcripción.

Por ejemplo, tienes muchas grabaciones de personas que preguntan si "se normalizaron los vuelos hacia Asia", en las que la palabra "Asia" aparece con más frecuencia que "hacia". En este caso, puedes usar la adaptación de modelos para aumentar la probabilidad de que el modelo reconozca “Asia” y “hacia” agregándolas como phrases a un recurso PhraseSet. Esta acción le indicará a Cloud STT que reconozca "Asia" y "hacia" con más frecuencia que, por ejemplo, "lacia" o "fascia".

Sin embargo, "Asia" debe reconocerse más a menudo que "hacia", ya que aparece con más frecuencia en el audio. Es posible que ya hayas transcrito el audio con la API de Cloud Speech-to-Text y hayas encontrado una gran cantidad de errores relacionados con el reconocimiento de la palabra correcta ("Asia"). En este caso, también puedes usar las frases con mejora para asignar un valor de mejora más alto a "Asia" que "hacia". El valor ponderado asignado a "Asia", que es más alto, orienta a la API de Cloud Speech-to-Text para que elija "Asia" con más frecuencia que "hacia". Sin los valores de mejora, el modelo de reconocimiento reconocerá "Asia" y "hacia" con la misma probabilidad.

Conceptos básicos de la mejora

Cuando se usa la mejora, se asigna un valor ponderado a los elementos de una phrase de un recurso PhraseSet. Cloud STT hace referencia a este valor ponderado cuando elige una transcripción posible de palabras incluidas en los datos de audio. Cuanto más alto sea el valor, mayor será la probabilidad de que elija esa palabra o frase entre las alternativas posibles.

Por ejemplo, supongamos que quieres asignar un valor de mejora a la frase "Mi exposición favorita del Museo Estadounidense de Historia Natural es la ballena azul". Si agregas esa frase a un objeto phrase y asignas un valor de mejora, es más probable que el modelo de reconocimiento reconozca esa frase en su totalidad palabra por palabra.

Si no obtienes los resultados que buscas mejorando una frase de varias palabras, te sugerimos que agregues todos los bigramas (2 palabras, en orden) que compongan la frase como elementos phrase adicionales y asignes los valores de mejora a cada uno. Siguiendo con el ejemplo anterior, podrías investigar cómo agregar bigramas y n-gramas adicionales (más de 2 palabras), como "mi favorita", "mi exposición favorita", "exposición favorita", "mi exposición favorita del Museo Estadounidense de Historia Natural", "Museo Estadounidense de Historia Natural" y "ballena azul". Es más probable que el modelo de reconocimiento Cloud STT reconozca frases relacionadas en el audio que incluyan partes de la frase original mejorada, pero no coincidan palabra por palabra.

Establece valores de mejora

Los valores de mejora deben ser un número de punto flotante mayor que 0. El límite máximo práctico para los valores de mejora es de 20. Para mejorar la calidad, experimenta con los resultados de la transcripción aumentando o disminuyendo los valores de mejora hasta que obtengas resultados precisos.

Los valores de mejora más altos pueden generar menos falsos negativos, que son casos en los que la palabra o la frase apareció en el audio, pero Cloud STT no la reconoció correctamente. Sin embargo, la mejora también puede aumentar la probabilidad de falsos positivos. Es decir, casos en los que la palabra o la frase aparece en la transcripción aunque no se haya mencionado en el audio.

Recibe notificaciones de tiempo de espera

Las respuestas de Cloud STT incluyen un campo SpeechAdaptationInfo, que proporciona información sobre el comportamiento de la adaptación del modelo durante el reconocimiento. Si se produjo un tiempo de espera relacionado con la adaptación del modelo, adaptationTimeout será true y timeoutMessage especificará qué configuración de adaptación causó el tiempo de espera. Cuando se produce un tiempo de espera, la adaptación del modelo no tiene efecto en la transcripción que se devuelve.

Caso de uso de ejemplo sobre la adaptación de modelos

En el ejemplo siguiente, se explica el proceso de adaptación de modelos para transcribir una grabación de audio de una persona que dice "llámame Danilo y oh Dios mío qué tenemos aquí Camilo". En este caso, es importante que el modelo identifique de forma correcta "Danilo" y "Camilo".

Con el siguiente comando, se realiza el reconocimiento del audio sin la adaptación de modelos. La transcripción resultante es incorrecta: "llámame Dani y lo oh Dios mío qué tenemos aquí camínalo".

   curl -H "Authorization: Bearer $(gcloud auth
   --impersonate-service-account=$SA_EMAIL print-access-token)" -H
   "Content-Type: application/json; charset=utf-8"
   "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
   {"languageCode": "en-US"}, "audio":
   {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'
   

Solicitud de ejemplo:

     {
       "config":{
       "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
     }
   

Mejora la transcripción con un PhraseSet

  1. Crea un PhraseSet:

    curl -X POST -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets"
    -d '{"phraseSetId": "test-phrase-set-1"}'

    Solicitud de ejemplo:

    {
       "phraseSetId":"test-phrase-set-1"
    }
  2. Obtén el PhraseSet:

    curl -X GET -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id>/locations/global/phraseSets/test-phrase-set-1"\
  3. Agrega las frases "Danilo" y "Camilo" al PhraseSet y asigna un valor boost de 10 a cada una:

    curl -X PATCH -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets/test-phrase-set-1?updateMask=phrases"\
    -d '{"phrases": [{"value": "ionity", "boost": 10}, {"value": "fionity", "boost": 10}]}'

    PhraseSet se actualizó a lo siguiente:

    {
      "phrases":[
         {
              "value":"ionity",
              "boost":10
           },
           {
              "value":"fionity",
              "boost":10
           }
        ]
     }
  4. Vuelve a reconocer el audio, esta vez con la adaptación de modelos y el PhraseSet creado antes. Los resultados transcritos son correctos: "llámame Danilo y oh Dios mío qué tenemos aquí Camilo".

    curl -H "Authorization: Bearer $(gcloud auth --impersonate-service-account=$SA_EMAIL print-access-token)"
    -H "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phrase_set_references": ["projects/project_id/locations/global/phraseSets/test-phrase-set-1"]},
    "languageCode": "en-US"}, "audio": {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'

    Solicitud de ejemplo:

    {
       "config":{
          "adaptation":{
             "phrase_set_references":[
                "projects/project_id/locations/global/phraseSets/test-phrase-set-1"
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
    }

Mejora los resultados de la transcripción con una CustomClass

  1. Crea una CustomClass:

    curl -X POST -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses"
    -d '{"customClassId": "test-custom-class-1"}'

    Solicitud de ejemplo:

    {
       "customClassId": "test-custom-class-1"
    }
  2. Obtén la CustomClass:

     curl -X GET -H "Authorization: Bearer $(gcloud auth
     --impersonate-service-account=$SA_EMAIL print-access-token)" -H
     "Content-Type: application/json; charset=utf-8"
     "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses/test-custom-class-1"
     
  3. Reconoce el clip de audio de prueba. La CustomClass está vacía, por lo que la transcripción que se devuelve sigue siendo incorrecta: "llámame Dani y lo oh Dios mío qué tenemos aquí camínalo":

    curl -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phraseSets": [{"phrases": [{"value":
    "${projects/project_idlocations/global/customClasses/test-custom-class-1}",
    "boost": "10"}]}]}, "languageCode": "en-US"}, "audio":
    {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'

    Solicitud de ejemplo:

      {
       "config":{
          "adaptation":{
             "phraseSets":[
                {
                   "phrases":[
                      {
                         "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
                         "boost":"10"
                      }
                   ]
                }
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
     }
  4. Agrega las frases "Camilo" y "Danilo" a la clase personalizada:

    curl -X PATCH -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses/test-custom-class-1?updateMask=items"
    -d '{"items": [{"value": "ionity"}, {"value": "fionity"}]}'

    Esto actualiza la clase personalizada a lo siguiente:

    {
       "items":[
          {
             "value":"ionity"
          },
          {
             "value":"fionity"
          }
       ]
    }
  5. Vuelve a reconocer el audio de muestra, esta vez con "Danilo" y "Camilo" en la CustomClass. La transcripción ahora es correcta: "llámame Danilo y oh Dios mío qué tenemos aquí Camilo".

    curl -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phraseSets": [{"phrases": [{"value":
    "${projects/project_id/locations/global/customClasses/test-custom-class-1}",
    "boost": "10"}]}]}, "languageCode": "en-US"}, "audio":
    {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'

    Solicitud de ejemplo:

    {
       "config":{
          "adaptation":{
             "phraseSets":[
                {
                   "phrases":[
                      {
    "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
                         "boost":"10"
                      }
                   ]
                }
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
    }

Haz referencia a una CustomClass en un PhraseSet

  1. Actualiza el recurso PhraseSet creado antes para hacer referencia a CustomClass:

    curl -X PATCH -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets/test-phrase-set-1?updateMask=phrases"
    -d '{"phrases": [{"value": "${projects/project_id/locations/global/customClasses/test-custom-class-1}", "boost": 10}]}'

    Solicitud de ejemplo:

    {
       "config":{
          "adaptation":{
             "phraseSets":[
                {
                   "phrases":[
                      {
                         "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
                         "boost":"10"
                      }
                   ]
                }
             ]
          },
          "languageCode":"en-US"
       },
       "audio":{
          "uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"
       }
    }
  2. Reconoce el audio con el recurso PhraseSet (que hace referencia a CustomClass). La transcripción es correcta: "llámame Danilo y oh Dios mío qué tenemos aquí Camilo".

    curl -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/speech:recognize" -d '{"config":
    {"adaptation": {"phrase_set_references":
    ["projects/project_id/locations/global/phraseSets/test-phrase-set-1"]},
    "languageCode": "en-US"}, "audio":
    {"uri":"gs://biasing-resources-test-audio/call_me_fionity_and_ionity.wav"}}'

    Solicitud de ejemplo:

    {
       "phrases":[
          {
             "value":"${projects/project_id/locations/global/customClasses/test-custom-class-1}",
             "boost":10
          }
       ]
    }

Borra la CustomClass y el PhraseSet

  1. Borra PhraseSet:

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/phraseSets/test-phrase-set-1"
  2. Borra CustomClass:

    curl -X DELETE -H "Authorization: Bearer $(gcloud auth
    --impersonate-service-account=$SA_EMAIL print-access-token)" -H
    "Content-Type: application/json; charset=utf-8"
    "https://speech.googleapis.com/v1p1beta1/projects/project_id/locations/global/customClasses/test-custom-class-1"

Mejora los resultados de la transcripción con una ABNF Grammar

  1. Reconoce el audio con una abnf_grammar. En este ejemplo, se hace referencia a un recurso CustomClass: projects/project_id/locations/global/customClasses/test-custom-class-1, una CustomClass intercalada: test-custom-class-2, un token de clase: ADDRESSNUM, y un recurso PhraseSet: projects/project_id/locations/global/phraseSets/test-phrase-set-1. La primera regla en las cadenas (después de las declaraciones externas) se tratará como la raíz.

    Solicitud de ejemplo:

    {
       "config":{
          "adaptation":{
             "abnf_grammar":{
                "abnf_strings": [
                  "external ${projects/project_id/locations/global/phraseSets/test-phrase-set-1}" ,
                  "external ${projects/project_id/locations/global/customClasses/test-custom-class-1}" ,
                  "external ${test-custom-class-2}" ,
                  "external $ADDRESSNUM" ,
                  "$root = $test-phrase-set-1 $name lives in $ADDRESSNUM;" ,
                  "$name = $title $test-custom-class-1 $test-custom-class-2" ,
                  "$title = Mr | Mrs | Miss | Dr | Prof ;"
                ]
             }
          }
       }
    }

¿Qué sigue?