Construção de pedidos de conversão de voz em texto

Este documento é um guia sobre os princípios básicos da utilização da funcionalidade de conversão de voz em texto. Este guia conceptual aborda os tipos de pedidos que pode fazer ao Speech-to-Text, como criar esses pedidos e como processar as respetivas respostas. Recomendamos que todos os utilizadores da API Speech-to-Text leiam este guia e um dos tutoriais associados antes de explorarem a própria API.

Experimente

Se está a usar o Google Cloud pela primeira vez, crie uma conta para avaliar o desempenho do Speech-to-Text em cenários reais. Os novos clientes também recebem 300 USD em créditos gratuitos para executar, testar e implementar cargas de trabalho.

Experimente a conversão de voz em texto gratuitamente

Pedidos de voz

O Speech-to-Text tem três métodos principais para realizar o reconhecimento de voz. Estes são indicados abaixo:

  • O reconhecimento síncrono (REST e gRPC) envia dados de áudio para a API Speech-to-Text, realiza o reconhecimento desses dados e devolve os resultados depois de todo o áudio ter sido processado. Os pedidos de reconhecimento síncronos estão limitados a dados de áudio com uma duração de 1 minuto ou menos.

  • O reconhecimento assíncrono (REST e gRPC) envia dados de áudio para a API Speech-to-Text e inicia uma operação de longa duração. Com esta operação, pode consultar periodicamente os resultados do reconhecimento. Use pedidos assíncronos para dados de áudio de qualquer duração até 480 minutos.

  • O reconhecimento em streaming (apenas gRPC) realiza o reconhecimento em dados de áudio fornecidos numa stream bidirecional gRPC. Os pedidos de streaming são concebidos para fins de reconhecimento em tempo real, como a captura de áudio em direto de um microfone. O reconhecimento de streaming fornece resultados provisórios enquanto o áudio está a ser capturado, o que permite que o resultado seja apresentado, por exemplo, enquanto um utilizador ainda está a falar.

Os pedidos contêm parâmetros de configuração, bem como dados de áudio. As secções seguintes descrevem estes tipos de pedidos de reconhecimento, as respostas que geram e como processar essas respostas mais detalhadamente.

Reconhecimento da Speech-to-Text API

Um pedido de reconhecimento síncrono da API Speech-to-Text é o método mais simples para realizar o reconhecimento em dados de áudio de voz. O Speech-to-Text pode processar até 1 minuto de dados de áudio de voz enviados num pedido síncrono. Depois de o Speech-to-Text processar e reconhecer todo o áudio, devolve uma resposta.

Um pedido síncrono é de bloqueio, o que significa que o Speech-to-Text tem de devolver uma resposta antes de processar o pedido seguinte. Normalmente, a conversão de voz em texto processa o áudio mais rapidamente do que em tempo real, processando 30 segundos de áudio em 15 segundos, em média. Em casos de má qualidade de áudio, o seu pedido de reconhecimento pode demorar significativamente mais tempo.

O Speech-to-Text tem métodos REST e gRPC para chamar pedidos síncronos e assíncronos da API Speech-to-Text. Este artigo demonstra a API REST porque é mais simples mostrar e explicar a utilização básica da API. No entanto, a composição básica de um pedido REST ou gRPC é bastante semelhante. Os pedidos de reconhecimento em streaming só são suportados pelo gRPC.

Pedidos de reconhecimento de voz síncronos

Um pedido síncrono da API Speech-to-Text consiste numa configuração de reconhecimento de voz e em dados de áudio. Segue-se um exemplo de pedido:

{
    "config": {
        "encoding": "LINEAR16",
        "sampleRateHertz": 16000,
        "languageCode": "en-US",
    },
    "audio": {
        "uri": "gs://bucket-name/path_to_audio_file"
    }
}

