Codificación de voz de 1600 bits / s con codificador de voz neural LPCNet



Esta es una continuación del primer artículo sobre LPCNet . En la primera demostración, presentamos una arquitectura que combina el procesamiento de señales y el aprendizaje profundo para mejorar la efectividad de la síntesis del habla neural. Esta vez convertiremos LPCNet en un códec de voz neural con una tasa de bits muy baja (vea el artículo científico ). Se puede utilizar en equipos actuales e incluso en teléfonos.

Por primera vez, un vocoder neuronal funciona en tiempo real en el núcleo de un procesador del teléfono y no en una GPU de alta velocidad. La tasa de bits final de 1600 bps es aproximadamente diez veces menor que la de los códecs de banda ancha ordinarios. La calidad es mucho mejor que los vocoders existentes con una tasa de bits muy baja y comparable a los códecs más tradicionales que usan una tasa de bits más alta.

Encoders y Vocoders de forma de onda


Hay dos grandes tipos de códecs de voz: codificadores de forma de onda y codificadores de voz. Los codificadores de forma de onda incluyen Opus, AMR / AMR-WB y todos los códecs que se pueden usar para música. Intentan proporcionar una forma de onda decodificada lo más cercana posible al original, generalmente teniendo en cuenta algunas características perceptivas. Los vocoders, por otro lado, son en realidad sintetizadores. El codificador extrae información sobre el tono y la forma de la ruta de voz, pasa esta información al decodificador y vuelve a sintetizar la voz. Es casi como el reconocimiento de voz seguido de la lectura de texto en un sintetizador de voz, excepto que el codificador de texto es mucho más simple / rápido que el reconocimiento de voz (y transmite un poco más de información).

Los vocodificadores han existido desde los años 70, pero dado que sus decodificadores realizan síntesis de voz, no pueden ser mucho mejores que los sistemas convencionales de síntesis de voz, que hasta hace poco sonaban simplemente horribles. Esta es la razón por la cual los vocoders se usaban típicamente a velocidades inferiores a 3 kB / s. Además, los codificadores de forma de onda simplemente proporcionan la mejor calidad. Esto continuó hasta hace poco, cuando aparecieron los sistemas de síntesis del habla neural como WaveNet . De repente, la síntesis comenzó a sonar mucho mejor y, por supuesto, había personas que querían hacer un vocoder de WaveNet .

Descripción general de LPCNet


WaveNet produce voz de muy alta calidad, pero requiere cientos de gigaflops de potencia informática. LPCNet redujo significativamente la complejidad computacional. El vocoder se basa en WaveRNN, que mejora WaveNet utilizando una red neuronal recurrente (RNN) y matrices dispersas. LPCNet mejora aún más WaveRNN con predicción lineal (LPC), que funcionó bien en vocoders más antiguos. Predice una muestra a partir de una combinación lineal de muestras anteriores y, lo más importante, la hace muchas veces más rápida que una red neuronal. Por supuesto, no es universal (de lo contrario, los vocoders de los años 70 sonarían genial), pero puede reducir seriamente la carga en la red neuronal. Esto le permite utilizar una red más pequeña que WaveRNN sin sacrificar la calidad.


Echemos un vistazo más de cerca a LPCNet. La parte amarilla de la izquierda se calcula una vez por cuadro, y su salida se usa para la frecuencia de muestreo de la red a la derecha (azul). La unidad de computación predice una muestra en el tiempo t en base a muestras anteriores y coeficientes de predicción lineal.

Características de compresión


LPCNet sintetiza voz a partir de vectores de 20 caracteres por trama durante 10 ms. De estos, 18 signos son coeficientes cepstrales que representan la forma del espectro. Los dos restantes describen la altura: un parámetro para el período de tono (período de tono) y el otro para la fuerza (cuánto se correlaciona la señal consigo mismo, si introduce un retraso por el tono). Si almacena los parámetros en forma de valores de coma flotante, toda esta información ocupará hasta 64 kbit / s durante el almacenamiento o la transmisión. Esto es demasiado, porque incluso el códec Opus proporciona una codificación de voz de muy alta calidad a solo 16 kbit / s (para 16 kHz mono). Obviamente, debe aplicar una fuerte compresión aquí.

Altura


Todos los códecs dependen en gran medida del tono, pero a diferencia de los codificadores de forma de onda, donde el tono "justo" ayuda a reducir la redundancia, los codificadores de voz no tienen respaldo. Si elige la altura incorrecta, comenzarán a generar un discurso que suena mal (o incluso ilegible). Sin entrar en detalles (ver el artículo científico), el codificador LPCNet está luchando para no cometer un error de altura. La búsqueda comienza con una búsqueda de correlaciones de tiempo en una señal de voz. Vea a continuación cómo funciona una búsqueda típica.


