Codificação de fala de 1600 bits / s com vocoder neural LPCNet



Esta é uma continuação do primeiro artigo sobre LPCNet . Na primeira demonstração, apresentamos uma arquitetura que combina processamento de sinais e aprendizado profundo para aprimorar a eficácia da síntese da fala neural. Desta vez, transformaremos o LPCNet em um codec de fala neural com uma taxa de bits muito baixa (consulte o artigo científico ). Pode ser usado em equipamentos atuais e até em telefones.

Pela primeira vez, um vocoder neural funciona em tempo real no núcleo de um processador do telefone, e não em uma GPU de alta velocidade. A taxa de bits final de 1600 bps é cerca de dez vezes menor que a dos codecs de banda larga comuns. A qualidade é muito melhor que os vocoders existentes com uma taxa de bits muito baixa e comparável aos codecs mais tradicionais que usam uma taxa de bits mais alta.

Codificadores e codificadores de forma de onda


Existem dois grandes tipos de codecs de fala: codificadores de forma de onda e codificadores de voz. Os codificadores de forma de onda incluem Opus, AMR / AMR-WB e todos os codecs que podem ser usados ​​para música. Eles tentam fornecer uma forma de onda decodificada o mais próximo possível do original - geralmente levando em consideração algumas características perceptivas. Os vocodificadores, por outro lado, são realmente sintetizadores. O codificador extrai informações sobre o tom e a forma do caminho da fala, passa essas informações para o decodificador e ele re-sintetiza a fala. É quase como o reconhecimento de fala seguido pela leitura de texto em um sintetizador de voz, exceto que o codificador de texto é muito mais simples / rápido que o reconhecimento de fala (e transmite um pouco mais de informação).

Os vocodificadores existem desde os anos 70, mas como seus decodificadores realizam síntese de fala, eles não podem ser muito melhores que os sistemas convencionais de síntese de fala, que até recentemente pareciam simplesmente terríveis. É por isso que os vocoders eram normalmente usados ​​em velocidades abaixo de 3 kB / s. Além disso, os codificadores de forma de onda simplesmente oferecem a melhor qualidade. Isso continuou até recentemente, quando surgiram sistemas de síntese de fala neural como o WaveNet . De repente, a síntese começou a soar muito melhor e, é claro, havia pessoas que queriam criar um vocoder da WaveNet .

Visão geral do LPCNet


WaveNet produz discurso de alta qualidade, mas requer centenas de gigaflops de poder computacional. A LPCNet reduziu significativamente a complexidade computacional. O vocoder é baseado no WaveRNN, que melhora o WaveNet usando uma rede neural recorrente (RNN) e matrizes esparsas. O LPCNet aprimora ainda mais o WaveRNN com previsão linear (LPC), que teve bom desempenho em vocoders mais antigos. Ele prevê uma amostra a partir de uma combinação linear de amostras anteriores e, mais importante, a torna muitas vezes mais rápida que uma rede neural. Obviamente, não é universal (caso contrário, os profissionais dos anos 70 soariam ótimos), mas podem reduzir seriamente a carga na rede neural. Isso permite que você use uma rede menor que o WaveRNN sem sacrificar a qualidade.


Vamos dar uma olhada mais de perto na LPCNet. A parte amarela à esquerda é calculada uma vez por quadro e sua saída é usada para a frequência de amostragem de rede à direita (azul). A unidade de computação prevê uma amostra no tempo t com base em amostras anteriores e coeficientes de previsão linear

Características de compressão


O LPCNet sintetiza a fala de vetores de 20 caracteres por quadro por 10 ms. Destes, 18 sinais são coeficientes cepstrais que representam a forma do espectro. Os dois restantes descrevem a altura: um parâmetro para o período do arremesso (período do arremesso) e o outro para a força (quanto o sinal se correlaciona consigo mesmo, se você introduzir um atraso no arremesso). Se você armazenar os parâmetros na forma de valores de ponto flutuante, todas essas informações levarão até 64 kbit / s durante o armazenamento ou a transmissão. Isso é demais, porque mesmo o codec Opus fornece codificação de voz de alta qualidade a apenas 16 kbit / s (para 16 kHz mono). Obviamente, você precisa aplicar forte compactação aqui.

Altura


Todos os codecs dependem muito da afinação, mas, diferentemente dos codificadores de forma de onda, onde a afinação "justa" ajuda a reduzir a redundância, os vocodificadores não têm recurso. Se você escolher a altura errada, eles começarão a gerar um discurso de som fraco (ou até ilegível). Sem entrar em detalhes (consulte o artigo científico), o codificador LPCNet está lutando para não cometer um erro de altura. A busca começa com uma busca por correlações de tempo em um sinal de fala. Veja abaixo como uma pesquisa típica funciona.