Todos os pedidos de reconhecimento síncrono da API Speech-to-Text têm de incluir um campo de reconhecimento de voz config (do tipo RecognitionConfig). O elemento RecognitionConfig contém os seguintes subcampos:

  • encoding - (obrigatório) especifica o esquema de codificação do áudio fornecido (do tipo AudioEncoding). Se tiver uma escolha de codec, dê preferência a uma codificação sem perdas, como FLAC ou LINEAR16, para um melhor desempenho. (Para mais informações, consulte o artigo Codificações de áudio.) O campo encoding é opcional para ficheiros FLAC e WAV em que a codificação está incluída no cabeçalho do ficheiro.
  • sampleRateHertz - (obrigatório) especifica a taxa de amostragem (em Hertz) do áudio fornecido. (Para mais informações sobre as taxas de amostragem, consulte a secção Taxas de amostragem abaixo.) O campo sampleRateHertz é opcional para ficheiros FLAC e WAV em que a taxa de amostragem está incluída no cabeçalho do ficheiro.
  • languageCode - (obrigatório) contém o idioma + região/localidade a usar para o reconhecimento de voz do áudio fornecido. O código de idioma tem de ser um identificador BCP-47. Tenha em atenção que os códigos de idioma consistem normalmente em etiquetas de idioma principais e subetiquetas de região secundárias para indicar dialetos (por exemplo, "en" para inglês e "US" para os Estados Unidos no exemplo acima). (Para ver uma lista de idiomas suportados, consulte o artigo Idiomas suportados.)
  • maxAlternatives - (opcional, predefinição: 1) indica o número de transcrições alternativas a fornecer na resposta. Por predefinição, a API Speech-to-Text fornece uma transcrição principal. Se quiser avaliar alternativas diferentes, defina maxAlternatives para um valor mais elevado. Tenha em atenção que o Speech-to-Text só devolve alternativas se o reconhecedor determinar que as alternativas têm qualidade suficiente. Em geral, as alternativas são mais adequadas para pedidos em tempo real que requerem feedback do utilizador (por exemplo, comandos de voz) e, por isso, são mais adequadas para pedidos de reconhecimento de streaming.
  • profanityFilter - (opcional) indica se deve filtrar palavras ou expressões profanas. As palavras filtradas contêm a primeira letra e asteriscos para os restantes carateres (por exemplo, f***). O filtro de obscenidades funciona com palavras únicas e não deteta discurso abusivo ou ofensivo que seja uma expressão ou uma combinação de palavras.
  • speechContext - (opcional) contém informações contextuais adicionais para o processamento deste áudio. Um contexto contém os seguintes subcampos:
    • boost - contém um valor que atribui um peso ao reconhecimento de uma determinada palavra ou expressão.
    • phrases: contém uma lista de palavras e expressões que fornecem sugestões à tarefa de reconhecimento de voz. Para mais informações, consulte as informações sobre a adaptação de voz.

