Como criar legendas de clipes de mídia em tempo real usando Dataflow, Pub/Sub e a API Speech-to-Text

;

Saiba como criar legendas WebVTT em tempo real para clipes de áudio ou vídeo usando a API Speech-to-Text em um pipeline do Dataflow.

Neste tutorial, mostramos como usar o modelo flexível do Dataflow fornecido pela implementação de referência da Legenda automática WebVTT da API Streaming Speech-to-Text usando o Dataflow para enfrentar diversos desafios comuns para criar legendas WebVTT em tempo real. Esses desafios são:

  • Minimizar a latência ao criar a legenda.
  • Criar ajustes de tempo de início e término para cada legenda.
  • Especificar o tempo para criar cada legenda.

Este tutorial é destinado a desenvolvedores e pressupõe um conhecimento básico dos pipelines do Dataflow.

Arquitetura

Este tutorial é baseado na Legenda Automática WebVTT da API Streaming Speech-to-Text usando a implementação de referência do Dataflow no GitHub. A implementação de referência funciona da seguinte forma:

  1. É feito o upload de um clipe de mídia para um bucket do Cloud Storage. A adição do objeto ao bucket faz com que uma mensagem seja enviada para um tópico do Pub/Sub.
  2. O pipeline do Dataflow tem uma assinatura para esse tópico do Pub/Sub. A chegada da mensagem o aciona para recuperar e processar o clipe de mídia.
  3. O pipeline processa o clipe de mídia. Primeiro, ele chama a API Speech-to-Text para receber uma transcrição de texto do arquivo de mídia, e, em seguida, cria legendas a partir dessa transcrição.
  4. O pipeline gera as legendas no formato WebVTT e as publica em um tópico do Pub/Sub.

Essa implementação de referência funciona melhor com arquivos de mídia menores. Recomendamos usá-lo com arquivos de até 5 MB.

O diagrama a seguir ilustra a arquitetura da implementação de referência:

Diagrama mostrando a arquitetura da solução de transcrição de mídia.

Decisões de design de processamento de dados

Ao executar o pipeline do Dataflow, você usa um modelo flexível hospedado publicamente que chama o código Java da implementação de referência. Esse código cria as legendas a partir dos resultados retornados pela API Speech-to-Text. As principais decisões de projeto nesse código são as seguintes:

  • O código usa o método de reconhecimento de streaming da API Speech-to-Text para processar o clipe. Esse método fornece resultados provisórios, além dos resultados finalizados, com resultados provisórios de qualidade inferior, mas chegando mais rápido. O código na implementação de referência processa os resultados provisórios, o que reduz a latência entre o recebimento do clipe e a produção da legenda.
  • As transcrições retornadas nos resultados provisórias precisam atender a uma barra de estabilidade para serem processadas. A estabilidade dos resultados provisórios pode variar de 0,0, o que indica instabilidade completa, a 1.0, que indica estabilidade completa. A barra de estabilidade é definida como 0,8 por padrão, mas é possível alterá-la usando o parâmetro --stabilityThreshold ao executar o pipeline.
  • Como os resultados provisórios não são totalmente processados, as transcrições podem conter frases de baixa estabilidade e sobrepostas. Para ter uma ideia de como isso é, consulte o exemplo para StreamingRecognizeResponse.

    Para lidar com isso, o código divide os resultados em legendas com base na contagem de palavras, que você especifica com o parâmetro --wordCount. Em seguida, usa a API Timer do Apache Beam para comparar cada legenda com a anterior e pular as palavras já exibidas. Consulte @ProcessElement para revisar o código que implementa essa lógica.

    Os valores de --wordCount mais baixos melhoram o desempenho do pipeline, permitindo que o código avalie e compare legendas menores. --wordCount é definido como 10 por padrão.

  • Os ajustes de horário de início e término para cada legenda são criados usando o campo result_end_time do objeto StreamingRecognitionResult . Começando a partir de 00:00, o código acompanha o result_end_time de cada legenda processada e o usa como o horário de início para a legenda seguinte.

