Medienclips in Echtzeit mithilfe von Dataflow, Pub/Sub und der Speech-to-Text API mit Untertiteln versehen

;

Im Folgenden wird gezeigt, wie Sie Echtzeit-WebVTT-Untertitel für Audio- oder Videoclips mithilfe der Speech-to-Text API in einer Dataflow-Pipeline erstellen.

In dieser Anleitung erfahren Sie, wie Sie mit der Dataflow-Flex-Vorlage der Referenzimplementierung von Automatic WebVTT Caption From Streaming Speech-to-Text API By Using Dataflow gängige Aufgabenstellungen beim Erstellen von WebVTT-Untertiteln in Echtzeit zu ausführen. Dazu gehören folgende Aufgaben:

  • Latenz beim Erstellen des Untertitels minimieren
  • Start- und Endzeit-Offsets für jeden Untertitel erstellen
  • Länge der Untertitel festlegen

Die Anleitung richtet sich an Entwickler und setzt voraus, dass Sie Grundkenntnisse zu Dataflow-Pipelines haben.

Architektur

Diese Anleitung basiert auf der Referenzimplementierung von „Automatic WebVTT Caption From Streaming Speech-to-Text API By Using Dataflow“ auf GitHub. Die Referenzimplementierung funktioniert so:

  1. Ein Medienclip wird in einen Cloud Storage-Bucket hochgeladen. Durch Hinzufügen des Objekts zum Bucket wird eine Nachricht an ein Pub/Sub-Thema gesendet.
  2. Die Dataflow-Pipeline hat ein Abo für dieses Pub/Sub-Thema. Der Eingang der Nachricht löst diese Pipeline aus, die dann den Medienclip abruft und verarbeitet.
  3. Die Pipeline verarbeitet den Medienclip. Sie ruft zuerst die Speech-to-Text API auf, um ein Texttranskript der Audiodaten aus der Mediendatei abzurufen, und erstellt dann Untertitel aus diesem Transkript.
  4. Die Pipeline gibt die Untertitel im WebVTT-Format aus und veröffentlicht sie in einem Pub/Sub-Thema.

Diese Referenzimplementierung eignet sich am besten für kleinere Mediendateien. Wir empfehlen deren Verwendung für Dateien, die maximal 5 MB groß sind.

Das folgende Diagramm veranschaulicht die Architektur der Referenzimplementierung:

Diagramm mit der Architektur der Medientranskriptionslösung

Design der Datenverarbeitung festlegen

Zum Ausführen der Dataflow-Pipeline verwenden Sie eine öffentlich gehostete Flex-Vorlage, die Java-Code aus der Referenzimplementierung aufruft. Dieser Code erstellt dann die Untertitel aus den von der Speech-to-Text API zurückgegebenen Ergebnissen. Im Folgenden sind die wichtigsten Festlegungen für den Code aufgeführt:

  • Der Code verwendet die Methode der Streamingerkennung der Speech-to-Text API zum Verarbeiten des Clips. Mit dieser Methode werden neben den endgültigen Ergebnissen auch Zwischenergebnisse bereitgestellt. Deren Qualität ist zwar niedriger, sie werden aber schneller generiert. Der Code in der Referenzimplementierung verarbeitet die Zwischenergebnisse, um so die Verzögerung zwischen dem Eingang des Clips und der Erstellung des Untertitels zu verringern.
  • Transkripte, die in den Zwischenergebnissen zurückgegeben werden, müssen einen bestimmten Stabilitätswert haben, damit sie verarbeitet werden können. Die Stabilität der Zwischenergebnisse kann zwischen 0,0 (komplett instabil) und 1,0 (komplett stabil) liegen. Der Stabilitätswert ist standardmäßig auf 0,8 eingestellt. Sie können diesen Wert aber über den Parameter --stabilityThreshold ändern, wenn Sie die Pipeline ausführen.
  • Da die Zwischenergebnisse nicht endgültig verarbeitet werden, können Transkripte auch Formulierungen mit niedriger Stabilität und mit Überlappung enthalten. Das Beispiel für StreamingRecognizeResponse veranschaulicht dies.

    Dazu werden die Ergebnisse vom Code anhand der Anzahl der Worte, die Sie mit dem Parameter --wordCount festlegen, in Untertitel aufgeteilt. Anschließend vergleicht die Apache Beam Timer API die Untertitel mit der vorherigen Version und überspringt die bereits angezeigten Wörter. Unter @ProcessElement erfahren Sie mehr über den Code, mit dem diese Logik implementiert wird.

    Niedrigere Werte für --wordCount verbessern die Leistung der Pipeline, da der Code dann kürzere Untertitel auswerten und vergleichen kann. --wordCount ist standardmäßig auf 10 festgelegt.

  • Die Start- und Endzeit-Offsets für jeden Untertitel werden mit dem Feld result_end_time des StreamingRecognitionResult-Objekts erstellt. Ab Zeitpunkt 00:00 erfasst der Code den Wert von result_end_time für jeden verarbeiteten Untertitel und verwendet ihn als Startzeit für den folgenden Untertitel.