O tom é o período durante o qual o tom é repetido. A animação procura a etapa que corresponde à correlação máxima entre o sinal x (n) e sua cópia x (nT) com um atraso. O valor T com correlação máxima é um passo de altura

Esta informação precisa ser codificada com o mínimo de bits possível, sem degradar muito o resultado. Como percebemos a frequência por natureza em uma escala logarítmica (por exemplo, cada oitava musical dobra a frequência anterior), faz sentido na codificação logarítmica. A altura do sinal de fala na maioria das pessoas (não estamos tentando cobrir o soprano aqui) está entre 62,5 e 500 Hz. Com sete bits (128 valores possíveis), obtemos uma resolução de cerca de um quarto de tom (a diferença entre e antes e re é um tom).

Então, com a altura terminada? Bem, não tão rápido. As pessoas não falam como robôs dos filmes dos anos 1960. O tom da voz pode variar mesmo dentro de um pacote de 40 milissegundos. Você precisa levar isso em consideração, deixando os bits do parâmetro para alterar a altura: 3 bits para codificar a diferença de até 2,5 semitons entre o início e o final do pacote. Por fim, você precisa codificar a correlação das etapas de afinação, distinguindo entre vogais e consoantes (por exemplo, se ef). Dois bits são suficientes para correlação.

Cepstrum


Enquanto o tom contém as características externas da fala (prosódia, emoção, ênfase, ...), a característica espectral determina o que foi dito (exceto para idiomas tonais como o chinês, onde o tom é importante para o significado). As cordas vocais produzem aproximadamente o mesmo som para qualquer vogal, mas a forma do aparelho vocal determina qual som será falado. O caminho da voz atua como um filtro, e a tarefa do codificador é avaliar esse filtro e passá-lo ao decodificador. Isso pode ser feito efetivamente se você converter o espectro em um ceptro (sim, este é um "espectro" com uma ordem alterada de letras, somos pessoas engraçadas no processamento de sinais digitais).

Para um sinal de entrada a 16 kHz, o cepstrum representa basicamente um vetor de 18 números a cada 10 ms, que precisa ser comprimido o máximo possível. Como temos quatro vetores em um pacote de 40 ms e geralmente são semelhantes entre si, queremos eliminar a redundância o máximo possível. Isso pode ser feito usando vetores vizinhos como preditores e transmitindo apenas a diferença entre a previsão e o valor real. Ao mesmo tempo, não queremos depender muito dos pacotes anteriores se um deles desaparecer. Parece que o problema já foi resolvido ...

Se você só tem um martelo, tudo parece um prego - Abraham Maslow.

Se você trabalhou muito com codecs de vídeo , provavelmente encontrou o conceito de quadros B. Ao contrário dos codecs de vídeo, que dividem um quadro em muitos pacotes, nós, pelo contrário, temos muitos quadros em um pacote. Começamos codificando o quadro-chave , ou seja, o vetor independente e o final do pacote. Este vetor é codificado sem predição, ocupando 37 bits: 7 para energia total (primeiro coeficiente cepstral) e 30 bits para outros parâmetros usando quantização vetorial (VQ). Depois vêm os quadros B (hierárquicos). Das duas palavras-chave (uma do pacote atual e outra da anterior), é previsto um cepstrum entre elas. Como um preditor para codificar a diferença entre o valor real e a previsão, você pode escolher entre dois quadros-chave ou seu valor médio. Utilizamos o VQ novamente e codificamos esse vetor usando um total de 13 bits, incluindo a escolha do preditor. Agora, temos apenas dois vetores restantes e muito poucos bits. Use os últimos 3 bits para simplesmente selecionar o preditor para os vetores restantes. Obviamente, tudo isso é muito mais fácil de entender na figura:


Previsão e quantização de cepstrum para o pacote k. Os vetores verdes são quantizados de forma independente, os vetores azuis são previstos e os vetores vermelhos usam previsão sem quantização residual. A previsão é mostrada por setas.

Juntando tudo


Adicionando tudo isso, obtemos 64 bits por pacote de 40 milissegundos ou 1600 bits por segundo. Se você deseja calcular a taxa de compactação, a fala em banda larga não compactada é de 256 kbps (16 kHz a 16 bits por amostra), o que significa uma taxa de compactação de 160 vezes! Obviamente, você sempre pode jogar com quantizadores e obter uma taxa de bits mais alta ou mais baixa (com um efeito correspondente na qualidade), mas precisa começar em algum lugar. Aqui está uma tabela com o layout para onde esses bits vão.