Objetivos

  • Crie um bucket do Cloud Storage, um tópico do Pub/Sub e uma notificação do Pub/Sub para o Cloud Storage para vinculá-los. Esses recursos juntos criam o mecanismo para alimentar os arquivos de mídia para o pipeline processar.
  • Crie e execute um pipeline do Dataflow que consuma clipes de mídia, processe-os em transcrições de texto com a API Speech-to-Text e crie legendas no formato WebVTT a partir dessas transcrições.
  • Publique as legendas WebVTT em um tópico do Pub/Sub.

Custos

Neste tutorial, há componentes faturáveis do Google Cloud, entre eles:

  • Cloud Storage
  • Dataflow
  • Pub/Sub
  • API Speech-to-Text

Use a calculadora de preços para gerar uma estimativa de custos baseada na projeção de uso. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  4. Ative as APIs Cloud Storage, Dataflow, Pub/Sub, and the Speech-to-Text API.

    Ative as APIs

Definir variáveis de ambiente

Defina variáveis de ambiente para o projeto e a região que você está usando neste tutorial.

  1. Ativar o Cloud Shell
  2. No Cloud Shell, execute os comandos abaixo para definir variáveis de ambiente para o projeto e a região. Substitua myProject pelo ID do projeto que você está usando para concluir este tutorial.

    export PROJECT=myProject
    export REGION=us-central1
    

Criar um bucket do Cloud Storage

Crie um bucket para receber arquivos de mídia para legenda.

No Cloud Shell, execute o seguinte comando para criar um bucket:

export MEDIA_CLIPS_BUCKET=media_$PROJECT
gsutil mb gs://$MEDIA_CLIPS_BUCKET

Criar tópicos e assinaturas do Pub/Sub

Crie dois tópicos e duas assinaturas do Pub/Sub. O primeiro par de tópico/assinatura é usado para notificar o pipeline do Dataflow de que os arquivos de mídia estão disponíveis para processamento. O segundo par de tópico/assinatura é usado para gerar os arquivos de legenda do pipeline do Dataflow para que fiquem disponíveis para reintegração com os arquivos de mídia.

  1. No Cloud Shell, execute os seguintes comandos para criar os tópicos e as assinaturas:

    export MEDIA_TOPIC="media-clips"
    export MEDIA_SUBSCRIPTION="media-clips"
    export CAPTION_TOPIC="captions"
    export CAPTION_SUBSCRIPTION="captions"
    gcloud pubsub topics create $MEDIA_TOPIC
    gcloud pubsub subscriptions create $MEDIA_SUBSCRIPTION --topic=$MEDIA_TOPIC
    gcloud pubsub topics create $CAPTION_TOPIC
    gcloud pubsub subscriptions create $CAPTION_SUBSCRIPTION --topic=$CAPTION_TOPIC
    

Crie a notificação do Cloud Storage para o Pub/Sub

Crie uma notificação que envie uma mensagem para o tópico media-clips quando você fizer upload de um arquivo de mídia para o bucket do Cloud Storage. Isso aciona o pipeline do Dataflow para processar o arquivo de mídia.

Acessar o e-mail da conta de serviço do Cloud Storage

  1. Abra o navegador do Cloud Storage

  2. Clique em Configurações.

  3. Copie o endereço de e-mail da conta de serviço da seção Conta de serviço do Cloud Storage na guia Acesso ao projeto.

Atualizar as permissões da conta de serviço do Cloud Storage

  1. Abrir a página de tópicos do Pub/Sub
  2. Para o tópico media-clips, clique em Mais e, em seguida, em Visualizar permissões.
  3. clique em Adicionar membro; No painel exibido:
    1. Em Novos membros, cole o endereço de e-mail da conta de serviço do Cloud Storage.
    2. Em Selecionar um papel, escolha Pub/Sub e, em seguida, selecione Editor do Pub/Sub.
    3. Clique em Save.

