Show GN: faster-enhancer.c – 안정적인 온디바이스 실시간 음성 잡음제거 C 라이브러리
요약
FastEnhancer-Medium 모델의 런타임을 순수 C로 재구현하여 온디바이스 실시간 음성 잡음 제거 성능을 극대화한 라이브러리입니다. Apple M2 및 Snapdragon 8 Gen 2 환경에서 ONNX Runtime 대비 최대 3.3배 빠른 속도를 보여줍니다.
핵심 포인트
- 순수 C 구현을 통해 외부 의존성 없이 162 KiB의 가벼운 정적 라이브러리 제공
- 양자화, 커널 융합, Winograd 알고리즘 등을 적용하여 연산 효율 극대화
- ARM NEON 및 x86 AVX 시리즈를 지원하는 6종의 맞춤형 int8 GEMM 커널 탑재
- Apple M2 기준 ONNX Runtime 대비 3.3배 빠른 실시간 처리 성능 달성
- fp16 메모리 관리 및 int32 기반 Softmax 처리로 메모리 대역폭 최적화
직접 만든 프로젝트임.
- FastEnhancer-Medium(48 kHz 스트리밍 음성향상 모델)의 런타임을 순수 C로 다시 구현한 라이브러리임
- 원본 모델: https://github.com/aask1357/fastenhancer (Ahn 외, 2025)
- 원본 레포가 논문(16 kHz) 이후 추가로 공개한 48 kHz 가중치를 그대로 사용함. 재학습·파인튜닝·calibration set 없음
- 모델과 가중치는 원저자 것이고, 최적화한 것은 런타임 쪽임
■ 성능
- Apple M2 코어 1개에서 real-time factor 0.069 나옴. 같은 기계에서 동일 그래프를 ONNX Runtime으로 돌리면 0.230이므로 3.3배임
- Galaxy S23+(Snapdragon 8 Gen 2)에서 0.096임
- 품질 저하는 거의 없음. VoiceBank-DEMAND 824개 발화에서 fp32 모델 대비 -0.006 PESQ에 그침. 들어서 구분할 수 있는 수준이 아님
■ 적용된 최적화
한 가지 기법으로 3배가 나온 게 아니라 여러 층을 각각 손봤음.
- 양자화: 활성값 범위를 매 프레임 다시 계산함. 그래서 calibration set을 맞추거나 함께 배포할 필요가 아예 없고, 입력 분포가 달라져도 안 깨짐
- 합성곱: k=3 conv에 Winograd F(2,3)를 적용하고, 뒤따르는 에필로그(dequant + bias + SiLU + fp16 write)까지 같은 패스에 접어 넣어 중간 버퍼를 없앰
- 재귀: GRU를 티어당 커널 하나로 완전히 융합함. 입력측 행렬곱, 은닉측 행렬곱, r/z/n 세 게이트, hidden 갱신까지 한 커널에서 끝내서 int32 누산기가 메모리로 새지 않음
- 어텐션: softmax가 int32 점수를 그대로 받아 처리함. fp32 점수 행렬을 아예 만들지 않아서 그만큼의 메모리 왕복이 사라짐
- 메모리: cross-stage 상태(GRU hidden, encoder skip)를 fp16으로 보관해 프레임 간 대역폭을 절반으로 줄임
- 커널: ISA별로 int8 GEMM 커널 6종을 직접 작성하고 초기화 때 자동 선택함 (ARM NEON/DOTPROD/I8MM, x86 AVX2/AVX-VNNI/AVX-512)
- 나머지 최적화 리스트는 프로젝트 Github에서 확인할 수 있음
■ 실시간 안정성
- 37초짜리 벤치마크 한 번으로 끝내지 않고, 실제 오디오 콜백 주기로 30분 연속 돌려서 확인했음
- M2는 30분 내내 프레임 예산 안에 머물렀음 (p99 0.56)
■ 기타
- 외부 의존성 0. cmake + make로 빌드되고 정적 라이브러리는 162 KiB임
- 공개 API는 함수 4개임 (fe_init / fe_run / fe_reset / fe_free)
- 가중치 blob 565 KB, 파라미터 511,754개
- MIT 라이선스
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기