1600bit / s Sprachcodierung mit dem neuronalen Vocoder LPCNet



Dies ist eine Fortsetzung des ersten Artikels über LPCNet . In der ersten Demo haben wir eine Architektur vorgestellt , die Signalverarbeitung und Deep Learning kombiniert, um die Effektivität der neuronalen Sprachsynthese zu verbessern. Dieses Mal werden wir LPCNet in einen neuronalen Sprachcodec mit einer sehr niedrigen Bitrate verwandeln (siehe den wissenschaftlichen Artikel ). Es kann auf aktuellen Geräten und sogar auf Telefonen verwendet werden.

Zum ersten Mal arbeitet ein neuronaler Vocoder in Echtzeit auf einem Prozessorkern des Telefons und nicht auf einer Hochgeschwindigkeits-GPU. Die endgültige Bitrate von 1600 Bit / s ist etwa zehnmal niedriger als die von normalen Breitband-Codecs. Die Qualität ist viel besser als bei vorhandenen Vocodern mit einer sehr niedrigen Bitrate und vergleichbar mit herkömmlichen Codecs, die eine höhere Bitrate verwenden.

Wellenformcodierer und Vocoder


Es gibt zwei große Arten von Sprachcodecs: Wellenformcodierer und Vocoder. Zu den Wellenformcodierern gehören Opus, AMR / AMR-WB und alle Codecs, die für Musik verwendet werden können. Sie versuchen, eine decodierte Wellenform so nah wie möglich am Original bereitzustellen - normalerweise unter Berücksichtigung einiger Wahrnehmungsmerkmale. Vocoder hingegen sind eigentlich Synthesizer. Der Codierer extrahiert Informationen über die Tonhöhe und Form des Sprachpfads, leitet diese Informationen an den Decodierer weiter und synthetisiert die Sprache neu. Es ist fast wie bei der Spracherkennung, gefolgt vom Lesen von Text in einem Sprachsynthesizer, nur dass der Textcodierer viel einfacher / schneller als die Spracherkennung ist (und etwas mehr Informationen vermittelt).

Vocoder gibt es seit den 70er Jahren, aber da ihre Decoder eine Sprachsynthese durchführen, können sie nicht viel besser sein als herkömmliche Sprachsynthesesysteme, die bis vor kurzem einfach schrecklich klangen. Aus diesem Grund wurden Vocoder typischerweise bei Geschwindigkeiten unter 3 kB / s verwendet. Darüber hinaus bieten Wellenformcodierer einfach die beste Qualität. Dies dauerte bis vor kurzem, als neuronale Sprachsynthesesysteme wie WaveNet auf den Markt kamen . Plötzlich klang die Synthese viel besser, und natürlich gab es Leute, die aus WaveNet einen Vocoder machen wollten .

LPCNet-Übersicht


WaveNet erzeugt Sprache von sehr hoher Qualität, erfordert jedoch Hunderte von Gigaflops an Rechenleistung. LPCNet reduzierte den Rechenaufwand erheblich. Der Vocoder basiert auf WaveRNN, das WaveNet mithilfe eines wiederkehrenden neuronalen Netzwerks (RNN) und spärlicher Matrizen verbessert. LPCNet erweitert WaveRNN weiter durch lineare Vorhersage (LPC), die bei älteren Vocodern eine gute Leistung erbrachte. Es sagt eine Stichprobe aus einer linearen Kombination vorheriger Stichproben voraus und macht sie vor allem um ein Vielfaches schneller als ein neuronales Netzwerk. Natürlich ist es nicht universell (sonst würden Vocoder der 70er Jahre großartig klingen), aber es kann die Belastung des neuronalen Netzwerks ernsthaft reduzieren. Auf diese Weise können Sie ein kleineres Netzwerk als WaveRNN verwenden, ohne die Qualität zu beeinträchtigen.


