Zum Hauptinhalt springen

48 kHz auf 16 kHz: was bandbegrenztes Resampling schützt und wo es stattfindet

Whisper-artige Modelle erwarten 16 kHz, und die meiste Mac-Hardware läuft mit 48 kHz. Wer ohne Tiefpassfilter dezimiert, faltet alles oberhalb von 8 kHz zurück ins Sprachband. Was bandbegrenzte Umwandlung leistet und warum Voice Type schon bei der Aufnahme 16 kHz anfordert.

Whisper-artige Modelle erwarten Audio mit 16 kHz. Die meiste Mac-Audiohardware läuft mit 48 kHz. Irgendwo dazwischen muss eine Abtastratenumwandlung stattfinden, und wenn sie ohne Filter geschieht, bringt sie Energie in die Modelleingabe, die deine Stimme nie erzeugt hat.

Kurz gesagt

  • Wer 48 kHz ohne Tiefpassfilter auf 16 kHz dezimiert, faltet alles oberhalb von 8 kHz zurück ins Sprachband.
  • Die bandbegrenzte Umwandlung filtert zuerst mit einem Tiefpass bei 8 kHz und dezimiert dann im Verhältnis 3 zu 1.
  • Voice Type fordert bei Core Audio direkt einen 16-kHz-Eingabestream an, sodass die Umwandlung meist im Audiotreiber stattfindet und nicht in der App.
  • Wenn ein Gerät keine 16 kHz liefern kann, wandelt die App am Ende der Aufbereitungskette jedes Batches mit AVAudioConverter um.

Der naive Ansatz geht schief

Einfache Dezimierung, also von drei Samples zwei wegzuwerfen, erzeugt Aliasing. Eine 48-kHz-Aufnahme enthält Inhalte bis 24 kHz. Alles oberhalb von 8 kHz hat in einem 16-kHz-Stream keinen Platz und wird zurück ins Sprachband gespiegelt. Ein 10-kHz-Ton landet bei 6 kHz. Das Modell hört ein Geräusch, das der Sprecher nie gemacht hat.

Billiges Resampling optimiert auf Geschwindigkeit, nicht auf Sperrdämpfung. Für einen Klingelton ist das in Ordnung. Für Spracherkennung nicht, denn der Unterschied zwischen „s“, „f“ und „th“ liegt genau in dem Hochfrequenzbereich, den der Filter schützen soll.

Bandbegrenztes Resampling

Bandbegrenzte Umwandlung bedeutet: einen Tiefpassfilter bei der Nyquist-Frequenz der Zielrate anwenden (8 kHz für eine Ausgabe mit 16 kHz) und dann dezimieren. Frequenzen, die Aliasing verursachen würden, werden entfernt, bevor sie sich falten können.

Beim Filter steckt die Ingenieurarbeit. Ist er zu aggressiv, verlierst du die hochfrequenten Anteile, die die Frikative unterscheiden. Ist er zu sanft, schlüpft Aliasing durch.

Wo Voice Type das macht

Nicht dort, wo man es vermuten würde, und nicht dort, wo eine frühere Version dieser Seite es behauptet hat.

Die App nimmt nicht mit 48 kHz auf und wandelt am Ende um. Sie fordert bei der Audio Queue für die Eingabe von Anfang an einen 16-kHz-Stream an, sodass Core Audio die Abtastratenumwandlung im Aufnahmepfad durchführt, bevor die App ein einziges Sample sieht. Der Voice-Activity-Detector, der Batcher und der Recognizer arbeiten alle mit 16 kHz. In der Live-Pipeline gibt es keine 48-kHz-Stufe.

Zwei Stellen wandeln in der App weiterhin um, denn eine Anforderung ist eine Anforderung und keine Garantie:

  • Meldet das gewählte Gerät eine andere Rate als 16 kHz, wird zuerst die Eingabe des Voice-Activity-Detectors umgewandelt, weil das Gate auf 512-Sample-Frames bei 16 kHz ausgelegt ist und auf nichts anderes.
  • Jeder geleerte Batch durchläuft eine Aufbereitungskette, die mit einem Resampling auf 16 kHz endet. Lag die Aufnahme bereits bei 16 kHz, ist dieser Schritt ein No-op. Wenn nicht, übernimmt AVAudioConverter, und der Converter wird pro Aufruf als zustandslos behandelt, damit ein kurzer Clip keine Priming-Artefakte vom vorherigen übernimmt.

Die Aufbereitungskette drumherum, der Reihe nach: DC-Offset entfernen, Filter und Lautheitsregelung anwenden, dann resamplen. Vor der Ratenänderung zu filtern ist die richtige Reihenfolge, denn die Grenzfrequenz des Hochpasses ist in Hz angegeben und die Filterkoeffizienten hängen von der Abtastrate ab, mit der der Filter läuft.

Warum nicht einfach mit 48 kHz aufnehmen und später umwandeln?

Das kannst du tun, und viele Pipelines tun es. Die Rate des Modells schon in der Aufnahmeschicht anzufordern ist in dreierlei Hinsicht günstiger: Kein Puffer ist dreimal größer als nötig, der Voice-Activity-Detector braucht auf dem üblichen Weg keine vorgeschaltete Umwandlung, und die Umwandlung, die stattfindet, erledigt einmal der Audiotreiber statt wiederholt die App.

Der Preis ist, dass du dem Converter von Core Audio vertraust statt deinem eigenen. Mit diesem Kompromiss sind wir zufrieden. Ein Abtastratenwandler auf Treiberebene ist gut getesteter Code, und die Alternative wäre, einen eigenen zu pflegen, um ein Problem zu lösen, das Apple bereits gelöst hat.

Was das für dich bedeutet

Fast nichts, und das ist der Punkt. Abtastratenumwandlung ist ein Korrektheitsproblem, kein Regler zum Feinjustieren. Richtig gemacht ist sie unsichtbar, falsch gemacht zeigt sie sich als Transkript, das Konsonanten subtil falsch erfasst, und das behebt keine Modellgröße.

Wenn du etwas Ähnliches baust: Wandle mit einem bandbegrenzten Converter um, tu es einmal, und tu es nach deinen Filtern statt davor.

Verwandt: Voice Activity Detection · Technologieüberblick