TECH 으로 돌아가기
TECH HACKER NEWS 오늘 8분 읽기 23 READS

ESP32-S3에서 실시간으로 도는 뉴럴 앰프 모델러, coyopedal이 보여준 것

ESP32-S3에서 실시간으로 도는 뉴럴 앰프 모델러, coyopedal이 보여준 것
SOURCE IMAGE · HACKER NEWS

기타 앰프 시뮬레이션 세계에서 뉴럴 앰프 모델러(NAM)는 이미 하나의 표준으로 자리를 잡았다. 실제 앰프의 소리를 신경망으로 학습해 재현하는 이 방식은 그동안 노트북이나 전용 DSP 장비의 몫이었다. coyopedal은 그 연산을 8달러대 마이크로컨트롤러 계열인 ESP32-S3 위에서 직접 돌린다는 점에서 눈길을 끄는 오픈소스 프로젝트다. Waveshare의 ESP32-S3-Touch-AMOLED-2.06 보드를 기준 하드웨어로 삼아, 풀사이즈 NAM A2 캡처를 실시간으로 실행하고, 클래스 컴플라이언트 USB 오디오 인터페이스를 USB 호스트로 구동하며, 터치스크린 UI까지 갖춘 독립형 이펙터로 동작한다.

자바스크립트 없는 TSX UI

이 프로젝트에서 실무자가 주목할 만한 대목은 UI 구현 방식이다. 화면 인터페이스는 TSX로 작성되지만 기기 위에서 자바스크립트 엔진이 도는 것이 아니다. geatsc라는 도구가 같은 TSX를 네이티브 C++로 낮춰(lower) 컴파일하고, 이를 펌웨어의 Gea 레이아웃·페인트 엔진과 링크한다. 덕분에 임베디드 환경에서도 선언적 UI를 쓰면서 런타임 오버헤드는 피한다. 흥미롭게도 동일한 TSX와 DSP, 신경망 모델을 WebAssembly로 컴파일해 브라우저에서도 그대로 돌릴 수 있다. 보드가 없어도 오디오 인터페이스만 있으면 웹페이지에서 실제 기타 신호를 통과시켜 소리를 확인할 수 있고, 화면이 보여주는 것이 곧 실제 패널이 보여주는 것과 같다. 코드 한 벌로 임베디드 기기, 웹 프리뷰, 실제 배포 페이지를 모두 커버하는 구조인 셈이다.

화면은 옵션, 핵심은 연산

coyopedal의 설계 철학에서 더 근본적인 부분은 화면이 필수가 아니라는 점이다. AMOLED 보드는 어디까지나 레퍼런스일 뿐, 같은 펌웨어가 패널이 전혀 없는 맨 ESP32-S3 모듈용으로도 빌드된다. 이때 앰프, 이펙트, 프리셋은 동일하고 BOOT 버튼이 풋스위치 역할을 대신한다. 펌웨어는 보드 목록을 들고 다니지 않는다. 대신 타깃 정의(target definition)에 하드웨어가 무엇을 갖췄는지 물어보고, 없는 것은 컴파일 단계에서 제거한다. 디스플레이도 캔버스도 없으면 프레임버퍼·프레임 스케줄러·런타임 태스크가 통째로 빠지면서 이미지 약 1MB와 PSRAM 약 1.25MB를 절약한다. 전원 관리 칩(PMIC)이 선언되지 않으면 전원 드라이버는 링크 실패 대신 no-op로 컴파일된다. 하드웨어 변형을 조건부 컴파일로 흡수하는 이 방식은 다양한 보드를 지원해야 하는 임베디드 프로젝트가 참고할 만한 패턴이다.