Ziele

  • Sie erstellen einen Cloud Storage-Bucket und ein Pub/Sub-Thema sowie eine Pub/Sub-Benachrichtigung für Cloud Storage, mit der beides verknüpft wird. Diese Ressourcen bilden ein Verfahren, um Mediendateien zur Verarbeitung an die Pipeline zu übergeben.
  • Sie erstellen eine Dataflow-Pipeline, die Medienclips verarbeitet, und führen sie aus. Die Pipeline überträgt die Clips mithilfe der Speech-to-Text API in Texttranskripte und erstellt anschließend Untertitel im WebVTT-Format aus diesen Transkripten.
  • Sie veröffentlichen die WebVTT-Untertitel in einem Pub/Sub-Thema.

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

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

Sie können mithilfe des Preisrechners die Kosten für Ihre voraussichtliche Nutzung kalkulieren. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

  1. Melden Sie sich bei Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

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

    Aktivieren Sie die APIs

Umgebungsvariablen festlegen

Legen Sie Umgebungsvariablen für das Projekt und die Region fest, die Sie für diese Anleitung verwenden.

  1. Aktivieren Sie Cloud Shell.
  2. Führen Sie in Cloud Shell die unten aufgeführten Befehle aus, um Umgebungsvariablen für das Projekt und die Region festzulegen. Ersetzen Sie dabei myProject durch die ID des Projekts, das Sie für diese Anleitung verwenden.

    export PROJECT=myProject
    export REGION=us-central1
    

Cloud Storage-Bucket erstellen

Erstellen Sie einen Bucket für die Mediendateien, die Untertitel erhalten sollen.

Führen Sie in Cloud Shell den folgenden Befehl aus, um einen Bucket zu erstellen:

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

Pub/Sub-Themen und -Abos erstellen

Erstellen Sie zwei Pub/Sub-Themen und zwei Pub/Sub-Abos. Das erste Thema/Abo-Paar wird dazu verwendet, die Dataflow-Pipeline darüber zu informieren, dass Mediendateien zur Verarbeitung verfügbar sind. Mit dem zweiten Thema/Abo-Paar werden die Untertiteldateien aus der Dataflow-Pipeline ausgegeben, damit sie für die erneute Einbindung in die Mediendateien verfügbar sind.

  1. Führen Sie in Cloud Shell die folgenden Befehle aus, um die Themen und Abos zu erstellen:

    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
    

Benachrichtigung aus Cloud Storage an Pub/Sub erstellen

Erstellen Sie eine Benachrichtigung, die eine Nachricht an das Thema media-clips sendet, wenn Sie eine Mediendatei in den Cloud Storage-Bucket hochladen. Dadurch wird die Dataflow-Pipeline ausgelöst, um die Mediendatei zu verarbeiten.

E-Mail-Adresse des Cloud Storage-Dienstkontos abrufen

  1. Rufen Sie den Cloud Storage-Browser auf.

  2. Klicken Sie auf Einstellungen.

  3. Kopieren Sie die E-Mail-Adresse des Dienstkontos aus dem Abschnitt Cloud Storage-Dienstkonto in den Tab Projektzugriff.

