Mejorar los resultados de las transcripciones con la adaptación de modelos

Información general

Puedes usar la función adaptación de modelos para ayudar a Speech-to-Text a reconocer palabras o frases concretas con más frecuencia que otras opciones que, de otro modo, se habrían sugerido. Por ejemplo, supongamos que tus datos de audio suelen incluir la palabra "tiempo". Cuando Speech-to-Text se encuentre con la palabra "tiempo", quieres que la transcriba como "tiempo" con más frecuencia que "si". En este caso, puedes usar la adaptación del modelo para que Speech-to-Text reconozca "tiempo".

La adaptación de modelos es especialmente útil en los siguientes casos prácticos:

  • Mejorar la precisión de las palabras y frases que aparecen con frecuencia en tus datos de audio. Por ejemplo, puedes alertar al modelo de reconocimiento sobre los comandos de voz que suelen usar tus usuarios.

  • Se amplía el vocabulario de palabras reconocidas por Speech-to-Text. Speech-to-Text incluye un vocabulario muy amplio. Sin embargo, si tus datos de audio suelen contener palabras que no se usan con frecuencia en el lenguaje general (como nombres propios o palabras específicas de un dominio), puedes añadirlas mediante la adaptación del modelo.

  • Mejorar la precisión de la transcripción de voz cuando el audio proporcionado contiene ruido o no es muy nítido.

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

Mejorar el reconocimiento de palabras y frases

Para aumentar la probabilidad de que Speech-to-Text reconozca la palabra "tiempo" al transcribir tus datos de audio, puedes enviar la palabra "tiempo" en el objeto PhraseSet de un recurso SpeechAdaptation.

Cuando proporcionas una frase de varias palabras, es más probable que Speech-to-Text reconozca esas palabras en secuencia. Si proporcionas una frase, también aumentará la probabilidad de reconocer partes de la frase, incluidas palabras concretas. Consulta la página Límites de contenido para ver los límites del número y el tamaño de estas frases.

Si quieres, puedes ajustar la intensidad de la adaptación del modelo con la función de refuerzo de la adaptación del modelo.

Mejorar el reconocimiento con clases

Las clases representan conceptos comunes que aparecen en el lenguaje natural, como las unidades monetarias y las fechas del calendario. Una clase te permite mejorar la precisión de la transcripción de grupos grandes de palabras que se corresponden con 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 dicen su dirección postal. Puede que tengas una grabación de audio de alguien diciendo "Mi casa está en la calle Principal, 123, es la cuarta casa de la izquierda". En este caso, quieres que Speech-to-Text reconozca la primera secuencia de números ("123") como una dirección en lugar de como un ordinal ("ciento veintitrés"). Sin embargo, no todas las personas viven en "123 Main Street". No es práctico enumerar todas las direcciones postales posibles en un recurso PhraseSet. En su lugar, puedes usar una clase para indicar que se debe reconocer un número de calle independientemente del número que sea. En este ejemplo, Speech-to-Text podría transcribir con mayor precisión frases como "123 Main Street" y "987 Grand Boulevard" porque ambas se reconocen como números de dirección.

Tokens de clase

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 clase admitidos para ver qué tokens están disponibles en tu idioma. Por ejemplo, para mejorar la transcripción de los números de las direcciones del audio de origen, proporciona el valor $ADDRESSNUM en tu objeto SpeechContext.

Puedes usar clases como elementos independientes en la matriz phrases o insertar uno o varios 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 contenga una frase similar, pero no idéntica, como "Estoy en la calle Principal, número 123". Para facilitar el reconocimiento de frases similares, es importante incluir también el token de clase por sí solo: ["my address is $ADDRESSNUM", "$ADDRESSNUM"]. Si usas un token de clase no válido o mal formado, Speech-to-Text lo ignora sin activar un error, pero sigue usando el resto de la frase para el contexto.

Clases personalizadas