El tono es el período durante el cual se repite el tono. La animación busca el paso que corresponde a la correlación máxima entre la señal x (n) y su copia x (nT) con un retraso. El valor T con correlación máxima es un paso de altura

Esta información debe codificarse con el menor número de bits posible sin degradar demasiado el resultado. Dado que percibimos la frecuencia por naturaleza en una escala logarítmica (por ejemplo, cada octava musical dobla la frecuencia anterior), tiene sentido en la codificación logarítmica. La altura de la señal de voz en la mayoría de las personas (no estamos tratando de cubrir la soprano aquí) está entre 62.5 y 500 Hz. Con siete bits (128 valores posibles) obtenemos una resolución de aproximadamente un cuarto de tono (la diferencia entre y antes y re es un tono).

Entonces, ¿con la altura terminada? Bueno, no tan rápido. La gente no habla como robots de las películas de los años sesenta. El tono de voz puede variar incluso dentro de un paquete de 40 milisegundos. Debe tener esto en cuenta, dejando los bits para el parámetro para cambiar la altura: 3 bits para codificar la diferencia de hasta 2.5 semitonos entre el comienzo y el final del paquete. Finalmente, debe codificar la correlación de los pasos de tono, distinguiendo entre vocales y consonantes (por ejemplo, syf). Dos bits son suficientes para la correlación.

Cepstrum


Si bien el tono contiene las características externas del habla (prosodia, emoción, acento, ...), la respuesta espectral determina lo que se dijo (excepto los idiomas tonales como el chino, donde el tono es importante para el significado). Las cuerdas vocales producen aproximadamente el mismo sonido para cualquier vocal, pero la forma del tracto vocal determina qué sonido se hablará. La ruta de voz actúa como un filtro, y la tarea del codificador es evaluar este filtro y pasarlo al decodificador. Esto se puede hacer de manera efectiva si convierte el espectro a cepstrum (sí, este es un "espectro" con un orden de letras cambiado, estos son los tipos divertidos en el procesamiento de señales digitales).

Para una señal de entrada a 16 kHz, el cepstrum representa básicamente un vector de 18 números cada 10 ms, que debe comprimirse lo más posible. Dado que tenemos cuatro de esos vectores en un paquete de 40 ms y generalmente son similares entre sí, queremos eliminar la redundancia tanto como sea posible. Esto se puede hacer usando vectores vecinos como predictores y transmitiendo solo la diferencia entre la predicción y el valor real. Al mismo tiempo, no queremos depender demasiado de los paquetes anteriores si uno de ellos desaparece. Parece que el problema ya se ha resuelto ...

Si solo tienes un martillo, todo parece un clavo: Abraham Maslow.

Si trabajó mucho con los códecs de video , entonces probablemente se encontró con el concepto de B-frames. A diferencia de los códecs de video, que dividen un cuadro en muchos paquetes, nosotros, por el contrario, tenemos muchos cuadros en un paquete. Comenzamos codificando el cuadro clave , es decir, el vector independiente y el final del paquete. Este vector se codifica sin predicción, ocupando 37 bits: 7 para energía total (primer coeficiente cepstral) y 30 bits para otros parámetros que usan cuantificación vectorial (VQ). Luego vienen los marcos B (jerárquicos). De las dos palabras clave (una del paquete actual y otra del anterior), se predice un cepstrum entre ellas. Como predictor para codificar la diferencia entre el valor real y la predicción, puede elegir entre dos cuadros clave o su valor promedio. Usamos VQ nuevamente y codificamos este vector usando un total de 13 bits, incluida la elección del predictor. Ahora solo nos quedan dos vectores y muy pocos bits. Use los últimos 3 bits para simplemente seleccionar el predictor para los vectores restantes. Por supuesto, todo esto es mucho más fácil de entender en la figura:


Predicción y cuantificación de cepstrum para el paquete k. Los vectores verdes se cuantifican de forma independiente, los vectores azules se predicen y los vectores rojos usan predicción sin cuantificación residual. La predicción se muestra con flechas.

Poniendo todo junto


Sumando todo lo anterior, obtenemos 64 bits por paquete de 40 milisegundos o 1600 bits por segundo. Si desea calcular la relación de compresión, la voz de banda ancha sin comprimir es de 256 kbps (16 kHz a 16 bits por muestra), lo que significa una relación de compresión de 160 veces. Por supuesto, siempre puedes jugar con cuantificadores y obtener una tasa de bits más baja o más alta (con un efecto correspondiente en la calidad), pero debes comenzar en alguna parte. Aquí hay una tabla con el diseño donde van estos bits.

Asignación de bits
ParámetroPoco
Pitch pitch6 6
Modulación de altura3
Correlación de altitud2
Energía7 7
Cepstrum VQ independiente (40 ms)30
Cepstrum VQ previsto (20 ms)13
Interpolación de cepstrum (10 ms)3
Total64