Berechtigungen für das Cloud Storage-Dienstkonto aktualisieren

  1. Rufen Sie die Seite „Pub/Sub-Themen“ auf.
  2. Klicken Sie für das Thema media-clips auf Mehr und anschließend auf Berechtigungen aufrufen.
  3. Klicken Sie auf Mitglied hinzufügen. Im eingeblendeten Bereich wird Folgendes angezeigt:
    1. Fügen Sie unter Neue Mitglieder die E-Mail-Adresse des Cloud Storage-Dienstkontos hinzu.
    2. Wählen Sie unter Rolle auswählen die Option Pub/Sub und dann Pub/Sub-Publisher aus.
    3. Klicken Sie auf Speichern.

Benachrichtigung erstellen

  1. Aktivieren Sie Cloud Shell.
  2. Führen Sie in Cloud Shell den folgenden Befehl aus, um die Pub/Sub-Benachrichtigung zu erstellen:

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

Dataflow-Pipeline starten

  1. Führen Sie in Cloud Shell mit dem folgenden Befehl die Pipeline aus:

    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. Rufen Sie die Seite „Dataflow-Jobs“ auf.

  3. Warten Sie, bis für die Pipeline create-captions der Status Wird ausgeführt angezeigt wird. Dies kann einige Minuten dauern.

Pipeline testen

Kopieren Sie eine Audiodatei in den Cloud Storage-Bucket, um die Pipeline für die Verarbeitung auszulösen. Prüfen Sie dann die Nachrichten im Abo captions auf die ausgegebenen Untertitel.

  1. Aktivieren Sie Cloud Shell.
  2. Führen Sie in Cloud Shell den folgenden Befehl aus, um die Audiodatei zu kopieren:

    gsutil cp gs://dataflow-stt-audio-clips/wav_mono_kellogs.wav gs://$MEDIA_CLIPS_BUCKET
    
  3. Rufen Sie die Seite „Pub/Sub-Abos“ auf.

  4. Klicken Sie in der Aboliste auf Untertitel.

  5. Klicken Sie auf Nachrichten ansehen.

  6. Klicken Sie im Bereich Nachrichten auf Pull.

  7. Klicken Sie in der jeweiligen Nachricht auf Maximieren, um den Inhalt aufzurufen. Die Ergebnisse sollten in etwa so aussehen:

    Nachrichten mit Transkriptionen einer Audiodatei

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder behalten Sie das Projekt bei und löschen Sie nur diese Ressourcen.

In beiden Fällen sollten Sie diese Ressourcen entfernen, damit sie Ihnen nicht weiter in Rechnung gestellt werden. In den folgenden Abschnitten erfahren Sie, wie Sie diese Ressourcen löschen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das für die Anleitung erstellte Projekt löschen.

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Komponenten löschen

Wenn Sie das Projekt nicht löschen möchten, verwenden Sie die folgenden Abschnitte, um die abrechenbaren Komponenten dieser Anleitung zu löschen.

Dataflow-Job beenden

  1. Rufen Sie die Seite „Dataflow-Jobs“ auf.
  2. Klicken Sie in der Jobliste auf create-captions.
  3. Klicken Sie auf der Seite mit den Jobdetails auf Beenden.
  4. Wählen Sie Abbrechen aus.
  5. Klicken Sie auf Job beenden.

Cloud Storage-Buckets löschen

  1. Rufen Sie den Cloud Storage-Browser auf.
  2. Klicken Sie auf die Kästchen für die Buckets media-<myProject> und dataflow-staging-us-central1-<projectNumber>.
  3. Klicken Sie auf Löschen.
  4. Geben Sie im eingeblendeten Fenster DELETE ein und klicken Sie dann auf Bestätigen.

Pub/Sub-Themen und -Abos löschen

  1. Rufen Sie die Seite „Pub/Sub-Abos“ auf.
  2. Klicken Sie auf die Kästchen für die Abos media-clips und captions.
  3. Klicken Sie auf Löschen.
  4. Bestätigen Sie im eingeblendeten Fenster, dass Sie das Abo und dessen Inhalt löschen möchten. Klicken Sie dazu auf Löschen.
  5. Klicken Sie auf Themen.
  6. Klicken Sie auf die Kästchen für die Themen media-clips und captions.
  7. Klicken Sie auf Löschen.
  8. Geben Sie im eingeblendeten Fenster delete ein und klicken Sie dann auf Löschen.

Nächste Schritte