Alocação de bits
ParâmetroBit
Pitch pitch6
Modulação em altura3
Correlação de altitude2
Energia7
Cepstrum independente VQ (40 ms)30
Cepstrum VQ previsto (20 ms)13
Interpolação do ceptro (10 ms)3
Total64

A 64 bits por pacote de 40 ms, a 25 pacotes por segundo, são obtidos 1600 bps.

Implementação


O código-fonte LPCNet está disponível sob a licença BSD. Inclui uma biblioteca que simplifica o uso do codec. Observe que o desenvolvimento não está concluído: o formato e a API estão sujeitos a alterações. O repositório também possui um aplicativo de demonstração lpcnet_demo no qual é fácil testar o codec na linha de comando. Consulte o arquivo README.md para obter instruções completas.

Quem quer se aprofundar, há uma opção para treinar novos modelos e / ou usar o LPCNet como um componente básico para outras aplicações, como síntese de fala (o LPCNet é apenas um componente do sintetizador, ele não realiza a síntese por si só).

Desempenho


A síntese da fala neural requer muitos recursos. Na conferência do ICASSP do ano passado, Bastian Klein e colegas do Google / DeepMind apresentaram um codec de 2400 bps baseado no WaveNet , recebendo um fluxo de bits do codec2. Embora pareça incrível, a complexidade computacional de centenas de gigaflops significa que ele não pode ser iniciado em tempo real sem uma GPU cara e um esforço sério.

Pelo contrário, nosso codec de 1600 bits / s produz apenas 3 gigaflops e foi projetado para funcionar em tempo real em equipamentos muito mais acessíveis. De fato, ele pode ser usado hoje em aplicações reais. A otimização exigiu a gravação de algum código para os conjuntos de instruções AVX2 / FMA e Neon (somente código incorporado, sem assembler). Graças a isso, agora podemos codificar (e principalmente decodificar) a fala em tempo real, não apenas em um PC, mas também em telefones mais ou menos modernos. Abaixo está o desempenho nos processadores x86 e ARM.

Desempenho
CPUFrequência% de um núcleoPara tempo real
AMD 2990WX (raspador de rosca)3,0 GHz *14%7.0x
Intel Xeon E5-2640 v4 (Broadwell)2,4 GHz *20%5.0x
Snapdragon 855 (Cortex-A76 no Galaxy S10 )2,82 GHz31%3,2x
Snapdragon 845 (Cortex-A75 no Pixel 3 )2,5 GHz68%1,47x
AMD A1100 (Cortex-A57)1,7 GHz102%0,98x
BCM2837 (Cortex-A53 em Raspberry Pi 3)1.2 GHz310%0,32x
* modo turbo


Os números são bem interessantes. Embora apenas Broadwell e Threadripper sejam mostrados, na plataforma x86, os processadores Haswell e Skylake têm desempenho semelhante (levando em consideração a frequência do relógio). No entanto, os processadores ARM são visivelmente diferentes um do outro. Mesmo levando em consideração a diferença na frequência A76 é cinco a seis vezes mais rápida que a A53: é bastante esperado, uma vez que a A53 é usada principalmente para eficiência energética (por exemplo, em grandes sistemas LITTLE). No entanto, a LPCNet pode funcionar em tempo real em um telefone moderno, usando apenas um núcleo. Embora seja bom executá-lo em tempo real no Raspberry Pi 3. Agora isso é longe, mas nada é impossível.

No x86, o motivo da limitação de desempenho é cinco vezes o máximo teórico. Como você sabe, as operações de multiplicação de vetores de matriz são menos eficientes do que as operações de matriz de matriz, porque há mais downloads por operação - especificamente, um download de matriz para cada operação de FMA. Por um lado, o desempenho está relacionado ao cache L2, que fornece apenas 16 bits por ciclo. Por outro lado, a Intel alega que o L2 pode fornecer até 32 bits por ciclo no Broadwell e 64 bits por ciclo no Skylake.

Resultados


Realizamos testes de áudio no estilo MUSHRA para comparar a qualidade da codificação. Condições de teste:

  • Amostra : original (se você obtiver um resultado melhor que o original, há claramente algo errado com seu teste)
  • LPCNet de 1600 bps : nossa demonstração
  • LPNet não compactado : "LPNet com 122 unidades equivalentes" do primeiro artigo
  • Banda larga do Opus 9000 bps : taxa de bits mais baixa na qual o Opus 1.3 codifica áudio de banda larga
  • MELP a 2400 bps : um vocoder bem conhecido com uma taxa de bits baixa (qualidade semelhante ao codec2)
  • Speex 4000 bps : este vocoder de banda larga nunca deve ser usado, mas é uma boa referência para a parte inferior