A 64 bits por paquete 40 ms, a 25 paquetes por segundo, se obtienen 1600 bps.

Implementación


El código fuente LPCNet está disponible bajo la licencia BSD. Incluye una biblioteca que simplifica el uso del códec. Tenga en cuenta que el desarrollo no ha finalizado: tanto el formato como la API están obligados a cambiar. El repositorio también tiene una aplicación de demostración lpcnet_demo en la que es fácil probar el códec desde la línea de comandos. Consulte el archivo README.md para obtener instrucciones completas.

Quien quiera profundizar, hay una opción para entrenar nuevos modelos y / o usar LPCNet como un bloque de construcción para otras aplicaciones, como la síntesis de voz (LPCNet es solo un componente del sintetizador, no realiza síntesis por sí mismo).

Rendimiento


La síntesis del habla neural requiere muchos recursos. En la conferencia ICASSP del año pasado, Bastian Klein y sus colegas de Google / DeepMind presentaron un códec de 2400 bps basado en WaveNet , recibiendo un flujo de bits del códec2. Aunque suena increíble, la complejidad computacional de cientos de gigaflops significa que no se puede iniciar en tiempo real sin una GPU costosa y un esfuerzo serio.

Por el contrario, nuestro códec de 1600 bit / s produce solo 3 gigaflops y está diseñado para funcionar en tiempo real en equipos mucho más asequibles. De hecho, se puede usar hoy en aplicaciones reales. La optimización requería escribir algo de código para los conjuntos de instrucciones AVX2 / FMA y Neon (solo código incrustado, sin ensamblador). Gracias a esto, ahora podemos codificar (y especialmente decodificar) el habla en tiempo real no solo en una PC, sino también en teléfonos más o menos modernos. A continuación se muestra el rendimiento en procesadores x86 y ARM.

Rendimiento
CPUFrecuencia% de un núcleoA tiempo real
AMD 2990WX (Threadripper)3.0 GHz *14%7.0x
Intel Xeon E5-2640 v4 (Broadwell)2,4 GHz *20%5.0x
Snapdragon 855 (Cortex-A76 en Galaxy S10 )2,82 GHz31%3.2x
Snapdragon 845 (Cortex-A75 en Pixel 3 )2.5 GHz68%1.47x
AMD A1100 (Cortex-A57)1.7 GHz102%0.98x
BCM2837 (Cortex-A53 en Raspberry Pi 3)1,2 GHz310%0.32x
* modo turbo


Los números son bastante interesantes. Aunque solo se muestran Broadwell y Threadripper, en la plataforma x86, los procesadores Haswell y Skylake tienen un rendimiento similar (teniendo en cuenta la frecuencia del reloj). Sin embargo, los procesadores ARM son notablemente diferentes entre sí. Incluso teniendo en cuenta la diferencia en la frecuencia, A76 es de cinco a seis veces más rápido que A53: es bastante esperado, ya que A53 se utiliza principalmente para la eficiencia energética (por ejemplo, en sistemas big.LITTLE). Sin embargo, LPCNet puede funcionar en tiempo real en un teléfono moderno, utilizando solo un núcleo. Aunque sería bueno ejecutarlo en tiempo real en el Raspberry Pi 3. Ahora esto está lejos, pero nada es imposible.

En x86, el motivo de la limitación de rendimiento es cinco veces el máximo teórico. Como sabe, las operaciones de multiplicación de matriz-vector son menos eficientes que las operaciones de matriz-matriz porque hay más descargas por operación, específicamente, una descarga de matriz para cada operación de FMA. Por un lado, el rendimiento está relacionado con el caché L2, que proporciona solo 16 bits por ciclo. Por otro lado, Intel afirma que L2 puede dar hasta 32 bits por ciclo en Broadwell y 64 bits por ciclo en Skylake.

Resultados


Realizamos pruebas de audio al estilo MUSHRA para comparar la calidad de la codificación. Condiciones de prueba:

  • Muestra : original (si obtiene un mejor resultado que el original, claramente hay algo mal con su prueba)
  • 1600 bps LPCNet : nuestra demostración
  • LPNet sin comprimir : "LPNet con 122 unidades equivalentes" del primer artículo
  • Opus 9000 bps de banda ancha : velocidad de bits más baja a la que Opus 1.3 codifica audio de banda ancha
  • MELP a 2400 bps : un codificador de voz conocido con una baja velocidad de bits (similar en calidad al códec2)
  • Speex 4000 bps : este vocoder de banda ancha nunca debe usarse, pero es una buena referencia para el fondo