Schauen wir uns LPCNet genauer an. Der gelbe Teil links wird einmal pro Frame berechnet und seine Ausgabe wird für die Netzwerkabtastfrequenz rechts (blau) verwendet. Die Recheneinheit sagt eine Stichprobe zum Zeitpunkt t basierend auf vorherigen Stichproben und linearen Vorhersagekoeffizienten voraus

Kompressionseigenschaften


LPCNet synthetisiert 10 ms lang Sprache aus Vektoren mit 20 Zeichen pro Frame. Von diesen sind 18 Zeichen Cepstralkoeffizienten , die die Form des Spektrums darstellen. Die beiden verbleibenden beschreiben die Höhe: einen Parameter für den Tonhöhenschritt (Tonhöhenperiode) und den anderen für die Stärke (wie stark das Signal mit sich selbst korreliert, wenn Sie eine Verzögerung durch die Tonhöhe einführen). Wenn Sie die Parameter in Form von Gleitkommawerten speichern, benötigen alle diese Informationen während der Speicherung oder Übertragung bis zu 64 kbit / s. Dies ist zu viel, da selbst der Opus-Codec eine sehr hochwertige Sprachcodierung mit nur 16 kbit / s (für 16 kHz Mono) bietet. Natürlich müssen Sie hier eine starke Komprimierung anwenden.

Höhe


Alle Codecs sind stark von der Tonhöhe abhängig, aber im Gegensatz zu Wellenformcodierern, bei denen die Tonhöhe „nur“ zur Reduzierung der Redundanz beiträgt, haben Vocoder keinen Fallback. Wenn Sie die falsche Höhe wählen, wird eine schlecht klingende (oder sogar unleserliche) Sprache erzeugt. Ohne auf Details einzugehen (siehe den wissenschaftlichen Artikel), bemüht sich der LPCNet-Encoder, keinen Höhenfehler zu machen. Die Suche beginnt mit einer Suche nach Zeitkorrelationen in einem Sprachsignal. Sehen Sie unten, wie eine typische Suche funktioniert.


Die Tonhöhe ist der Zeitraum, in dem die Tonhöhe wiederholt wird. Die Animation sucht verzögert nach dem Schritt, der der maximalen Korrelation zwischen dem Signal x (n) und seiner Kopie x (nT) entspricht. Der T-Wert mit maximaler Korrelation ist ein Höhenabstand

Diese Informationen müssen mit so wenig Bits wie möglich codiert werden, ohne das Ergebnis zu stark zu beeinträchtigen. Da wir die Frequenz von Natur aus auf einer logarithmischen Skala wahrnehmen (zum Beispiel verdoppelt jede musikalische Oktave die vorherige Frequenz), ist dies bei der logarithmischen Codierung sinnvoll. Die Höhe des Sprachsignals liegt bei den meisten Menschen (wir versuchen hier nicht, die Sopranistin abzudecken) zwischen 62,5 und 500 Hz. Mit sieben Bits (128 mögliche Werte) erhalten wir eine Auflösung von ungefähr einem Viertelton (der Unterschied zwischen und vor und re ist ein Ton).

Also, mit der Höhe fertig? Na ja, nicht so schnell. Die Leute sprechen nicht wie Roboter aus Filmen der 1960er Jahre. Die Tonhöhe kann sogar innerhalb eines 40-Millisekunden-Pakets variieren. Sie müssen dies berücksichtigen und die Bits für den Parameter zum Ändern der Höhe belassen: 3 Bits, um die Differenz von bis zu 2,5 Halbtönen zwischen dem Anfang und dem Ende des Pakets zu codieren. Schließlich müssen Sie die Korrelation der Tonhöhenschritte codieren und zwischen Vokalen und Konsonanten (z. B. s und f) unterscheiden. Zwei Bits reichen für die Korrelation aus.

Cepstrum