También puedes crear tu propio CustomClass, una clase compuesta por tu lista personalizada de elementos o valores relacionados. Por ejemplo, quieres transcribir datos de audio que probablemente incluyan el nombre de uno de los cientos de restaurantes de una zona. Los nombres de restaurantes son relativamente poco frecuentes en el lenguaje general y, por lo tanto, es menos probable que el modelo de reconocimiento los elija como respuesta "correcta". Puedes sesgar el modelo de reconocimiento para que identifique correctamente estos nombres cuando aparezcan en tu audio mediante una clase personalizada.

Para usar una clase personalizada, cree un recurso CustomClass que incluya el nombre de cada restaurante como ClassItem. Las clases personalizadas funcionan igual que los tokens de clase predefinidos. Un phrase puede incluir tokens de clase prediseñados y clases personalizadas.

Gramáticas ABNF

También puede usar gramáticas en notación aumentada de Backus-Naur (ABNF) para especificar patrones de palabras. Si se incluye una gramática ABNF en la adaptación del modelo de la solicitud, aumentará la probabilidad de que Speech-to-Text 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 ABNF también pueden incluir referencias a recursos CustomClass y PhraseSet. Para obtener más información sobre la sintaxis de este campo, consulta la sección Speech Recognition Grammar Specification y code sample que se indican a continuación.

Afinar los resultados de las transcripciones con la función Aumento

De forma predeterminada, la adaptación del modelo ya debería proporcionar un efecto suficiente en la mayoría de los casos. La función aumento de la adaptación de modelos te permite aumentar el sesgo del modelo de reconocimiento asignando más peso a algunas frases que a otras. Le recomendamos que implemente la función de refuerzo solo si 1) ya ha implementado la adaptación del modelo y 2) quiere ajustar aún más la intensidad de los efectos de la adaptación del modelo en los resultados de la transcripción.

Por ejemplo, tienes muchas grabaciones de usuarios que preguntan por la "tarifa para entrar en la feria del condado", donde la palabra "feria" aparece con más frecuencia que "tarifa". En este caso, puedes usar la adaptación del modelo para aumentar la probabilidad de que el modelo reconozca tanto "fair" como "fare" añadiéndolos como phrases en un recurso PhraseSet. De esta forma, Speech-to-Text reconocerá "fair" y "fare" con más frecuencia que, por ejemplo, "hare" o "lair".

Sin embargo, "fair" debería reconocerse con más frecuencia que "fare" debido a que aparece con más frecuencia en el audio. Es posible que ya hayas transcrito el audio con la API Speech-to-Text y hayas detectado un gran número de errores al reconocer la palabra correcta ("fair"). En este caso, también puedes usar las frases con boost para asignar un valor de impulso más alto a "fair" que a "fare". El valor de ponderación más alto asignado a "fair" sesga la API Speech-to-Text para que elija "fair" con más frecuencia que "fare". Sin valores de refuerzo, el modelo de reconocimiento reconocerá "fair" y "fare" con la misma probabilidad.

Aspectos básicos de las promociones

Cuando usas la función de aumentar, asignas un valor ponderado a los elementos phrase de un recurso PhraseSet. Transcripción de voz tiene en cuenta este valor ponderado al seleccionar una posible transcripción de las palabras de tus datos de audio. Cuanto mayor sea el valor, más probable será que la función de conversión de voz a texto elija esa palabra o frase entre las alternativas posibles.

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

Si no obtienes los resultados que buscas al potenciar una frase de varias palabras, te recomendamos que añadas todos los bigramas (2 palabras, en orden) que componen la frase como elementos phrase adicionales y que asignes valores de potenciación a cada uno. Siguiendo con el ejemplo anterior, podrías investigar si añadir bigramas y N-gramas adicionales (más de dos palabras), como "mi favorito", "mi exposición favorita", "exposición favorita", "mi exposición favorita en el Museo Americano de Historia Natural", "Museo Americano de Historia Natural", "ballena azul", etc. De esta forma, es más probable que el modelo de reconocimiento de Speech-to-Text reconozca frases relacionadas en tu audio que contengan partes de la frase potenciada original, pero que no coincidan palabra por palabra.

