Melhore a precisão da transcrição com a otimização da adaptação de fala

Antes de começar

A otimização da adaptação de fala é um recurso opcional de adaptação de fala. Verifique se você revisou a documentação da adaptação de fala antes de implementar a otimização. Para ver se o recurso de otimização está disponível para seu idioma, consulte a página de suporte a idiomas.

Visão geral

Por padrão, a adaptação de fala fornece um efeito relativamente pequeno, especialmente para frases com uma palavra. A otimização da adaptação de fala permite aumentar o viés do modelo de reconhecimento atribuindo mais peso a algumas frases do que a outras. Por exemplo, você tem muitas gravações de pessoas perguntando sobre "a seção de espera para participar da sessão", com a palavra" "sessão" ocorrendo com mais frequência do que "seção". Nesse caso, você quer que a Speech-to-Text reconheça "sessão" e "seção" com mais frequência do que, por exemplo, "secção". No entanto, "sessão" deve ser reconhecida com mais frequência do que" "seção" "devido ao fato de aparecerem com mais frequência no áudio.

Nesse caso, convém otimizar "sessão" e "seção" para aumentar a probabilidade do reconhecimento correto dessas palavras. No entanto, como "sessão" ocorre mais do que "seção", é possível atribuir um valor ponderado mais alto para "sessão" para induzir a API Speech-to-Text a escolher essa palavra com mais frequência do que "seção".

Como definir valores de otimização

Ao usar a otimização, você atribui um valor ponderado a um objeto SpeechContext. A Speech-to-Text consulta esse valor ponderado ao selecionar uma possível transcrição para palavras nos seus dados de áudio. Quanto maior o valor, maior será a probabilidade da Speech-to-Text escolher essa frase entre as possíveis alternativas.

Valores de otimização maiores podem resultar em menos falsos negativos, que são casos em que a palavra ou frase ocorreu no áudio, mas não foi reconhecida corretamente pela Speech-to-Text. No entanto, a otimização também pode aumentar a probabilidade de falsos positivos. Ou seja, casos em que a palavra ou frase aparece na transcrição, mesmo que não tenha ocorrido no áudio.

Os valores de otimização precisam ser um valor flutuante maior que 0. O limite máximo prático para valores de otimização é 20. Para melhores resultados, teste seus resultados de transcrição escolhendo um valor de otimização inicial e ajustando-o para cima ou para baixo.

Exemplo de otimização de adaptação de fala

Para definir valores de aumento diferentes para "sessão" e "seção" na solicitação de transcrição de fala, defina dois objetos SpeechContext para a matriz speechContexts do objeto RecognitionConfig. Defina um valor boost como um valor flutuante não negativo para cada objeto SpeechContext, um contendo “sessão” e o outro contendo “seção”.

O snippet a seguir mostra um exemplo de um payload JSON enviado para a API Speech-to-Text. O snippet JSON inclui um objeto RecognitionConfig que usa valores de otimização para ponderar as palavras "sessão" e "seção" de maneira diferente.

"config": {
    "encoding":"LINEAR16",
    "sampleRateHertz": 8000,
    "languageCode":"en-US",
    "speechContexts": [{
      "phrases": ["fair"],
      "boost": 15
     }, {
      "phrases": ["fare"],
      "boost": 2
     }]
  }

Confira na amostra de código a seguir como enviar uma solicitação usando o recurso de adaptação de fala.

REST e LINHA DE CMD

Para mais detalhes sobre o endpoint da API, consulte speech:recognize.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • language-code: o código BCP-47 do idioma falado no seu clipe de áudio.
  • phrases-to-boost: frase ou frases que você quer que a Speech-to-Text aumente, como uma matriz de strings.
  • storage-bucket: um bucket do Cloud Storage
  • input-audio: os dados de áudio que você quer transcrever.

Método HTTP e URL:

POST https://speech.googleapis.com/v1p1beta1/speech:recognize

Corpo JSON da solicitação:

{
  "config":{
      "languageCode":"language-code",
      "speechContexts":[{
          "phrases":[phrases-to-boost],
          "boost": 2
      }]
  },
  "audio":{
    "uri":"gs:storage-bucket/input-file"
  }
}

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "When deciding whether to bring an umbrella, I consider the weather",
          "confidence": 0.9463943
        }
      ],
      "languageCode": "en-us"
    }
  ]
}

Java

import com.google.cloud.speech.v1p1beta1.RecognitionAudio;
import com.google.cloud.speech.v1p1beta1.RecognitionConfig;
import com.google.cloud.speech.v1p1beta1.RecognizeRequest;
import com.google.cloud.speech.v1p1beta1.RecognizeResponse;
import com.google.cloud.speech.v1p1beta1.SpeechClient;
import com.google.cloud.speech.v1p1beta1.SpeechContext;
import com.google.cloud.speech.v1p1beta1.SpeechRecognitionAlternative;
import com.google.cloud.speech.v1p1beta1.SpeechRecognitionResult;
import java.io.IOException;

public class SpeechAdaptation {

  public void speechAdaptation() throws IOException {
    String uriPath = "gs://cloud-samples-data/speech/brooklyn_bridge.mp3";
    speechAdaptation(uriPath);
  }