Während die Tonhöhe die äußeren Merkmale der Sprache enthält (Prosodie, Emotion, Betonung, ...), bestimmt die spektrale Eigenschaft, was gesagt wurde (mit Ausnahme von Tonsprachen wie Chinesisch, bei denen die Tonhöhe für die Bedeutung wichtig ist). Die Stimmbänder erzeugen für jeden Vokal ungefähr den gleichen Klang, aber die Form des Stimmapparates bestimmt, welcher Klang gesprochen wird. Der Sprachpfad fungiert als Filter, und die Aufgabe des Codierers besteht darin, diesen Filter auszuwerten und an den Decodierer weiterzuleiten. Dies kann effektiv durchgeführt werden, wenn Sie das Spektrum in ein Cepstrum konvertieren (ja, dies ist ein „Spektrum“ mit einer geänderten Reihenfolge der Buchstaben, das sind wir lustigen Typen in der digitalen Signalverarbeitung).

Für ein Eingangssignal bei 16 kHz repräsentiert das Cepstrum grundsätzlich alle 10 ms einen Vektor mit 18 Zahlen, die so weit wie möglich komprimiert werden müssen. Da wir vier solcher Vektoren in einem 40-ms-Paket haben und sie normalerweise einander ähnlich sind, möchten wir die Redundanz so weit wie möglich beseitigen. Dies kann unter Verwendung benachbarter Vektoren als Prädiktoren erfolgen und nur die Differenz zwischen der Vorhersage und dem realen Wert übermitteln. Gleichzeitig möchten wir uns nicht zu sehr auf frühere Pakete verlassen, wenn eines davon verschwindet. Es sieht so aus, als ob das Problem bereits behoben wurde ...

Wenn Sie nur einen Hammer haben, sieht alles aus wie ein Nagel - Abraham Maslow.

Wenn Sie viel mit Video-Codecs gearbeitet haben , sind Sie wahrscheinlich auf das Konzept der B-Frames gestoßen. Im Gegensatz zu Videocodecs, die einen Frame in viele Pakete unterteilen, haben wir im Gegenteil viele Frames in einem Paket. Wir beginnen mit der Codierung des Schlüsselrahmens , d. H. Des unabhängigen Vektors, und des Endes des Pakets. Dieser Vektor wird ohne Vorhersage codiert und belegt 37 Bit: 7 für die Gesamtenergie (erster Cepstralkoeffizient) und 30 Bit für andere Parameter unter Verwendung der Vektorquantisierung (VQ). Dann kommen die (hierarchischen) B-Frames. Von den beiden Schlüsselwörtern (eines aus dem aktuellen Paket und eines aus dem vorherigen) wird ein Cepstrum zwischen ihnen vorhergesagt. Als Prädiktor für die Codierung der Differenz zwischen dem realen Wert und der Vorhersage können Sie entweder zwei Keyframes oder deren Durchschnittswert auswählen. Wir verwenden wieder VQ und codieren diesen Vektor mit insgesamt 13 Bits, einschließlich der Wahl des Prädiktors. Jetzt haben wir nur noch zwei Vektoren und sehr wenige Bits. Verwenden Sie die letzten 3 Bits, um einfach den Prädiktor für die verbleibenden Vektoren auszuwählen. Natürlich ist dies alles in der Abbildung viel einfacher zu verstehen:


Cepstrum-Vorhersage und Quantisierung für Paket k. Grüne Vektoren werden unabhängig quantisiert, blaue Vektoren werden vorhergesagt und rote Vektoren verwenden eine Vorhersage ohne Restquantisierung. Die Vorhersage wird durch Pfeile angezeigt.

Alles zusammenfügen


Wenn wir all das addieren, erhalten wir 64 Bit pro 40-Millisekunden-Paket oder 1600 Bit pro Sekunde. Wenn Sie das Komprimierungsverhältnis berechnen möchten, beträgt die unkomprimierte Breitbandsprache 256 kbps (16 kHz bei 16 Bit pro Abtastung), was ein 160-faches Komprimierungsverhältnis bedeutet! Natürlich können Sie immer mit Quantisierern spielen und eine niedrigere oder höhere Bitrate erzielen (mit einem entsprechenden Effekt auf die Qualität), aber Sie müssen irgendwo anfangen. Hier ist eine Tabelle mit dem Layout, in das diese Bits gehen.