Definir valores de aumento

Los valores de impulso deben ser un valor float mayor que 0. El límite máximo práctico de los valores de impulso es 20. Para obtener los mejores resultados, experimenta con las transcripciones ajustando los valores de refuerzo hasta que obtengas transcripciones precisas.

Si los valores de refuerzo son más altos, se pueden producir menos falsos negativos, que son los casos en los que la palabra o la frase se ha pronunciado en el audio, pero Speech-to-Text no la ha reconocido correctamente. Sin embargo, el refuerzo también puede aumentar la probabilidad de que se produzcan falsos positivos, es decir, casos en los que la palabra o la frase aparecen en la transcripción aunque no se hayan pronunciado en el audio.

Recibir notificaciones de tiempo de espera

Las respuestas de Speech-to-Text incluyen un campo SpeechAdaptationInfo que proporciona información sobre el comportamiento de adaptación del modelo durante el reconocimiento. Si se ha producido un tiempo de espera relacionado con la adaptación del modelo, adaptationTimeout será true y timeoutMessage especificará qué configuración de adaptación ha provocado el tiempo de espera. Cuando se produce un tiempo de espera, la adaptación del modelo no afecta a la transcripción devuelta.

Ejemplo de uso de la adaptación de modelos

En el siguiente ejemplo se muestra el proceso de uso de la adaptación de modelos para transcribir una grabación de audio de alguien que dice "llámame fionity y oh, dios mío, ¿qué tenemos aquí, ionity?". En este caso, es importante que el modelo identifique "fionity" e "ionity" correctamente.

El siguiente comando realiza el reconocimiento del audio sin adaptación del modelo. La transcripción resultante es incorrecta: "call me Fiona tea and oh my gosh what do we have here I own a day".

   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"
       }
     }
   

Mejorar la transcripción con una 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 la 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. Añade las frases "fionity" e "ionity" a PhraseSet y asigna el valor 10 a cada una:boost

    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}]}'

    El PhraseSet se ha actualizado a:

    {
      "phrases":[
         {
              "value":"ionity",
              "boost":10
           },
           {
              "value":"fionity",
              "boost":10
           }
        ]
     }
  4. Vuelve a reconocer el audio, esta vez usando la adaptación del modelo y el PhraseSet que has creado antes. Los resultados de la transcripción ahora son correctos: "call me fionity and oh my gosh what do we have here ionity".

    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"
       }
    }

Mejorar los resultados de las transcripciones con un CustomClass

  1. Crea un 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. Reconocer el clip de audio de prueba. El CustomClass está vacío, por lo que la transcripción devuelta sigue siendo incorrecta: "call me Fiona tea and oh my gosh what do we have here I own a day":

    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. Añade las frases "fionity" y "ionity" 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"}]}'

    De esta forma, la clase personalizada se actualizará de la siguiente manera:

    {
       "items":[
          {
             "value":"ionity"
          },
          {
             "value":"fionity"
          }
       ]
    }
  5. Reconoce el audio de muestra de nuevo, esta vez con "fionity" e "ionity" en la CustomClass. La transcripción ahora es correcta: "call me fionity and oh my gosh what do we have here ionity".

    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"
       }
    }

Hacer referencia a un CustomClass en un PhraseSet

  1. Actualiza el recurso PhraseSet que has creado anteriormente para que haga 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 mediante el recurso PhraseSet (que hace referencia a CustomClass). La transcripción es correcta: "call me fionity and oh my gosh what do we have here ionity".

    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
          }
       ]
    }

Elimina el CustomClass y el PhraseSet.

  1. Elimina el 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. Elimina el 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"

Mejorar los resultados de las transcripciones con un ABNF Grammar

  1. Reconoce el audio con un abnf_grammar. En este ejemplo se hace referencia a un recurso CustomClass: projects/project_id/locations/global/customClasses/test-custom-class-1, un CustomClass insertado: 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 de 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 ;" 
                ]
             }
          }
       }
    }

Siguientes pasos