실시간 성능도 구체적인 수치로 제시된다. 화면 없는 보드에서 48kHz로 같은 DSP를 돌렸을 때, 개발보드 측정 기준으로 두 코어에 걸쳐 1,333µs 블록 예산의 91%와 94%를 사용했고 마감을 놓친 경우는 없었다. 여유가 크지 않다는 점은 분명하지만, A2-Full 모델을 마이크로컨트롤러급 칩에서 실시간으로 돌린다는 사실 자체가 이 예산 안에서 성립한다는 뜻이다. 어떤 보드든 공통으로 요구되는 것은 두 가지다. A2 모델이 상주할 8MB PSRAM을 갖춘 ESP32-S3, 그리고 칩이 호스트로 구동할 수 있는 USB 포트다. 다만 맨 모듈에는 PMIC와 배터리 경로가 없어 호스트 포트에 자체 전원을 공급하지 못하므로, 오디오 인터페이스는 별도 전원이 필요하다.

캡처 로딩과 실사용의 세부

실제 운용 측면에서 눈에 띄는 것은 SD 카드에서 NAM 모델을 직접 불러오는 흐름이다. 카드를 FAT로 포맷하고 루트의 nam 폴더 아래 어디든(최대 6단계 깊이) .nam 또는 .namb 파일을 넣으면, 앰프 브라우저가 그 폴더 트리를 그대로 보여준다. 파일명은 127바이트, 파일 크기는 2MiB, 지원 모델은 48kHz·8채널 NAM A2 WaveNet으로 제한되며 다른 아키텍처나 샘플레이트는 오류로 거부된다. 캡처를 처음 선택하면 준비 과정 때문에 오디오가 수십 초간 멈추지만, 카드에 쓰기가 가능하면 검증된 .s3cache 파일을 원본 옆에 저장해 다음 로딩부터는 빨라진다. 원본은 절대 수정되지 않는다. 브라우저 데모 사이트는 카드 슬롯이 없어 대신 로컬 폴더를 지정받아 펌웨어의 SD 호출에 응답하는데, Chrome·Edge는 폴더에 쓰기가 되지만 Safari·Firefox는 읽기만 허용해 쓰기가 브라우저 저장소에 남는다는 제약도 솔직하게 밝히고 있다.

한계도 분명히 인식할 필요가 있다. 유지보수 모드, OTA 업데이트, 원격 도구는 Wi-Fi 자격증명과 인증 토큰을 담은 remote_config.h 파일이 있을 때만 이미지에 컴파일된다. 이 파일은 자격증명을 담고 있어 gitignore 처리되므로, 저장소를 그냥 클론하면 무선 기능이 아예 없는 펌웨어가 만들어진다. 첫 플래시는 파티션 테이블과 팩토리 데이터까지 기록하므로 반드시 USB로 진행해야 한다. 빌드·배포 체계는 ESP-IDF 6.0.2, Gea CLI, GitHub Actions, Cloudflare R2를 아우르는 다소 촘촘한 구성이어서, 단순히 취미로 하나 만들어 보기에는 진입 장벽이 낮지 않다. 프로젝트는 GPL v3 라이선스이며, VoLum의 캡처 두 개(MIT)가 기본 탑재된다.

그럼에도 coyopedal이 던지는 메시지는 명확하다. 값비싼 전용 하드웨어의 영역으로 여겨지던 뉴럴 앰프 연산이, 적절한 소프트웨어 설계와 조건부 컴파일 전략을 만나면 저가 마이크로컨트롤러에서도 실시간으로 성립한다는 것이다. 하나의 TSX 코드베이스가 네이티브 펌웨어와 웹 양쪽으로 컴파일되고, 화면 유무에 따라 같은 소스가 서로 다른 하드웨어로 확장되는 구조는 오디오 DSP를 넘어 임베디드 제품을 다루는 개발자들에게도 시사점을 준다. 기성품을 사는 대신 직접 만들고 뜯어볼 수 있는 오픈소스 이펙터라는 점에서, 기술적 호기심과 실용성을 동시에 자극하는 사례다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/dashersw/coyopedal
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...