Bitzuordnung
ParameterBit
Pitch Pitch6
Höhenmodulation3
Höhenkorrelation2
Energie7
Unabhängiger Cepstrum VQ (40 ms)30
Voraussichtliches VQ Cepstrum (20 ms)13
Cepstrum-Interpolation (10 ms)3
Insgesamt64

Bei 64 Bit pro Paket 40 ms, bei 25 Paketen pro Sekunde werden 1600 Bit / s erhalten.

Implementierung


Der LPCNet-Quellcode ist unter der BSD-Lizenz verfügbar. Es enthält eine Bibliothek, die die Verwendung des Codecs vereinfacht. Bitte beachten Sie, dass die Entwicklung noch nicht abgeschlossen ist: Sowohl das Format als auch die API müssen sich ändern. Das Repository verfügt auch über eine Demo-Anwendung lpcnet_demo in der der Codec einfach über die Befehlszeile getestet werden kann. Vollständige Anweisungen finden Sie in der Datei README.md.

Wer tiefer graben möchte, hat die Möglichkeit, neue Modelle zu trainieren und / oder LPCNet als Baustein für andere Anwendungen wie die Sprachsynthese zu verwenden (LPCNet ist nur eine Komponente des Synthesizers, führt keine eigene Synthese durch).

Leistung


Die neuronale Sprachsynthese erfordert viele Ressourcen. Auf der ICASSP-Konferenz im letzten Jahr präsentierten Bastian Klein und Kollegen von Google / DeepMind einen 2400-Bit / s-Codec auf WaveNet-Basis , der einen Bitstream von Codec2 erhielt. Obwohl es erstaunlich klingt, bedeutet die rechnerische Komplexität von Hunderten von Gigaflops, dass es nicht ohne teure GPU und ernsthaften Aufwand in Echtzeit gestartet werden kann.

Im Gegenteil, unser 1600-Bit / s-Codec erzeugt nur 3 Gigaflops und ist so konzipiert, dass er in Echtzeit auf viel günstigeren Geräten funktioniert. Tatsächlich kann es heute in realen Anwendungen verwendet werden. Für die Optimierung musste Code für die AVX2 / FMA- und Neon-Befehlssätze geschrieben werden (nur eingebetteter Code ohne Assembler). Dank dessen können wir jetzt Sprache nicht nur auf einem PC, sondern auch auf mehr oder weniger modernen Telefonen in Echtzeit codieren (und insbesondere decodieren). Nachfolgend finden Sie die Leistung auf x86- und ARM-Prozessoren.

Leistung
CPUFrequenz% eines KernsIn Echtzeit
AMD 2990WX (Threadripper)3,0 GHz *14%7.0x
Intel Xeon E5-2640 v4 (Broadwell)2,4 GHz *20%5,0x
Löwenmaul 855 (Cortex-A76 auf Galaxy S10 )2,82 GHz31%3.2x
Löwenmaul 845 (Cortex-A75 auf Pixel 3 )2,5 GHz68%1,47x
AMD A1100 (Cortex-A57)1,7 GHz102%0,98x
BCM2837 (Cortex-A53 auf Raspberry Pi 3)1,2 GHz310%0,32x
* Turbomodus


Die Zahlen sind ziemlich interessant. Obwohl nur Broadwell und Threadripper gezeigt werden, weisen Haswell- und Skylake-Prozessoren auf der x86-Plattform eine ähnliche Leistung auf (unter Berücksichtigung der Taktfrequenz). ARM-Prozessoren unterscheiden sich jedoch deutlich voneinander. Selbst unter Berücksichtigung des Frequenzunterschieds ist A76 fünf- bis sechsmal schneller als A53: Dies ist durchaus zu erwarten, da A53 hauptsächlich zur Energieeffizienz eingesetzt wird (z. B. in big.LITTLE-Systemen). Trotzdem kann LPCNet auf einem modernen Telefon mit nur einem Kern in Echtzeit arbeiten. Es wäre zwar schön, es in Echtzeit auf dem Raspberry Pi 3 laufen zu lassen. Nun ist das weit, aber nichts ist unmöglich.