O áudio é fornecido à API Speech-to-Text através do parâmetro audio do tipo RecognitionAudio. O campo audio contém qualquer um dos seguintes subcampos:

  • content contém o áudio a avaliar, incorporado no pedido. Consulte a secção Incorporação de conteúdo de áudio abaixo para mais informações. O áudio transmitido diretamente neste campo está limitado a 1 minuto de duração.
  • uri contém um URI que aponta para o conteúdo de áudio. O ficheiro não pode ser comprimido (por exemplo, gzip). Atualmente, este campo tem de conter um URI do Google Cloud Storage (no formato gs://bucket-name/path_to_audio_file). Consulte a secção Transmitir referência de áudio através de um URI abaixo.

Abaixo, são apresentadas mais informações sobre estes parâmetros de pedido e resposta.

Taxas de amostragem

Especifica a taxa de amostragem do áudio no campo sampleRateHertz da configuração do pedido e tem de corresponder à taxa de amostragem do conteúdo ou da stream de áudio associada. As taxas de amostragem entre 8000 Hz e 48 000 Hz são suportadas no Speech-to-Text. Pode especificar a taxa de amostragem de um ficheiro FLAC ou WAV no cabeçalho do ficheiro em vez de usar o campo sampleRateHertz. Um ficheiro FLAC tem de conter a taxa de amostragem no cabeçalho FLAC para ser enviado para a API Speech-to-Text.

Se tiver uma escolha ao codificar o material de origem, capture o áudio com uma taxa de amostragem de 16 000 Hz. Os valores inferiores a este podem prejudicar a precisão do reconhecimento de voz, e os níveis mais elevados não têm um efeito apreciável na qualidade do reconhecimento de voz.

No entanto, se os seus dados de áudio já tiverem sido gravados a uma taxa de amostragem existente diferente de 16 000 Hz, não volte a fazer a amostragem do áudio para 16 000 Hz. Por exemplo, a maioria do áudio de telefonia antigo usa taxas de amostragem de 8000 Hz, o que pode dar resultados menos precisos. Se tiver de usar esse áudio, forneça-o à API Speech à sua taxa de amostragem nativa.

Idiomas

O motor de reconhecimento da funcionalidade de conversão de voz em texto suporta vários idiomas e dialetos. Especifica o idioma (e o dialeto nacional ou regional) do áudio no campo languageCode da configuração do pedido, através de um identificador BCP-47.

Pode consultar uma lista completa dos idiomas suportados para cada funcionalidade na página Suporte de idiomas.

Compensações de tempo (indicações de tempo)

O Speech-to-Text pode incluir valores de deslocamento de tempo (datas/horas) para o início e o fim de cada palavra falada que é reconhecida no áudio fornecido. Um valor de deslocamento de tempo representa a quantidade de tempo decorrido desde o início do áudio, em incrementos de 100 ms.

Os desvios de tempo são especialmente úteis para analisar ficheiros de áudio mais longos, nos quais pode ter de pesquisar uma palavra específica no texto reconhecido e localizá-la (procurá-la) no áudio original. Os desvios de tempo são suportados para todos os nossos métodos de reconhecimento: recognize, streamingrecognize e longrunningrecognize.

Os valores de desvio de tempo só são incluídos para a primeira alternativa fornecida na resposta de reconhecimento.

Para incluir desvios de tempo nos resultados do seu pedido, defina o parâmetro enableWordTimeOffsets como verdadeiro na configuração do pedido. Para ver exemplos de utilização da API REST ou das bibliotecas cliente, consulte o artigo Usar desvios de tempo (datas/horas). Por exemplo, pode incluir o parâmetro enableWordTimeOffsets na configuração do pedido, conforme mostrado aqui:

{
"config": {
  "languageCode": "en-US",
  "enableWordTimeOffsets": true
  },
"audio":{
  "uri":"gs://gcs-test-data/gettysburg.flac"
  }
}

O resultado devolvido pela API Speech-to-Text contém valores de deslocamento de tempo para cada palavra reconhecida, conforme mostrado abaixo:

{
  "name": "6212202767953098955",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "progressPercent": 100,
    "startTime": "2017-07-24T10:21:22.013650Z",
    "lastUpdateTime": "2017-07-24T10:21:45.278630Z"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [
      {
        "alternatives": [
          {
            "transcript": "Four score and twenty...(etc)...",
            "confidence": 0.97186122,
            "words": [
              {
                "startTime": "1.300s",
                "endTime": "1.400s",
                "word": "Four"
              },
              {
                "startTime": "1.400s",
                "endTime": "1.600s",
                "word": "score"
              },
              {
                "startTime": "1.600s",
                "endTime": "1.600s",
                "word": "and"
              },
              {
                "startTime": "1.600s",
                "endTime": "1.900s",
                "word": "twenty"
              },
              ...
            ]
          }
        ]
      },
      {
        "alternatives": [
          {
            "transcript": "for score and plenty...(etc)...",
            "confidence": 0.9041967,
          }
        ]
      }
    ]
  }
}

Seleção de modelo

O Speech-to-Text pode usar um de vários modelos de aprendizagem automática para transcrever o seu ficheiro de áudio. A Google preparou estes modelos de reconhecimento de voz para tipos e fontes de áudio específicos.

