Podlove Publisher für WordPress (12): Transkriptionen

Ein großes Problem beim Podcasting ist, dass sie aus gesprochenem Wort bestehen: Das ist einerseits eine Barriere für Höreingeschränkte, andererseits werden die Inhalte dadurch nur sehr schlecht durchsuchbar. Zwar kannst du ausführliche Shownotes schreiben, Inhalte mit Zeitmarken identifizieren und was du willst. Am Ende ist vielleicht eine wichtige Information in einem Nebensatz oder ein Stichwort geht unter. Dafür sind Transkripte die Lösung, in diesem Artikel zeige ich dir, wie du mit Podlove und Auphonic Transkriptionen für deine Podcastepisoden erstellst und sie im Blog einbindest. Ich gehe davon aus, dass du die anderen Lektionen gelesen über den Publisher gelesen hast, und dass du ein gewisses Grundverständnis von den Podlove-Templates hast. Wir beginnen damit, dass wir alles für die Transkriptionen vorbereiten:

Transkriptionen aktivieren und die richtigen Assets

Der erste Schritt sollte sein, dass Du Podlove überhaupt in die Lage versetzt, Transkripte zu verarbeiten. Deswegen schaltest du unter „Module“ die Transkripte ein.

Außerdem solltest Du in den Podcast-Assets „WebVTT“ anlegen. Ich rate dazu, dieses Asset nicht automatisch für alle Episoden zu aktivieren, denn damit könntest Du Teile des Publikums verunsichern. Dazu später mehr. In der Übersicht über alle Assets hast du dann noch die Möglichkeit, festzulegen woher Podlove diese Datei nehmen soll, um sie weiter zu verarbeiten.

Eigentlich ist es fast egal, ob du hier „manueller Upload“ oder „Asset: WebVTT“ auswählst. Ich rate nur dazu, dass du die Datei nicht automatisiert auf den Server schieben lässt. Die Erkennung der Transkriptionsdienste ist nicht so gut, dass die VTT-Datei sofort unverarbeitet zum Einsatz kommen sollte: Häufig werden einzelne Wörter oder ganze Passagen nicht korrekt erkannt und das kann dann zu Verständnisproblemen führen.

Transkripte und Auphonic

Ich finde, der einfachste Weg zu einer Transkription ist, den ganzen Spaß mit in de Auphonic-Automationskette zu integrieren. Dazu legst du dir einen Account bei einem der von Auphonic unterstützten Dienste an, ich nutze Speechmatics. Das ist zwar vergleichsweise teuer, bietet nach einer Untersuchung der Auphonic-Macher*innen aber im Enhanced-Modus die beste Erkennung. Kostenfrei geht das mit wit.ai, das gehört aber zu Facebook zum Meta-Konzern.

Bei Auphonic kannst du dann unter „Services“ die beiden Accounts miteinander verknüpfen:

Jetzt kannst du in deinen Auphonic-Produktionen auch den Punkt „Transcripts“ auswählen. Ich habe das gleich in meinen Presets festgelegt:

Sobald du einen Dienst bei „Speech Recognition“ auswählst, werde oben in den Outputfiles mehrere Dateitypen hinterlegt, die aus deinem Dienst herausfallen. Für unsere Zwecke ist ausschließlich VTT relevant.

Wenn Du jetzt eine Produktion mit Auphonic startest, wird also automatisch unter anderem so eine VTT-Datei erzeugt. Ich lasse mir die, wie gesagt, nicht von Auphonic auf meinen Server legen, sondern lediglich in die Dropbox.

Gamechanger Whisper

Anfang November hat Auphonic nun angekündigt, die kostenlose Open Source-Spracherkennung Whisper in den eigenen Dienst zu integrieren. Das passiert zunächst als Beta und nur für zahlende Kunden, schreiben die Auphonic-Leute in ihrem Blog. Wenn klar sei, welche Serverlast Whisper erzeuge und wie gut das Tool angenommen wird, könnte es auch für Freemium-Nutzende angeboten werden. Meine ersten Tests damit waren ziemlich überzeugend: Whisper kommt mit einiger Leichtigkeit an die Präzision von Speechmatics heran.