  public static void speechAdaptation(String uriPath) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SpeechClient speechClient = SpeechClient.create()) {

      // Provides "hints" to the speech recognizer to favor specific words and phrases in the
      // results.
      // https://cloud.google.com/speech-to-text/docs/reference/rpc/google.cloud.speech.v1p1beta1#google.cloud.speech.v1p1beta1.SpeechContext
      SpeechContext speechContext =
          SpeechContext.newBuilder().addPhrases("Brooklyn Bridge").setBoost(20.0F).build();
      // Configure recognition config to match your audio file.
      RecognitionConfig config =
          RecognitionConfig.newBuilder()
              .setEncoding(RecognitionConfig.AudioEncoding.MP3)
              .setSampleRateHertz(44100)
              .setLanguageCode("en-US")
              .addSpeechContexts(speechContext)
              .build();
      // Set the path to your audio file
      RecognitionAudio audio = RecognitionAudio.newBuilder().setUri(uriPath).build();

      // Make the request
      RecognizeRequest request =
          RecognizeRequest.newBuilder().setConfig(config).setAudio(audio).build();

      // Display the results
      RecognizeResponse response = speechClient.recognize(request);
      for (SpeechRecognitionResult result : response.getResultsList()) {
        // First alternative is the most probable result
        SpeechRecognitionAlternative alternative = result.getAlternativesList().get(0);
        System.out.printf("Transcript: %s\n", alternative.getTranscript());
      }
    }
  }
}

Node.js


const speech = require('@google-cloud/speech').v1p1beta1;

/**
 * Performs synchronous speech recognition with speech adaptation.
 *
 * @param sampleRateHertz {number} Sample rate in Hertz of the audio data sent in all
 * `RecognitionAudio` messages. Valid values are: 8000-48000.
 * @param languageCode {string} The language of the supplied audio.
 * @param phrase {string} Phrase "hints" help Speech-to-Text API recognize the specified phrases from
 * your audio data.
 * @param boost {number} Positive value will increase the probability that a specific phrase will be
 * recognized over other similar sounding phrases.
 * @param uriPath {string} Path to the audio file stored on GCS.
 */
function sampleRecognize(
  sampleRateHertz,
  languageCode,
  phrase,
  boost,
  uriPath
) {
  const client = new speech.SpeechClient();
  // const sampleRateHertz = 44100;
  // const languageCode = 'en-US';
  // const phrase = 'Brooklyn Bridge';
  // const boost = 20.0;
  // const uriPath = 'gs://cloud-samples-data/speech/brooklyn_bridge.mp3';
  const encoding = 'MP3';
  const phrases = [phrase];
  const speechContextsElement = {
    phrases: phrases,
    boost: boost,
  };
  const speechContexts = [speechContextsElement];
  const config = {
    encoding: encoding,
    sampleRateHertz: sampleRateHertz,
    languageCode: languageCode,
    speechContexts: speechContexts,
  };
  const audio = {
    uri: uriPath,
  };
  const request = {
    config: config,
    audio: audio,
  };
  client
    .recognize(request)
    .then(responses => {
      const response = responses[0];
      for (const result of response.results) {
        // First alternative is the most probable result
        const alternative = result.alternatives[0];
        console.log(`Transcript: ${alternative.transcript}`);
      }
    })
    .catch(err => {
      console.error(err);
    });
}

Python

from google.cloud import speech_v1p1beta1
from google.cloud.speech_v1p1beta1 import enums

def sample_recognize(storage_uri, phrase):
    """
    Transcribe a short audio file with speech adaptation.

    Args:
      storage_uri URI for audio file in Cloud Storage, e.g. gs://[BUCKET]/[FILE]
      phrase Phrase "hints" help recognize the specified phrases from your audio.
    """

    client = speech_v1p1beta1.SpeechClient()

    # storage_uri = 'gs://cloud-samples-data/speech/brooklyn_bridge.mp3'
    # phrase = 'Brooklyn Bridge'
    phrases = [phrase]

    # Hint Boost. This value increases the probability that a specific
    # phrase will be recognized over other similar sounding phrases.
    # The higher the boost, the higher the chance of false positive
    # recognition as well. Can accept wide range of positive values.
    # Most use cases are best served with values between 0 and 20.
    # Using a binary search happroach may help you find the optimal value.
    boost = 20.0
    speech_contexts_element = {"phrases": phrases, "boost": boost}
    speech_contexts = [speech_contexts_element]

    # Sample rate in Hertz of the audio data sent
    sample_rate_hertz = 44100

    # The language of the supplied audio
    language_code = "en-US"

    # Encoding of audio data sent. This sample sets this explicitly.
    # This field is optional for FLAC and WAV audio formats.
    encoding = enums.RecognitionConfig.AudioEncoding.MP3
    config = {
        "speech_contexts": speech_contexts,
        "sample_rate_hertz": sample_rate_hertz,
        "language_code": language_code,
        "encoding": encoding,
    }
    audio = {"uri": storage_uri}

    response = client.recognize(config, audio)
    for result in response.results:
        # First alternative is the most probable result
        alternative = result.alternatives[0]
        print(u"Transcript: {}".format(alternative.transcript))

A seguir