No primeiro teste (conjunto 1), temos oito fragmentos de fala de dois homens e duas mulheres. Os arquivos no primeiro conjunto pertencem ao mesmo banco de dados (ou seja, as mesmas condições de gravação) usado para o treinamento, mas essas pessoas específicas foram excluídas do conjunto de treinamento. No segundo teste (conjunto 2), usamos alguns arquivos do teste Opus (não compactado), gravando o som sob diferentes condições, para garantir que o LPCNet seja generalizado. Nos dois testes, 100 participantes cada, portanto, os erros são bem pequenos. Veja os resultados abaixo.


Qualidade subjetiva (MUSHRA) em dois testes

Em geral, a LPCNet a 1600 bps parece boa - muito melhor que a MELP a 2400 bps e não muito atrás do Opus, a 9000 bps. Ao mesmo tempo, a LPCNet não compactada é um pouco melhor em qualidade do que o Opus a 9000 bps. Isso significa que é possível fornecer melhor qualidade do que o Opus em taxas de bits na faixa de 2000-6000 bps.

Ouça a si mesmo


Aqui estão exemplos do teste de áudio:

Mulher (conjunto 1)


Homem (conjunto 1)


Misto (conjunto 2)



Onde isso pode ser usado?


Acreditamos que esta é uma tecnologia interessante por si só, mas também tem aplicações práticas. Aqui estão apenas algumas opções.

VoIP em países mal conectados


Nem todo mundo sempre tem uma conexão de alta velocidade. Em alguns países, a comunicação é muito lenta e não confiável. Um codec de fala de 1600 bits funciona normalmente nessas condições, transmitindo pacotes várias vezes para garantir a confiabilidade. Obviamente, devido à sobrecarga dos cabeçalhos de pacotes (40 bytes para IP + UDP + RTP), é melhor criar pacotes maiores: 40, 80 ou 120 ms.

Rádio amador / HF


Há dez anos, David Rowe trabalha na codificação de voz para comunicações de rádio. Ele desenvolveu o Codec2 , que transmite voz em velocidades de 700 a 3200 bps. No ano passado, David e eu discutimos como melhorar o Codec2 usando a síntese neural, e agora finalmente o fazemos. Em seu blog, David escreveu sobre sua própria implementação do codec baseado em LPCNet para integração com o FreeDV .

Maior confiabilidade na perda de pacotes


A capacidade de codificar um fluxo de bits de qualidade decente em um pequeno número de bits é útil para fornecer redundância em um canal não confiável. O Opus possui um mecanismo de correção direta de erros (FEC), conhecido como LBRR, que codifica um quadro anterior com uma taxa de bits mais baixa e o envia no quadro atual. Funciona bem, mas adiciona uma sobrecarga significativa. A duplicação de fluxo de 1600 bits / s é muito mais eficiente.

Planos


Existem muito mais possibilidades de usar o LPCNet. Por exemplo, melhorando os codecs existentes (o mesmo Opus). Como em outros codecs, a qualidade do Opus diminui rapidamente em taxas de bits muito baixas (abaixo de 8000 bps), porque o codec de forma de onda não possui bits suficientes para corresponder ao original. Mas as informações de previsão linear transmitida são suficientes para que o LPCNet sintetize a fala com som decente - melhor do que o Opus pode fazer com essa taxa de bits. Além disso, o restante das informações transmitidas pelo Opus (previsão residual) ajuda a LPCNet a sintetizar um resultado ainda melhor. Em certo sentido, o LPCNet pode ser usado como um pós-filtro sofisticado para melhorar a qualidade do Opus (ou qualquer outro codec) sem alterar o fluxo de bits (ou seja, mantendo a compatibilidade total).

Recursos Adicionais


  1. J.-M. Valin, J. Skoglund, vocoder neural de banda larga de 1,6 Kbps usando LPCNet , Enviado para 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. O objetivo deste trabalho foi avaliar o desempenho de um sistema de som em um sistema de som de alta qualidade, com o objetivo de avaliar o desempenho de um som de alta qualidade .
  4. No entanto, é importante ressaltar que, apesar de ser um produto de alta qualidade, o produto pode apresentar pequenas variações na tonalidade e no tamanho da estampa.
  5. Os dados foram analisados ​​por meio de entrevistas semi-estruturadas e entrevistas semi-estruturadas, com o objetivo de avaliar o desempenho dos participantes .
  6. O código fonte do LPCNet.
  7. Codec para FreeDV baseado em LPCNet por David Rowe.
  8. Participe da discussão sobre desenvolvimento no #opus em irc.freenode.net (→ interface da web )

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


All Articles