En la primera prueba (conjunto 1), tenemos ocho fragmentos de declaraciones de dos hombres y dos mujeres. Los archivos del primer conjunto pertenecen a la misma base de datos (es decir, las mismas condiciones de grabación) que se usó para el entrenamiento, pero estas personas específicas fueron excluidas del conjunto de entrenamiento. En la segunda prueba (conjunto 2), utilizamos algunos archivos de la prueba Opus (sin comprimir), grabando sonido en diferentes condiciones, para asegurarnos de que LPCNet vaya a alguna generalización. En ambas pruebas, 100 participantes cada una, por lo que los errores son bastante pequeños. Vea los resultados a continuación.


Calidad subjetiva (MUSHRA) en dos pruebas

En general, LPCNet a 1600 bps se ve bien, mucho mejor que MELP a 2400 bps, y no muy por detrás de Opus a 9000 bps. Al mismo tiempo, LPCNet sin comprimir es ligeramente mejor en calidad que Opus a 9000 bps. Esto significa que es posible proporcionar una mejor calidad que Opus a velocidades de bits en el rango de 2000-6000 bps.

Escuchate a ti mismo


Aquí hay ejemplos de la prueba de audio:

Mujer (set 1)


Hombre (set 1)


Mixto (set 2)



¿Dónde se puede usar esto?


Creemos que esta es una tecnología genial en sí misma, pero también tiene aplicaciones prácticas. Aquí hay algunas opciones.

VoIP en países mal conectados


No todos siempre tienen una conexión de alta velocidad. En algunos países, la comunicación es muy lenta y poco confiable. Un códec de voz de 1600 bits funciona normalmente en tales condiciones, incluso transmitiendo paquetes varias veces para mayor confiabilidad. Por supuesto, debido a la sobrecarga de los encabezados de paquetes (40 bytes para IP + UDP + RTP), es mejor hacer paquetes más grandes: 40, 80 o 120 ms.

Radioaficionado / HF


Durante diez años, David Rowe ha estado trabajando en la codificación de voz para las comunicaciones de radio. Desarrolló Codec2 , que transmite voz a velocidades de 700 a 3200 bps. Durante el año pasado, David y yo discutimos cómo mejorar Codec2 usando síntesis neuronal, y ahora finalmente lo hacemos. En su blog, David escribió sobre su propia implementación del códec basado en LPCNet para la integración con FreeDV .

Mayor confiabilidad en la pérdida de paquetes


La capacidad de codificar un flujo de bits de calidad decente en un pequeño número de bits es útil para proporcionar redundancia en un canal poco confiable. Opus tiene un mecanismo de corrección de errores hacia adelante (FEC) conocido como LBRR, que codifica una trama anterior con una tasa de bits más baja y la envía en la trama actual. Funciona bien, pero agrega una sobrecarga significativa. La duplicación de flujo de 1600 bit / s es mucho más eficiente.

Planes


Hay muchas más posibilidades para usar LPCNet. Por ejemplo, mejorar los códecs existentes (el mismo Opus). Al igual que en otros códecs, la calidad de Opus se degrada rápidamente a velocidades de bits muy bajas (por debajo de 8000 bps), porque el códec de forma de onda no tiene suficientes bits para coincidir con el original. Pero la información de predicción lineal transmitida es suficiente para que LPCNet sintetice un discurso de sonido decente, mejor que Opus puede hacer a esta velocidad de bits. Además, el resto de la información transmitida por Opus (pronóstico residual) ayuda a LPCNet a sintetizar un resultado aún mejor. En cierto sentido, LPCNet se puede usar como un elegante filtro posterior para mejorar la calidad de Opus (o cualquier otro códec) sin cambiar el flujo de bits (es decir, manteniendo la compatibilidad total).

Recursos Adicionales


  1. J.-M. Valin, J. Skoglund, vocoder neural de banda ancha de 1.6 Kbps usando LPCNet , enviado a Interspeech 2019 , arXiv: 1903.12087 .
  2. J.-M. Valin, J. Skoglund, LPCNet: Síntesis avanzada del habla neural a través de la predicción lineal , 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: modelo generativo para sonido no procesado , 2016.
  4. N. Karlhbrenner, E. Elsen, C. Simonyan, S. Nouri, N. Casagrande, E. Lockhart, F. Stimberg, A. van den Oord, S. Dileman, K. Kavukuglu, Síntesis efectiva del sonido neural , 2018.
  5. V.B.Klein, F.S.K. Lim, A.Lyubs, J.Skoglund, F. Stimberg, K. Wang, T.S. Walters, codificación de voz de baja tasa de bits basada en Wavenet , 2018
  6. El código fuente de LPCNet.
  7. Códec para FreeDV basado en LPCNet de David Rowe.
  8. Únase a la discusión sobre desarrollo en #opus en irc.freenode.net (→ interfaz web )

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


All Articles