Criar a notificação

  1. Ativar o Cloud Shell
  2. No Cloud Shell, execute o seguinte comando para criar a notificação do Pub/Sub:

    gsutil notification create -t media-clips -f json gs://media_$PROJECT
    

Iniciar o pipeline do Dataflow

  1. No Cloud Shell, execute o seguinte comando para executar o pipeline:

    gcloud beta dataflow flex-template run "create-captions" \
    --project=$PROJECT \
    --region=us-central1 \
    --template-file-gcs-location=gs://dataflow-stt-audio-clips/dynamic_template_stt_analytics.json \
    --parameters=^~^streaming=true~enableStreamingEngine=true~numWorkers=1~maxNumWorkers=3~runner=DataflowRunner~autoscalingAlgorithm=THROUGHPUT_BASED~workerMachineType=n1-standard-4~outputTopic=projects/$PROJECT/topics/$CAPTION_TOPIC~inputNotificationSubscription=projects/$PROJECT/subscriptions/$MEDIA_SUBSCRIPTION~wordCount=10
    
  2. Abrir a página "Jobs do Dataflow"

  3. Aguarde até que o pipeline create-captions mostre o status Em execução. Talvez isso leve alguns minutos.

Testar o pipeline

Copie um arquivo de áudio para o bucket do Cloud Storage para acionar o pipeline para processá-lo e verifique as mensagens na assinatura do captions para ver as legendas de saída.

  1. Ativar o Cloud Shell
  2. No Cloud Shell, execute o seguinte comando para copiar o arquivo de áudio:

    gsutil cp gs://dataflow-stt-audio-clips/wav_mono_kellogs.wav gs://$MEDIA_CLIPS_BUCKET
    
  3. Abrir a página de assinaturas do Pub/Sub

  4. Clique em legendas na lista de assinaturas.

  5. Clique em Ver mensagens.

  6. No painel Mensagens, clique em Enviar.

  7. Clique em Expandir em qualquer mensagem para ver o conteúdo. Os resultados serão semelhantes aos exibidos abaixo:

    Mensagens que contêm transcrições de um arquivo de áudio

Limpeza

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto que contém os recursos ou mantenha o projeto, mas exclua apenas esses recursos.

Seja como for, remova esses recursos para que não sejam faturados no futuro. Nas seções a seguir, você verá como excluir esses recursos.

Excluir o projeto

A maneira mais fácil de eliminar o faturamento é excluir o projeto criado para o tutorial.

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir os componentes

Se você não quiser excluir o projeto, use as seguintes seções para excluir os componentes faturáveis deste tutorial.

interrompa o job do Dataflow

  1. Abrir a página "Jobs do Dataflow"
  2. Na lista de jobs, clique em create-captions.
  3. Na página de detalhes do job, clique em Parar.
  4. Selecione Cancelar.
  5. Clique em Interromper job.

Excluir os buckets do Cloud Storage

  1. Abra o navegador do Cloud Storage
  2. Marque as caixas de seleção dos buckets media-<myProject> e dataflow-staging-us-central1-<projectNumber>.
  3. Clique em Excluir.
  4. Na janela de sobreposição exibida, digite DELETE e clique em Confirmar.

Excluir tópicos e assinaturas do Pub/Sub

  1. Abrir a página de assinaturas do Pub/Sub
  2. Marque as caixas de seleção das assinaturas de media-clips e de legendas.
  3. Clique em Excluir.
  4. Na janela de sobreposição que aparece, clique em Excluir e confirme a exclusão da assinatura e do conteúdo dela.
  5. Clique em Tópicos.
  6. Marque as caixas de seleção dos tópicos media-clips e legendas.
  7. Clique em Excluir.
  8. Na janela de sobreposição que aparece, digite delete e clique em Excluir.

A seguir