Quando envia um pedido de transcrição de áudio para o serviço Speech-to-Text, pode melhorar os resultados que recebe especificando a origem do áudio original. Isto permite que a API Speech-to-Text processe os seus ficheiros de áudio através de um modelo de aprendizagem automática preparado para reconhecer áudio de voz desse tipo específico de origem.

Para especificar um modelo para o reconhecimento de voz, inclua o campo model no objeto RecognitionConfig do seu pedido, especificando o modelo que quer usar.

Consulte a lista de modelos de transcrição de conversão de voz em texto para ver os modelos de aprendizagem automática disponíveis.

Conteúdo de áudio incorporado

O áudio incorporado é incluído no pedido de reconhecimento de voz quando transmite um parâmetro content no campo audio do pedido. Para áudio incorporado fornecido como conteúdo num pedido gRPC, esse áudio tem de ser compatível com a serialização Proto3 e fornecido como dados binários. Para o áudio incorporado fornecido como conteúdo num pedido REST, esse áudio tem de ser compatível com a serialização JSON e tem de estar codificado em Base64. Consulte o artigo Codificar o áudio em Base64 para mais informações.

Quando cria um pedido com uma biblioteca de cliente do Google Cloud, normalmente, escreve estes dados binários (ou codificados em base 64) diretamente no campo content.

Transmita áudio referenciado por um URI

Normalmente, transmite um parâmetro uri no campo audio do pedido de voz, que aponta para um ficheiro de áudio (em formato binário, não base64) localizado no Google Cloud Storage do seguinte formulário:

gs://bucket-name/path_to_audio_file

Por exemplo, a seguinte parte de um pedido de voz faz referência ao ficheiro de áudio de exemplo usado no início rápido:

...
    "audio": {
        "uri":"gs://cloud-samples-tests/speech/brooklyn.flac"
    }
...

Tem de ter as autorizações de acesso adequadas para ler ficheiros do Google Cloud Storage, como uma das seguintes:

  • Legíveis publicamente (como os nossos ficheiros de áudio de exemplo)
  • Legível pela sua conta de serviço, se estiver a usar a autorização da conta de serviço.
  • Legível por uma conta de utilizador, se usar o OAuth trilateral para autorização da conta de utilizador.

Pode encontrar mais informações sobre a gestão do acesso ao Google Cloud Storage no artigo Criar e gerir listas de controlo de acesso na documentação do Google Cloud Storage.

Respostas da Speech-to-Text API

Conforme indicado anteriormente, uma resposta da API Speech-to-Text síncrona pode demorar algum tempo a devolver resultados, proporcional à duração do áudio fornecido. Depois de processada, a API devolve uma resposta, conforme apresentado abaixo:

{
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.98267895,
          "transcript": "how old is the Brooklyn Bridge"
        }
      ]
    }
  ]
}

Estes campos são explicados abaixo:

  • results contém a lista de resultados (do tipo SpeechRecognitionResult), em que cada resultado corresponde a um segmento de áudio (os segmentos de áudio são separados por pausas). Cada resultado é composto por um ou mais dos seguintes campos:
    • alternatives contém uma lista de possíveis transcrições do tipo SpeechRecognitionAlternatives. A apresentação de mais do que uma alternativa depende de ter pedido mais do que uma alternativa (definindo maxAlternatives para um valor superior a 1) e de o Speech-to-Text ter produzido alternativas de qualidade suficientemente elevada. Cada alternativa vai consistir nos seguintes campos:

Se não for possível reconhecer nenhuma fala no áudio fornecido, a lista results devolvida não vai conter nenhum item. Normalmente, a voz não reconhecida é o resultado de áudio de qualidade muito baixa ou de valores de código de idioma, codificação ou taxa de amostragem que não correspondem ao áudio fornecido.

Os componentes desta resposta são explicados nas secções seguintes.

