Dies ist Teil 2 unserer KI-Podcasts-Serie. Teil 1 behandelt die Nutzererfahrung und warum wir glauben, dass Audio-First-Lernen alles verändert. Dieser Beitrag ist der technische Deep-Dive.
NerdSip hat Tausende von Kursen. Jeder enthält drei bis acht Lektionen. Audio für jede einzelne Lektion vorab zu generieren wäre ruinös teuer und spektakulär verschwenderisch. Die große Mehrheit der Kurse wird nie angehört. Also haben wir eine andere Frage gestellt: Was wäre, wenn wir Audio genau in dem Moment generieren, in dem jemand es hören will?
Diese Frage hat die gesamte Architektur geprägt.
Der Voice-Stack auf einen Blick
Bevor wir ins Detail gehen, hier die gesamte Pipeline in einem Satz: Ein Nutzer tippt auf Play, der Server verarbeitet den Lektionstext vor, sendet ihn an Google Cloud TTS, empfängt eine MP3, speichert sie mit einem inhaltsbasierten Hash-Schlüssel und streamt sie zum mobilen Player. Jede nachfolgende Anfrage für denselben Inhalt überspringt die Generierung vollständig und liefert die gecachte Datei aus.
Im Konzept einfach. Die interessanten Teile stecken in den Details.
Google Cloud Text-to-Speech und Chirp3-HD
Wir haben mehrere TTS-Anbieter evaluiert, bevor wir uns für Google Cloud entschieden haben. Der ausschlaggebende Faktor war Chirp3-HD, Googles neuestes mehrsprachiges Stimmmodell. Es klingt bemerkenswert natürlich, kommt gut mit Fachvokabular zurecht und unterstützt die Sprachen, die wir brauchen.
Die Konfiguration ist unkompliziert:
- Englisch:
en-US-Chirp3-HD-Enceladus - Deutsch: eine dedizierte
de-DEChirp3-HD-Variante - Codierung: MP3 mit 24 kHz Abtastrate
- Auth: OAuth 2.0 mit Service-Account-Credentials
Jede Lektion wird einzeln synthetisiert, nicht der gesamte Kurs auf einmal. Das hält die Request-Payloads klein, die Generierungszeiten kurz und Fehler isoliert. Wenn Lektion vier fehlschlägt, sind Lektion eins bis drei trotzdem einwandfrei abspielbar.
Textvorverarbeitung: Von Markdown zu Sprache
Roher Lektionsinhalt ist nicht bereit für eine TTS-Engine. Er enthält Markdown-Formatierung, Emoji, Hyperlinks und strukturelle Elemente, die vorgelesen absurd klingen würden. Stell dir vor, mitten in einer Lektion über Quantenphysik „Sternchen Sternchen fetter Text Sternchen Sternchen“ zu hören.
Deshalb durchläuft jede Lektion eine Vorverarbeitungs-Pipeline, bevor sie Googles API erreicht:
- Markdown entfernen. Fett, kursiv, Überschriften, Aufzählungszeichen, alles wird entfernt. Der Text wird zu sauberem Fließtext.
- Emoji entfernen. Ein Unicode-Bereichs-Regex erfasst jede Emoji-Variante. Sie tragen nichts zum gesprochenen Audio bei.
- URLs bereinigen. Hyperlinks werden entweder vollständig entfernt oder durch ihren Anzeigetext ersetzt.
- Sprachstruktur hinzufügen. Das System umhüllt jede Lektion mit einem gesprochenen Template: einer Kurstitel-Einführung, Lektionsnummerierung („Lektion 2 von 5“), dem eigentlichen Inhalt, einer zentralen Erkenntnis und einer Übergangsphrase zur nächsten Lektion.
Diese Templates sind sprachbewusst. Die englische Version sagt „Here is the key takeaway“, während die deutsche Version die entsprechende muttersprachliche Formulierung verwendet. Kleine Details, aber sie lassen das Hörerlebnis bewusst gestaltet wirken statt roboterhaft.
Die „Erst abspielen, Rest generieren“-Strategie
Das ist die Architekturentscheidung, auf die wir am stolzesten sind.
Wenn ein Nutzer auf Play tippt, fordert das System nur das Audio der ersten Lektion an. Diese einzelne Lektion wird typischerweise in drei bis acht Sekunden generiert. Die Wiedergabe beginnt sofort. Während Lektion eins läuft (ungefähr zwei Minuten Audio), wird Lektion zwei bereits im Hintergrund generiert.
Jedes Track-Wechsel-Event löst die Vorgenerierung der N+1-Lektion aus. Der Nutzer beendet Lektion zwei; Lektion drei wartet bereits. Das Ergebnis ist nahtlose, lückenlose Wiedergabe über einen gesamten Kurs.
Was passiert, wenn die nächste Lektion noch nicht fertig ist? Der Player zeigt eine kurze „Nächste Lektion wird vorbereitet...“-Anzeige und setzt die Wiedergabe automatisch fort, sobald das Audio eintrifft. In der Praxis tritt das fast nie auf. Das Generierungsfenster ist nahezu immer kürzer als die Wiedergabedauer der aktuellen Lektion. Die Mathematik spielt zu unseren Gunsten.
Dieser Ansatz hat auch einen massiven Kostenvorteil. Wenn ein Nutzer nur die erste Lektion hört und weiterzieht, haben wir genau eine Lektion Audio generiert. Kein Abfall.
Intelligentes Caching mit Content-Hashing
Dasselbe Audio zweimal zu generieren ist reine Verschwendung. Unsere Caching-Schicht verhindert das.
Jede Lektion erhält einen MD5-Hash ihres Textinhalts, auf die ersten 12 Zeichen gekürzt. Dieser Hash dient als Cache-Schlüssel. Wenn ein Nutzer Audio anfordert, prüft das System: Existiert bereits eine MP3 für diesen Hash?
- Cache-Hit: Die gespeicherte MP3 wird sofort zurückgegeben. Kein TTS-Aufruf. Keine Kosten.
- Cache-Miss: Audio generieren, speichern und mit dem Hash verknüpfen.
Die Eleganz liegt in dem, was bei Inhaltsänderungen passiert. Ein Kursersteller bearbeitet eine Lektion, der Content-Hash ändert sich, und das alte gecachte Audio wird verwaist. Die nächste Wiedergabeanforderung generiert frisches Audio, das den aktualisierten Inhalt widerspiegelt. Keine manuelle Cache-Invalidierung nötig. Der Hash erledigt das automatisch.
Audiodateien werden im Convex File Storage gespeichert, das von Cloudflare R2 unterstützt wird. Es gibt keine Ablaufrichtlinie. Gecachtes Audio lebt unbegrenzt, bis sich der zugrunde liegende Inhalt ändert. Speicher ist günstig. TTS-API-Aufrufe sind es nicht.
Deduplizierung und Rate Limiting
Gleichzeitigkeit schafft Probleme. Zwei Nutzer tippen im selben Moment auf Play beim gleichen Kurs. Ohne Schutzmaßnahmen würden beide Anfragen doppelte TTS-Aufrufe für dieselbe Lektion auslösen. Multipliziert über Tausende von Nutzern wird die API-Rechnung unberechenbar.
Wir lösen das mit Generierungssperren. Wenn eine Generierung beginnt, schreibt das System einen Sperreintrag für den spezifischen Lektions-Hash. Jede gleichzeitige Anfrage für denselben Hash sieht die Sperre und wartet, bis die erste Generierung abgeschlossen ist, statt ein Duplikat zu starten.
Sperren laufen nach 60 Sekunden automatisch ab. Das verhindert permanente Deadlocks, falls ein Generierungsprozess mittendrin abstürzt. Sechzig Sekunden sind großzügig; die meisten Generierungen sind in unter zehn Sekunden fertig.
Zusätzlich zur Deduplizierung erzwingen wir ein nutzerbezogenes Rate Limiting: 10 Generierungsanfragen pro Nutzer pro Minute. Das verhindert Missbrauch, hält die Kosten begrenzt und stellt fairen Zugang über die gesamte Nutzerbasis sicher. Das Limit ist hoch genug, dass kein normaler Nutzer es bei regulärem Hören jemals erreichen wird.
Hintergrund-Hygiene: Der 3-Uhr-morgens-Cron
On-Demand-Generierung meistert den Long Tail hervorragend. Aber populäre Kurse verdienen etwas Besseres, als den ersten Hörer warten zu lassen.
Ein täglicher Cron-Job läuft um 3:00 Uhr UTC. Er scannt nach Kursen, die als „bereit“ markiert sind und null gecachtes Audio haben. Pro Durchlauf generiert er Audio für bis zu 10 Kurse vor, priorisiert nach Popularitätssignalen.
Das bedeutet: Trending-Kurse und häufig aufgerufene Themen haben sofort Audio verfügbar, bevor jemand auf Play tippt. Der Cron fungiert als Vorwärm-Schicht auf dem On-Demand-System. Beide Strategien ergänzen sich: Der Cron erledigt die vorhersehbaren Hits, On-Demand erledigt alles andere.
Mobile Wiedergabe-Architektur
Großartiges Audio zu generieren bringt nichts, wenn das Wiedergabeerlebnis schlecht ist. Auf der mobilen Seite nutzen wir react-native-track-player, eine bewährte Bibliothek für native Audiowiedergabe auf iOS und Android.
Der Funktionsumfang:
- Hintergrundwiedergabe. Audio läuft weiter, wenn die App minimiert wird. Sperrbildschirm- und Benachrichtigungssteuerungen funktionieren nativ auf beiden Plattformen.
- Variable Geschwindigkeit. Vier Optionen: 0,75x, 1,0x, 1,25x und 1,5x. Die gewählte Geschwindigkeit wird in
AsyncStoragegespeichert, sodass Nutzer sie nicht jede Session neu einstellen müssen. - Mini-Player. Eine kompakte Player-Leiste bleibt während der App-Navigation am unteren Bildschirmrand sichtbar. Antippen öffnet den Vollbild-Player mit Suchleiste, Kurs-Artwork und Lektions-Metadaten.
- Progressives Laden. Der Player ist eng mit der Generierungs-Pipeline integriert. Track-Metadaten werden in Echtzeit aktualisiert, wenn neue Lektionen verfügbar werden.
Ein subtiles, aber wichtiges Detail: Der Player merkt sich, welche Lektion der Nutzer zuletzt gehört hat. Wenn du die App mitten im Kurs schließt und Stunden später zurückkehrst, wird die Wiedergabe genau dort fortgesetzt, wo du aufgehört hast.
Was wir gelernt haben
Der Bau dieses Systems hat einige Prinzipien bestätigt, die weit über Audiogenerierung hinaus gelten.
Lazy schlägt Eager. Audio für jeden Kurs vorab zu generieren wäre der offensichtliche Ansatz gewesen. Es wäre auch der falsche gewesen. On-Demand-Generierung mit Caching gibt uns das Beste aus beiden Welten: sofortige Wiedergabe für wiederkehrende Inhalte, minimale Kosten für den Long Tail.
Hash-basiertes Caching wird unterschätzt. Content-Hashing als Cache-Schlüssel eliminiert eine ganze Klasse von Cache-Invalidierungsbugs. Der Cache ist immer korrekt, weil er vom Inhalt selbst abgeleitet ist.
Progressives Laden verändert die Wahrnehmung. Nutzer interessiert die Gesamtgenerierungszeit nicht. Sie interessiert die Time-to-First-Audio. Indem wir die Wiedergabe sofort starten und vorausgenerieren, haben wir eine 30-Sekunden-Gesamtgenerierungszeit in eine gefühlte 5-Sekunden-Wartezeit verwandelt.
Das System verarbeitet jetzt täglich Tausende von Audiogenerierungen. Es skaliert linear, die Kosten sind proportional zur tatsächlichen Nutzung, und die Architektur hat sich als bemerkenswert wartungsarm erwiesen. Manchmal sind die besten Systeme diejenigen, die so wenig Arbeit wie möglich verrichten, genau im richtigen Moment.
Häufig gestellte Fragen
Welche TTS-Engine nutzt NerdSip?
NerdSip nutzt Google Cloud Text-to-Speech mit dem Chirp3-HD-Sprachmodell. Englische Kurse verwenden die Stimme en-US-Chirp3-HD-Enceladus, während deutsche Kurse eine dedizierte de-DE-Variante nutzen. Audio wird als MP3 mit einer Abtastrate von 24 kHz codiert.
Wie schnell ist die Audiogenerierung?
Eine einzelne Lektion wird typischerweise in 3 bis 8 Sekunden generiert, je nach Länge. Da NerdSip eine progressive Ladestrategie verwendet, beginnt die erste Lektion fast sofort zu spielen, während die restlichen Lektionen im Hintergrund generiert werden. Die meisten Nutzer erleben keine Ladepause.
Funktioniert der NerdSip Voice-Modus offline?
Die Audiogenerierung erfordert eine Internetverbindung, da sie auf Google Cloud TTS basiert. Sobald eine Lektion jedoch generiert und gecacht wurde, werden nachfolgende Wiedergaben direkt aus dem Cache geladen, was deutlich schneller ist.
Wie hält NerdSip Audio mit Kursänderungen synchron?
Jeder Lektion wird ein MD5-Content-Hash zugewiesen. Wenn sich der Kursinhalt ändert, ändert sich auch der Hash, was den alten Cache ungültig macht und bei der nächsten Wiedergabe eine neue Audiogenerierung auslöst. So hören Nutzer immer die aktuellste Version.
📚 Weiterlesen
Bereit zum Zuhören und Lernen?
Verwandle jeden Kurs in einen KI-Podcast. Lade NerdSip herunter und lerne durch Zuhören, wo auch immer du bist.