Allerdings hat Whisper derzeit noch ab und zu etwas Schluckauf: In einem ersten Test fügte es einfach an mehreren Stellen sinnlose Sätze ein. In mehreren anderen Testszenarien, bekam Whisper ganze Sätze nicht mit und die tauchten dann auch nicht in der Transkription auf.

Abgesehen davon ist Whisper halt kostenlos und das macht es in meinen Augen zum Gamechanger: Ich brauche keinen extra Account, ich muss mich nicht um irgendwelche Freivolumina bei meinem Anbieter kümmern, ich muss noch nicht einmal einen Service bei Auphonic anlegen: Whisper steht sofort im Abschnitt „Speech Recognition“ zur Verfügung. Und, ich kann das nicht oft genug betonen, Whisper zu nutzen schlägt derzeit nicht auf die Produktionskosten durch, weil es nun Teil von Auphonic ist. Spätestens mit Abschluss der Beta-Phase bei Auphonic werde ich also meinen Account bei Speechmatics schließen.

Dieser kurze Einschub dient einfach nur der Einordnung, die Einbindung in Podlove und die meisten anderen Informationen aus diesem Artikel gelten unverändert.

Fallstricke

Wenn du deinen Podcast allein produzierst, ist alles soweit problemlos. Produzierst du allerdings mit mehreren Menschen, lauert hier die erste Falle: Du solltest die Audiodateien aller Teilnehmenden eindeutig benennen:

Ohne Transkription könntest du die „Track Identifier“-Felder auch leer lassen. Machst du das mit Transkripten auch, fehlt am Ende die Zuordnung der gesprochenen Worte zu einer Person und das macht es später im Blog komplizierter. Allerdings tauchen die Track Identifier-Felder auch ausschließlich bei Multitrack-Aufnahmen auf.

Transkripte nachbearbeiten

Was da aus der Speech Recognition herausfällt, ist mal besser und mal schlechter, so ehrlich wollen wir sein. Meine Eröffnungsphrase in Jörn Schaars feinem Podcast „Moin und herzlich willkommen zu Jörn Schaars feinem Podcast, ich bin Jörn Schaar und ihr seid es nicht“ wird in der Regel mit „Und herzlich willkommen zu Jörn Chars Fan sein Podcast ich bin ja ein Star und ihr seid es nicht“ verschriftlicht. Hier möchte ich also nacharbeiten, damit zumindest der Titel korrekt ist.

Eine VTT-Datei kannst du ganz einfach mit einem Texteditor, zum Beispiel Notepad von Windows, bearbeiten. Die wichtigste Aufgabe ist nun, falsch erkannte Wörter, mangelhafte Interpunktion oder dergleichen zu finden und zu korrigieren.

Du siehst hier de Screenshot einer im Windows Editor geöffneten VTT-Datei. Die Zeiten geben an, zwischen welchen Zeitindices der Text im Podlove Webplayer hervorgehoben werden soll. Farblich markiert habe ich hier Fehler der Texterkennung: Gelb umrandet das gesprochene Wort „OZG-Dienstleistung“, dass Speechmatics selbst im Enhanced Mode nicht korrekt erkennt. „Steuer Abteilung“ ist zwar richtig erkannt, aber falsch geschrieben, das korrigiere ich zu „Steuerabteilung“. Und grün umrandet ist ein Zitat, bei dem Anführungszeichen fehlen.

Das sind jetzt einige Kleinigkeiten, oft genug werden ganze Satzteile so falsch erkannt, dass ich die Passage in der fertigen Episode noch einmal nachhören muss.

Transkript zur Episode hinzufügen

Wenn Du das Modul „Transkripte“ aktiviert hast, erscheint in deiner Episodenansicht ein neues Feld:

