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.