Unter x86 beträgt der Grund für die Leistungsbeschränkung das Fünffache des theoretischen Maximums. Wie Sie wissen, sind Operationen der Matrix-Vektor-Multiplikation weniger effizient als Matrix-Matrix-Operationen, da pro Operation mehr Downloads durchgeführt werden - insbesondere ein Matrix-Download für jede FMA-Operation. Einerseits hängt die Leistung mit dem L2-Cache zusammen, der nur 16 Bit pro Zyklus bereitstellt. Auf der anderen Seite behauptet Intel, dass L2 auf Broadwell bis zu 32 Bit pro Zyklus und auf Skylake bis zu 64 Bit pro Zyklus liefern kann.

Ergebnisse


Wir haben Audiotests im MUSHRA-Stil durchgeführt, um die Codierungsqualität zu vergleichen. Testbedingungen:

  • Beispiel : Original (wenn Sie ein besseres Ergebnis als das Original erhalten, stimmt eindeutig etwas mit Ihrem Test nicht)
  • 1600 bps LPCNet : unsere Demo
  • Unkomprimiertes LPNet : „LPNet mit 122 äquivalenten Einheiten“ aus dem ersten Artikel
  • Opus 9000 bps Breitband : Niedrigste Bitrate, mit der Opus 1.3 Breitband-Audio codiert
  • MELP bei 2400 bps : ein bekannter Vocoder mit einer niedrigen Bitrate (ähnlich wie Codec2 in der Qualität)
  • Speex 4000 bps : Dieser Breitband-Vocoder sollte niemals verwendet werden, ist aber eine gute Referenz für den Boden

Im ersten Test (Satz 1) haben wir acht Sprachfragmente von Aussagen von zwei Männern und zwei Frauen. Dateien im ersten Satz gehören zu derselben Datenbank (d. H. Dieselben Aufzeichnungsbedingungen), die für das Training verwendet wurde, aber diese spezifischen Personen wurden aus dem Trainingssatz ausgeschlossen. Im zweiten Test (Satz 2) haben wir einige Dateien aus dem Opus-Test (unkomprimiert) verwendet, um den Ton unter verschiedenen Bedingungen aufzunehmen, um sicherzustellen, dass LPCNet eine gewisse Verallgemeinerung aufweist. In beiden Tests jeweils 100 Teilnehmer, daher sind die Fehler recht gering. Siehe die Ergebnisse unten.


Subjektive Qualität (MUSHRA) in zwei Tests

Im Allgemeinen sieht LPCNet mit 1600 Bit / s gut aus - viel besser als MELP mit 2400 Bit / s und nicht weit hinter Opus mit 9000 Bit / s. Gleichzeitig ist unkomprimiertes LPCNet mit 9000 Bit / s etwas besser in der Qualität als Opus. Dies bedeutet, dass es möglich ist, eine bessere Qualität als Opus bei Bitraten im Bereich von 2000-6000 Bit / s bereitzustellen.

Hör dir selbst zu


Hier sind Beispiele aus dem Audiotest:

Frau (Satz 1)


Mann (Satz 1)


Gemischt (Satz 2)



Wo kann dies verwendet werden?


Wir glauben, dass dies eine coole Technologie für sich ist, aber sie hat auch praktische Anwendungen. Hier sind nur einige Optionen.

VoIP in schlecht vernetzten Ländern


Nicht jeder hat immer eine Hochgeschwindigkeitsverbindung. In einigen Ländern ist die Kommunikation sehr langsam und unzuverlässig. Ein 1600-Bit-Sprachcodec funktioniert unter solchen Bedingungen normal und überträgt Pakete aus Gründen der Zuverlässigkeit sogar mehrmals. Aufgrund des Overheads der Paket-Header (40 Byte für IP + UDP + RTP) ist es natürlich besser, größere Pakete zu erstellen: 40, 80 oder 120 ms.