Cada resposta da API Speech-to-Text síncrona devolve uma lista de resultados, em vez de um único resultado que contenha todo o áudio reconhecido. A lista de áudio reconhecido (nos elementos transcript) é apresentada por ordem contígua.

Selecione alternativas

Cada resultado numa resposta de reconhecimento síncrono bem-sucedida pode conter um ou mais alternatives (se o valor maxAlternatives do pedido for superior a 1). Se o Speech-to-Text determinar que uma alternativa tem um valor de confiança suficiente, essa alternativa é incluída na resposta. A primeira alternativa na resposta é sempre a melhor (mais provável).

A definição de maxAlternatives para um valor superior a 1 não implica nem garante que serão devolvidas várias alternativas. Em geral, mais do que uma alternativa é mais adequada para fornecer opções em tempo real aos utilizadores que recebem resultados através de um pedido de reconhecimento de streaming.

Processamento de transcrições

Cada alternativa fornecida na resposta vai conter um transcript com o texto reconhecido. Quando lhe são apresentadas alternativas sequenciais, deve concatenar estas transcrições.

O seguinte código Python itera uma lista de resultados e concatena as transcrições. Tenha em atenção que consideramos a primeira alternativa (a alternativa zero) em todos os casos.

response = service_request.execute()
recognized_text = 'Transcribed Text: \n'
for i in range(len(response['results'])):
    recognized_text += response['results'][i]['alternatives'][0]['transcript']

Valores de confiança

O valor de confidence é uma estimativa entre 0,0 e 1,0. É calculado agregando os valores de "probabilidade" atribuídos a cada palavra no áudio. Um número mais elevado indica uma probabilidade estimada maior de que as palavras individuais tenham sido reconhecidas corretamente. Este campo é normalmente fornecido apenas para a hipótese principal e apenas para resultados em que is_final=true. Por exemplo, pode usar o valor confidence para decidir se deve mostrar resultados alternativos ao utilizador ou pedir-lhe confirmação.

No entanto, tenha em atenção que o modelo determina o "melhor" resultado com a classificação mais elevada com base em mais sinais do que apenas a pontuação confidence (como o contexto da frase). Por este motivo, existem casos ocasionais em que o resultado principal não tem a pontuação de confiança mais elevada. Se não tiver pedido vários resultados alternativos, o único resultado "melhor" devolvido pode ter um valor de confiança inferior ao esperado. Isto pode ocorrer, por exemplo, em casos em que estão a ser usadas palavras raras. A uma palavra raramente usada pode ser atribuído um valor de "probabilidade" baixo, mesmo que seja reconhecida corretamente. Se o modelo determinar que a palavra rara é a opção mais provável com base no contexto, esse resultado é devolvido na parte superior, mesmo que o valor confidence do resultado seja inferior às opções alternativas.

Pedidos e respostas assíncronos

Um pedido assíncrono da Speech-to-Text API para o método LongRunningRecognize é idêntico em termos de forma a um pedido síncrono da Speech-to-Text API. No entanto, em vez de devolver uma resposta, o pedido assíncrono inicia uma operação de longa duração (do tipo Operation) e devolve esta operação imediatamente ao autor da chamada. Pode usar o reconhecimento de voz assíncrono com áudio de qualquer duração até 480 minutos.

A resposta de uma operação típica é apresentada abaixo:

{
  "name": "operation_name",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata"
    "progressPercent": 34,
    "startTime": "2016-08-30T23:26:29.579144Z",
    "lastUpdateTime": "2016-08-30T23:26:29.826903Z"
  }
}

Tenha em atenção que ainda não existem resultados. A conversão de voz em texto continua a processar o áudio e usa esta operação para armazenar os resultados. Os resultados são apresentados no campo response da operação devolvida quando o pedido LongRunningRecognize estiver concluído.

A resposta completa após a conclusão do pedido é apresentada abaixo:

{
  "name": "1268386125834704889",
  "metadata": {
    "lastUpdateTime": "2016-08-31T00:16:32.169Z",
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongrunningRecognizeMetadata",
    "startTime": "2016-08-31T00:16:29.539820Z",
    "progressPercent": 100
  }
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [{
      "alternatives": [{
        "confidence": 0.98267895,
        "transcript": "how old is the Brooklyn Bridge"
      }]}]
  },
  "done": True,
}

Tenha em atenção que done foi definido como True e que a operação response contém um conjunto de resultados do tipo SpeechRecognitionResult que é o mesmo tipo devolvido por um pedido de reconhecimento da API Speech-to-Text síncrono.

Por predefinição, uma resposta REST assíncrona define done como False, o respetivo valor predefinido. No entanto, uma vez que o JSON não exige que os valores predefinidos estejam presentes num campo, quando testa se uma operação está concluída, deve testar se o campo done está presente e se está definido como True.

Pedidos de reconhecimento da Streaming Speech-to-Text API

Uma chamada de reconhecimento da API Speech-to-Text de streaming foi concebida para a captura e o reconhecimento de áudio em tempo real, numa stream bidirecional. A sua aplicação pode enviar áudio na stream de pedido e receber resultados de reconhecimento provisórios e finais na stream de resposta em tempo real. Os resultados provisórios representam o resultado de reconhecimento atual de uma secção de áudio, enquanto o resultado de reconhecimento final representa a melhor estimativa mais recente para essa secção de áudio.

Pedidos de streaming

Ao contrário das chamadas síncronas e assíncronas, nas quais envia a configuração e o áudio num único pedido, a chamada da API Speech de streaming requer o envio de vários pedidos. O primeiro StreamingRecognizeRequest tem de conter uma configuração do tipo StreamingRecognitionConfig sem áudio associado. Os StreamingRecognizeRequests enviados posteriormente na mesma stream consistirão em frames consecutivos de bytes de áudio não processados.

Um StreamingRecognitionConfig é composto pelos seguintes campos:

  • config - (obrigatório) contém informações de configuração para o áudio, do tipo RecognitionConfig e é igual ao apresentado em pedidos síncronos e assíncronos.
  • single_utterance - (opcional, predefinição: false) indica se este pedido deve terminar automaticamente quando a fala deixar de ser detetada. Se estiver definido, o Speech-to-Text deteta pausas, silêncio ou áudio sem voz para determinar quando terminar o reconhecimento. Se não for definido, a stream continua a ouvir e a processar áudio até ser fechada diretamente ou o limite de duração da stream ser excedido. A definição single_utterance para true é útil para processar comandos de voz.
  • interim_results - (opcional, predefinição: false) indica que este pedido de stream deve devolver resultados temporários que podem ser refinados posteriormente (após o processamento de mais áudio). Os resultados provisórios são indicados nas respostas através da definição de is_final como false.

Respostas de streaming

Os resultados do reconhecimento de voz em streaming são devolvidos numa série de respostas do tipo StreamingRecognitionResponse. Uma resposta deste tipo é composta pelos seguintes campos:

  • speechEventType contém eventos do tipo SpeechEventType. O valor destes eventos indica quando se determinou que uma única expressão foi concluída. Os eventos de voz servem como marcadores na resposta da sua stream.
  • results contém a lista de resultados, que podem ser resultados provisórios ou finais, do tipo StreamingRecognitionResult. A lista results contém os seguintes subcampos:
    • alternatives contém uma lista de transcrições alternativas.
    • isFinal indica se os resultados obtidos nesta entrada da lista são provisórios ou finais. A Google pode devolver vários resultados ao longo de uma única stream, mas o resultado isFinal=true só é garantido após o fecho (fecho parcial) da stream de gravação.isFinal=true
    • stability indica a volatilidade dos resultados obtidos até agora, com 0.0 a indicar instabilidade completa, enquanto 1.0 indica estabilidade completa. Tenha em atenção que, ao contrário da confiança, que estima se uma transcrição está correta, a stability estima se o resultado parcial fornecido pode mudar. Se isFinal for definido como true, stability não é definido.