2 pontos por kdrkdrkdr 7 시간 전 | Ainda não há comentários. | Compartilhar no WhatsApp

Projeto que eu mesmo criei.

  • É uma biblioteca que reimplementa em C puro o runtime do FastEnhancer-Medium (modelo de aprimoramento de voz em streaming a 48 kHz)
  • Modelo original: https://github.com/aask1357/fastenhancer (Ahn et al., 2025)
  • Usa diretamente os pesos de 48 kHz que o repositório original disponibilizou adicionalmente após o artigo (16 kHz). Sem retreinamento, fine-tuning ou calibration set
  • O modelo e os pesos pertencem aos autores originais; a otimização foi feita no runtime

■ Desempenho

  • Em um único núcleo do Apple M2, o real-time factor é 0,069. Na mesma máquina, rodar o mesmo grafo com ONNX Runtime dá 0,230, portanto é 3,3× mais rápido
  • No Galaxy S23+ (Snapdragon 8 Gen 2), é 0,096
  • A degradação de qualidade é quase inexistente. Em 824 falas do VoiceBank-DEMAND, fica em apenas -0,006 PESQ em relação ao modelo fp32. Não é um nível distinguível ao ouvir

■ Otimizações aplicadas

Não foi uma única técnica que gerou 3×; várias camadas foram ajustadas individualmente.

  • Quantização: o intervalo dos valores de ativação é recalculado a cada frame. Por isso, não é necessário ajustar nem distribuir um calibration set, e não quebra mesmo quando a distribuição de entrada muda
  • Convolução: aplica Winograd F(2,3) a conv com k=3 e incorpora o epílogo seguinte (dequant + bias + SiLU + escrita fp16) no mesmo passe, eliminando buffers intermediários
  • Recorrência: o GRU foi completamente fundido em um único kernel por tier. Multiplicação de matrizes do lado da entrada, multiplicação do lado oculto, as três portas r/z/n e atualização do hidden terminam em um único kernel, evitando que o acumulador int32 vaze para a memória
  • Atenção: o softmax recebe e processa diretamente os scores int32. Como a matriz de scores fp32 nem é criada, esse tráfego de ida e volta à memória desaparece
  • Memória: estados cross-stage (GRU hidden, encoder skip) são mantidos em fp16, reduzindo pela metade a largura de banda entre frames
  • Kernels: seis kernels int8 GEMM específicos por ISA foram escritos manualmente e selecionados automaticamente na inicialização (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
  • A lista restante de otimizações pode ser conferida no GitHub do projeto

■ Estabilidade em tempo real

  • A validação não ficou em apenas um benchmark de 37 segundos; rodei continuamente por 30 minutos no período real de callback de áudio
  • O M2 permaneceu dentro do orçamento de frame durante todos os 30 minutos (p99 0,56)

■ Outros

  • Zero dependências externas. Compila com cmake + make, e a biblioteca estática tem 162 KiB
  • A API pública tem 4 funções (fe_init / fe_run / fe_reset / fe_free)
  • Blob de pesos de 565 KB, 511.754 parâmetros
  • Licença MIT

Ainda não há comentários.

Ainda não há comentários.