Das sieht jetzt hier ein wenig merkwürdig aus, weil ich den Screenshot für’s Blog ein wenig zugeschnitten habe. Hier habe ich nun wieder zwei Möglichkeiten: Ich kann entweder den linken, hier grün ausgefüllten Button „Import Transcript“ nutzen und die Datei lokal im Blog hochzuladen. Das reicht aus, um den Webplayer mit dem Transkript zu versorgen. Ich kann aber auch über „Get from Asset“ auf die Version zugreifen, die ich per FTP auf den Server geladen habe. Dafür muss der Upload abgeschlossen und das Asset verifiziert sein. Das Ergebnis ist das Gleiche: Ich habe ein fertiges Transkript importiert:

Wenn ich nun jemanden zu Gast habe, muss ich noch einen Arbeitsschritt mehr machen. In diesem Fall wird zusätzlich zum Text und den Zeitindices auch noch notiert, wer in dem Moment gerade gesprochen hat. Im nächsten Arbeitsschritt kann ich nun mit dem Reiter „Voices“ die jeweilige Passage einer Person zuordnen.

Obacht: Diese Person muss als Kontributor*in angelegt und der aktuellen Episode zugeordnet sein.

Links stehen die Namen, die ich für die Spuren der Sprecher in Auphonic vergeben habe. Im Dropdownfeld rechts daneben kann ich nun den bzw. die Kontributor*in auswählen und dieser Stimme zuordnen.

Transkript elegant im Blog anzeigen

Der wie ich finde eleganteste Weg, Transkripte anzuzeigen, ist vermutlich der Podlove Webplayer 5. Der hebt die gesprochene Passage visuell hervor, während sie gesprochen wird. Sobald du Dein Transkript ins Blog importiert und ggf die Stimmen zugeordnet hast, steht im Webplayer 5 ein Tab zur Verfügung, mit dem das Publikum die Untertitel aufrufen kann.

Vielleicht möchtest du aber das Transkript auch im Blog anzeigen. Dazu gibt es ein fertiges Template in der Podlove-Doku und es sieht so aus:

<style type="text/css">
.ts-speaker { font-weight: bold; }
.ts-items { margin-left: 20px; }
.ts-time { font-size: small; color: #999; }
</style>
    <p>
        {% for group in episode.transcript %}
            <div class="ts-group">
                {% if group.contributor %}
                    <div class="ts-speaker">{{ group.contributor.name }}</div>
                {% endif %}
                <div class="ts-items">
                    {% for line in group.items %}
                        <span class="ts-time">{{ line.start }}&ndash;{{ line.end }}</span>
                        <div class="ts-content">{{ line.content }}</div>
                    {% endfor %}
                </div>
            </div>
        {% endfor %}
    </p>

Damit wird die Transkription Deiner Episode nach Sprecher*innen gruppiert als großer Textblock angezeigt. Abhängig von der Länge der Episode kann das eine ganze Menge Text sein, rechne etwa 1.000-1.100 Zeichen pro Minute. Weil das sehr schnell sehr unübersichtlich wird und auch nicht besonders ansehnlich ist, nutze ich gern das <details>-Tag und damit sieht der Template-Code so aus:

<style type="text/css">
.ts-speaker { font-weight: bold; }
.ts-items { margin-left: 20px; }
.ts-time { font-size: small; color: #999; }
</style>
<details>
    <summary id="text">
        <strong>Transkription der Episode anzeigen</strong>
    </summary>
    <p>
        {% for group in episode.transcript %}
            <div class="ts-group">
                {% if group.contributor %}
                    <div class="ts-speaker">{{ group.contributor.name }}</div>
                {% endif %}
                <div class="ts-items">
                    {% for line in group.items %}
                        <span class="ts-time">{{ line.start }}&ndash;{{ line.end }}</span>
                        <div class="ts-content">{{ line.content }}</div>
                    {% endfor %}
                </div>
            </div>
        {% endfor %}
    </p>
</details>

Ich habe die Änderungen hier mal fett markiert. Das Ergebnis ist nun, dass in meinem Blog sowas hier angezeigt wird:

Wenn jemand diesen Text anklickt, klappt das Transkript-Template auf und ist lesbar und mit der Suchfunktion des Browsers nach Stichworten durchsuchbar. Den Code oben habe ich als eigenes Template namens „transkription“ angelegt, den ich bei Bedarf aufrufe. Denn nicht alle Episoden haben eine Transkription, ich habe erst mit Episode JSFP368 mit den Textfassungen angefangen und versehe ältere Episoden nach und nach mit Transkriptionen. Damit nun in einer alten Episode nicht der Hinweis auf eine Transkription angezeigt wird, die es des facto nicht gibt, muss ich abfragen, ob eine Textfassung vorliegt. Das sieht in Template-Code so aus:

{% if episode.file("vtt") %}
   {% include 'transkription' %}
{% endif %}

Wenn also das Transkriptions-Asset „VTT“ für diese Episode aktiviert ist, wird das Template „transkription“ eingebunden.

Obacht: Hier wird nicht überprüft, ob das Asset auch verifiziert ist, also ob auch wirklich eine VTT-Datei auf dem Server gefunden wurde! Im Zweifel wird also für eine Episode ein Transkript vorgeschlagen, dass es de facto gar nicht gibt. Darauf musst du beim Publizieren einer Episode selbst achten.

Podcast-Apps mitdenken

Aber was passiert nun in den Podcast-Apps? Die gehen komplett unterschiedlich damit um und nach meiner Beobachtung verstehen so derartig viele Podcast-Apps das <details>-Tag nicht, dass ich die Nutzung innerhalb des Feeds für wenig sinnvoll halte. Zumal bei langen Episoden der Text den Feed unnötig aufbläht. Also nutzen wir einen weiteren Filter:

{% if not is_feed() %}
    {% if episode.file("vtt") %}
        {% include 'trankription' %}
    {% endif %}
{% endif %}

Diese if-Abfrage sorgt dafür, dass nur im Blog die Transkription wie oben beschrieben angezeigt wird. Damit nun die staunende Weltöffentlichkeit an den angeschlossenen Podcast-Apps zumindest über die Möglichkeit informiert wird, ein Transkript lesen zu können, modifizieren wir die Abfrage erneut:

{% if not is_feed() %}
    {% if episode.file("vtt") %}
        {% include 'trankription' %}
    {% else %}
        {% if episode.file("vtt") %}
             <p><small>Diese Episode gibt es auch in Schriftform. Du kannst <a href="
             {{episode.URL}}#text">auf der Seite der Episode</a> lesen.</small></p>
        {% endif %}
    {% endif %}
{% endif %}

Im Template für die Einblendung des Transkripts habe ich das Tag <summary id="text"> verwendet. Dadurch, dass ich den Link zum Transkript <a href="{{episode.URL}}"> mit dem HTML-Anker #text versehe, springt die Anzeige direkt zum Ausklapp-Link und niemand muss ewig durch das Blog scrollen.

Fazit:

Transkriptionen bedeuten initial im Blog einigen Mehraufwand und sie verändern den Workflow bei der Veröffentlichung einer Episode ganz enorm. Mein Zeitaufwand von der Aufnahme bis zur Veröffentlichung hat sich sehr vergrößert, weil ich das Ergebnis der Spracherkennung so gründlich nacharbeite. Ich bin aber der Meinung, dass sich die Mehrarbeit lohnt. Denn jetzt können jetzt auch Menschen meinen Podcast konsumieren, die nicht so gut oder gar nicht hören können. Barrierefrei ist mein Podcast damit sicher noch nicht, aber ich habe zumindest eine Barriere abgebaut.

Mit Whisper kommt nun eine kostenlose Alternative, die man mit etwas IT-Kenntnis offenbar auch lokal auf dem eigenen Rechner laufen lassen könnte. Wer ohnehin einen bezahlten Account bei Auphonic hat, zahlt nichts extra für die Nutzung von Whisper. Und seien wir ehrlich: Diese Software erkennt so viel so zuverlässig, dass man sie auch ohne Nachkontrolle bedenkenlos für längere Formate einsetzen kann.

Deswegen meine klare Empfehlung: Mach das doch für deinen Podcast auch!

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert