Sous-titrer des extraits multimédias en temps réel à l'aide de Dataflow, Pub/Sub et l'API Speech-to-Text

;

Découvrez comment créer des sous-titres WebVTT en temps réel pour des extraits audio ou vidéo à l'aide de l'API Speech-to-Text dans un pipeline Dataflow.

Ce tutoriel explique comment utiliser le modèle Flex Dataflow fourni par la mise en oeuvre de référence Utiliser Dataflow pour effectuer un sous-titrage WebVTT automatique à l'aide de l'API Speech-to-Text en streaming pour traiter plusieurs défis courants liés à la création de sous-titres WebVTT en temps réel. Ces défis sont les suivants :

  • Minimiser la latence lors de la création des sous-titres.
  • Créer des décalages temporels de début et de fin pour chaque sous-titre.
  • Spécifier la durée de chaque sous-titre.

Ce tutoriel est destiné aux développeurs et suppose que vous possédez des connaissances de base sur les pipelines Dataflow.

Architecture

Ce tutoriel est basé sur la mise en œuvre de référence Utiliser Dataflow pour effectuer un sous-titrage WebVTT automatique à l'aide de l'API Speech-to-Text en streaming sur GitHub. La mise en œuvre de référence fonctionne comme suit :

  1. Un extrait multimédia est importé dans un bucket Cloud Storage. L'ajout de l'objet au bucket entraîne l'envoi d'un message à un sujet Pub/Sub.
  2. Le pipeline Dataflow dispose d'un abonnement à ce sujet Pub/Sub. L'arrivée du message déclenche la récupération et le traitement de l'extrait multimédia.
  3. Le pipeline traite l'extrait multimédia. Il appelle d'abord l'API Speech-to-Text pour obtenir une transcription textuelle du contenu audio à partir du fichier multimédia, puis crée des sous-titres à partir de cette transcription.
  4. Le pipeline génère les sous-titres au format WebVTT et les publie dans un sujet Pub/Sub.

Cette mise en œuvre de référence fonctionne mieux avec des fichiers multimédias de taille réduite. Nous vous recommandons de l'utiliser avec des fichiers de 5 Mo ou moins.

Le schéma suivant illustre l'architecture de la mise en œuvre de référence :

Schéma illustrant l'architecture de la solution de transcription de contenus multimédias.

Décisions liées à la conception du traitement des données

Lorsque vous exécutez le pipeline Dataflow, vous utilisez un modèle flex hébergé publiquement qui appelle le code Java depuis la mise en œuvre de référence. Ce code construit les sous-titres à partir des résultats renvoyés par l'API Speech-to-Text. Les décisions de conception essentielles de ce code sont les suivantes :

  • Le code utilise la méthode de Reconnaissance en streaming de l'API Speech-to-Text pour traiter l'extrait. Cette méthode fournit des résultats intermédiaires en plus des résultats définitifs. Les résultats intermédiaires ont une qualité inférieure mais sont générés plus rapidement. Le code de la mise en œuvre de référence traite les résultats intermédiaires, ce qui réduit la latence entre la réception de l'extrait et la production des sous-titres.
  • Le traitement des transcriptions renvoyées dans les résultats intermédiaires dépend d'une barre de stabilité. La stabilité des résultats intermédiaires peut aller de 0,0, ce qui indique une instabilité totale, à 1,0, ce qui indique une stabilité totale. La barre de stabilité est définie sur 0,8 par défaut, mais vous pouvez modifier cette valeur à l'aide du paramètre --stabilityThreshold lorsque vous exécutez le pipeline.
  • Comme les résultats intermédiaires ne sont pas entièrement traités, les transcriptions peuvent contenir des phrases à stabilité faible et des phrases qui se chevauchent. Pour obtenir un aperçu, consultez l'exemple de StreamingRecognizeResponse.

    Pour gérer cela, le code divise les résultats en sous-titres en fonction du nombre de mots, que vous spécifiez avec le paramètre --wordCount. Il utilise ensuite l'API Timer Apache Beam pour comparer chaque sous-titre avec le précédent et ignorer les mots déjà affichés. Consultez la section @ProcessElement pour examiner le code qui met en œuvre cette logique.

    Des valeurs --wordCount inférieures améliorent les performances du pipeline en permettant au code d'évaluer et de comparer des sous-titres plus petits. --wordCount est défini par défaut sur 10.

  • Les décalages de début et de fin pour chaque sous-titre sont créés à l'aide du champ result_end_time de l'objet StreamingRecognitionResult. À compter de 00:00, le code assure le suivi de la valeur result_end_time de chaque sous-titre traité et l'utilise comme heure de début pour le sous-titre suivant.

Objectifs

  • Créer un bucket Cloud Storage, un sujet Pub/Sub et une notification Pub/Sub pour Cloud Storage pour les associer. Ensemble, ces ressources créent le mécanisme permettant d'alimenter le pipeline en fichiers multimédias pour le traitement.
  • Créer et exécuter un pipeline Dataflow qui consomme des extraits multimédias, les traite en transcriptions textuelles avec l'API Speech-to-Text, puis crée des sous-titres au format WebVTT à partir de ces transcriptions
  • Publier les sous-titres WebVTT dans un sujet Pub/Sub.

Coûts

Ce tutoriel utilise des composants facturables de Google Cloud, dont :

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

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

  2. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder à la page de sélection du projet

  3. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  4. Activer les API Cloud Storage, Dataflow, Pub/Sub, and the Speech-to-Text API.

    Activer les API

Définir des variables d'environnement

Définissez des variables d'environnement pour le projet et la région que vous utilisez pour ce tutoriel.

  1. Activer Cloud Shell
  2. Dans Cloud Shell, exécutez les commandes ci-dessous afin de définir des variables d'environnement pour le projet et la région. Remplacez myProject par l'ID du projet que vous utilisez pour suivre ce tutoriel :

    export PROJECT=myProject
    export REGION=us-central1
    

Créer un bucket Cloud Storage

Créez un bucket afin de recevoir les fichiers multimédias pour le sous-titrage.

Dans Cloud Shell, exécutez la commande suivante pour créer un bucket :

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

Créer les sujets et les abonnements Pub/Sub

Créez deux sujets Pub/Sub et deux abonnements Pub/Sub. La première paire sujet/abonnement permet d'indiquer au pipeline Dataflow que les fichiers multimédias sont prêts à être traités. La seconde paire sujet/abonnement permet de générer les fichiers de sous-titres depuis le pipeline Dataflow afin qu'ils soient disponibles pour la réintégration avec les fichiers multimédias.

  1. Dans Cloud Shell, exécutez les commandes suivantes pour créer les sujets et les abonnements :

    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
    

Créer la notification de Cloud Storage vers Pub/Sub

Créez une notification qui envoie un message au sujet media-clips lorsque vous importez un fichier multimédia dans le bucket Cloud Storage. Cela déclenche le pipeline Dataflow pour traiter le fichier multimédia.

Obtenir l'adresse e-mail du compte de service Cloud Storage

  1. Ouvrir le navigateur Cloud Storage

  2. Cliquez sur Paramètres.

  3. Copiez l'adresse e-mail du compte de service depuis la section Compte de service Cloud Storage dans l'onglet Accès au projet.

Mettre à jour les autorisations du compte de service Cloud Storage

  1. Ouvrir la page "Sujets Pub/Sub"
  2. Pour le sujet media-clips, cliquez sur Plus, puis sur Afficher les autorisations.
  3. Cliquez sur Ajouter un membre. Dans le volet qui s'affiche :
    1. Dans le champ Nouveaux membres, collez l'adresse e-mail du compte de service Cloud Storage.
    2. Pour le champ Sélectionner un rôle, choisissez Pub/Sub, puis Éditeur Pub/Sub.
    3. Cliquez sur Enregistrer.

Créer la notification

  1. Activer Cloud Shell
  2. Dans Cloud Shell, exécutez la commande suivante pour créer la notification Pub/Sub :

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

Démarrer le pipeline Dataflow

  1. Dans Cloud Shell, exécutez la commande suivante pour exécuter le 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. Ouvrir la page Tâches Dataflow

  3. Attendez que le pipeline créer-sous-titres affiche l'état En cours d'exécution. Cette opération peut prendre quelques minutes.

Tester le pipeline

Copiez un fichier audio dans le bucket Cloud Storage pour déclencher le pipeline de traitement, puis consultez les messages de l'abonnement captions pour afficher les sous-titres de sortie.

  1. Activer Cloud Shell
  2. Dans Cloud Shell, exécutez la commande suivante pour copier le fichier audio :

    gsutil cp gs://dataflow-stt-audio-clips/wav_mono_kellogs.wav gs://$MEDIA_CLIPS_BUCKET
    
  3. Ouvrir la page "Abonnements Pub/Sub"

  4. Cliquez sur sous-titres dans la liste des abonnements.

  5. Cliquez sur Afficher les messages.

  6. Dans le volet Messages, cliquez sur Extraire.

  7. Cliquez sur Développer pour afficher les contenus des messages. Un résultat semblable aux lignes suivantes doit s'afficher :

    Messages contenant des transcriptions issues d'un fichier audio

Nettoyer

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, vous pouvez soit supprimer le projet contenant les ressources, soit le conserver, mais supprimer uniquement ces ressources.

Dans les deux cas, vous devez supprimer ces ressources afin d'éviter qu'elles ne vous soient facturées par la suite. Dans les sections suivantes, nous allons voir comment supprimer ces ressources.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les composants

Si vous ne souhaitez pas supprimer le projet, reportez-vous aux sections suivantes pour supprimer les composants facturables de ce tutoriel.

Arrêter la tâche Dataflow

  1. Ouvrir la page Tâches Dataflow
  2. Dans la liste des tâches, cliquez sur créer-sous-titres.
  3. Sur la page des détails de la tâche, cliquez sur Arrêter.
  4. Sélectionnez Annuler.
  5. Cliquez sur Stop job (Arrêter la tâche).

Supprimer les buckets Cloud Storage

  1. Ouvrir le navigateur Cloud Storage
  2. Cochez les cases des buckets media-<myProject> et dataflow-staging-us-central1-<projectNumber>.
  3. Cliquez sur Supprimer.
  4. Dans la fenêtre qui s'affiche en superposition, saisissez DELETE, puis cliquez sur Confirmer.

Supprimer les sujets et les abonnements Pub/Sub

  1. Ouvrir la page "Abonnements Pub/Sub"
  2. Cochez les cases correspondant aux abonnements extraits-multimédias et sous-titres.
  3. Cliquez sur Supprimer.
  4. Dans la fenêtre qui apparaît en superposition, cliquez sur Supprimer pour confirmer que vous souhaitez supprimer l'abonnement et son contenu.
  5. Cliquez sur Sujets.
  6. Cochez les cases des sujets extraits-multimédias et sous-titres.
  7. Cliquez sur Supprimer.
  8. Dans la fenêtre qui apparaît en superposition, saisissez delete, puis cliquez sur Supprimer.

Étape suivante