Amateurfunk / HF-Radio


David Rowe arbeitet seit zehn Jahren an der Sprachcodierung für die Funkkommunikation. Er entwickelte Codec2 , der Sprache mit einer Geschwindigkeit von 700 bis 3200 Bit / s überträgt. Im vergangenen Jahr haben David und ich darüber gesprochen, wie Codec2 mithilfe der neuronalen Synthese verbessert werden kann, und jetzt tun wir es endlich. In seinem Blog schrieb David über seine eigene Implementierung des LPCNet-basierten Codecs zur Integration in FreeDV .

Erhöhte Zuverlässigkeit beim Paketverlust


Die Fähigkeit, einen Bitstrom mit anständiger Qualität in einer kleinen Anzahl von Bits zu codieren, ist nützlich, um Redundanz auf einem unzuverlässigen Kanal bereitzustellen. Opus verfügt über einen Vorwärtsfehlerkorrekturmechanismus (FEC), der als LBRR bekannt ist und einen vorherigen Frame mit einer niedrigeren Bitrate codiert und in den aktuellen Frame sendet. Es funktioniert gut, erhöht aber den Overhead erheblich. Die Duplizierung von 1600 Bit / s-Streams ist viel effizienter.

Pläne


Es gibt viele weitere Möglichkeiten, LPCNet zu verwenden. Zum Beispiel die Verbesserung bestehender Codecs (das gleiche Opus). Wie bei anderen Codecs verschlechtert sich die Opus-Qualität bei sehr niedrigen Bitraten (unter 8000 Bit / s) recht schnell, da dem Wellenform-Codec Bits fehlen, die dem Original entsprechen. Die übertragenen linearen Vorhersageinformationen reichen jedoch aus, damit LPCNet anständig klingende Sprache synthetisieren kann - besser als Opus bei dieser Bitrate. Darüber hinaus hilft der Rest der von Opus übertragenen Informationen (Restprognose) LPCNet, ein noch besseres Ergebnis zu erzielen. In gewissem Sinne kann LPCNet als ausgefallener Nachfilter verwendet werden, um die Qualität von Opus (oder eines anderen Codecs) zu verbessern, ohne den Bitstrom zu ändern (d. H. Unter Beibehaltung der vollständigen Kompatibilität).

Zusätzliche Ressourcen


  1. J.-M. Valin, J. Skoglund, 1,6 Kbit / s breitbandiger neuronaler Vocoder unter Verwendung von LPCNet , gesendet an Interspeech 2019 , arXiv: 1903.12087 .
  2. J.-M. Valin, J. Skoglund, LPCNet: Advanced Neural Speech Synthesis Through Linear Prediction , Proc. ICASSP, 2019 , arXiv: 1810.11846 .
  3. A. van den Oord, S. Dileman, H. Zen, K. Simonyan, O. Vinyals, A. Graves, N. Kalkhbrenner, E. Senor, K. Kavukuglu, WaveNet: Generatives Modell für unverarbeiteten Klang , 2016.
  4. N. Karlhbrenner, E. Elsen, C. Simonyan, S. Nouri, N. Casagrande, E. Lockhart, F. Stimberg, A. van den Oord, S. Dileman, K. Kavukuglu, Effektive neuronale Klangsynthese , 2018.
  5. V. B. Klein, F. S. K. Lim, A. Lyubs, J. Skoglund, F. Stimberg, K. Wang, T. S. Walters, Sprachcodierung mit niedriger Bitrate basierend auf Wavenet , 2018
  6. Der Quellcode von LPCNet.
  7. Codec für FreeDV basierend auf LPCNet von David Rowe.
  8. Nehmen Sie an der Diskussion über die Entwicklung auf #opus unter irc.freenode.net teil (→ Webinterface )

Source: https://habr.com/ru/post/de446656/


All Articles