나만의 자비스 만들기 1편 — ESP32-S3에 귀를 달자

나만의 자비스 만들기 1편 — ESP32-S3에 귀를 달자

Wake Word 감지부터 음성 녹음까지. 자비스의 첫 번째 감각을 만드는 과정
📅 2026년 5월 24일 ✍️ Bongjoo ESP32 JARVIS 음성인식 IoT DIY

자비스 프로젝트 소개

아이언맨의 자비스(JARVIS)처럼 말만 하면 알아듣고 대답해주는 비서. 이 시리즈에서는 ₩27,450짜리 ESP32-S3 3.5인치 터치 모듈과 자체 AI 서버(Hermes)를 연동해 실제 작동하는 음성 비서를 만듭니다. 3편에 걸쳐 다룹니다.

ESP32 음성 비서
ESP32 기반 음성 비서 — 마이크에서 입력해 AI가 답변
음성 비서 아키텍처
Edge-Cloud 하이브리드 아키텍처

전체 아키텍처

자비스의 동작 흐름은 5단계입니다:

  1. Wake Word 감지 — "Hey Jarvis!"라고 부르면 (오프라인, ESP32 내부 처리)
  2. 음성 녹음 — 마이크로 말을 녹음 (VAD로 자동 끝점 감지)
  3. 서버 전송 + STT — 녹음한 오디오를 WiFi로 서버에 전송 → 텍스트 변환
  4. LLM 응답 생성 — 변환된 텍스트를 AI 서버(Hermes)가 처리
  5. TTS + 재생 — 응답을 음성으로 합성해 ESP32 스피커로 재생

이번 1편에서는 1~2단계를 다룹니다. 즉, ESP32에 귀(마이크)를 달고, 이름을 불렀을 때 반응하게 만드는 것까지.

필요 부품

부품모델가격역할
메인보드JC3248W535C (ESP32-S3)₩27,450두뇌 + 화면 + WiFi
마이크INMP441 (I2S 디지털)₩3,000음성 입력
스피커 앰프MAX98357A (I2S Class-D)₩3,500음성 출력
스피커3~8Ω, 3W 이상₩2,000소리 출력
점퍼 와이어여성-여성, 여성-수커₩2,000배선

총비용: 약 ₩38,000 (메인보드 포함)

하드웨어 배선

I2S 마이크 배선
ESP32-S3 + INMP441 마이크 + MAX98357A 스피커 연결도

INMP441 마이크 연결 (I2S 입력)

INMP441ESP32-S3설명
VDD3.3V5V 절대 금지!
GNDGND공통 접지
SD (Data)GPIO42I2S 데이터 입력
WS (Word Select)GPIO41채널 선택 (L/R)
SCK (Clock)GPIO40I2S 클럭 (공유 가능)
L/RGND좌측 채널 사용

💡 중요: INMP441은 3.3V 전용입니다. 5V를 연결하면 즉시 파손됩니다.

MAX98357A 스피커 연결 (I2S 출력)

MAX98357AESP32-S3설명
VIN5V전원 (USB 5V 경유)
GNDGND공통 접지
DIN (Data)GPIO43I2S 데이터 출력
BCLK (Clock)GPIO40마이크와 클럭 공유
LRC (Word Select)GPIO41마이크와 WS 공유
SD_MODE풀업 or 개방양채널 믹싱 모드
SPK+ / SPK-스피커3~8Ω 스피커 연결

💡 마이크와 스피커가 BCLK와 LRC를 공유합니다. 이렇게 하면 I2S 포트 하나로 입출력을 모두 처리할 수 있습니다. 단, 동시에 사용하면 에코가 발생하므로 VAD(음성 활동 감지)로 교차 제어해야 합니다.

ESP-SKAINET으로 Wake Word 설정

Espressif에서 제공하는 ESP-SKAINET은 ESP32 전용 음성 비서 프레임워크입니다. Wake Word 감지, 음성 명령 인식, 오디오 프론트엔드(AEC, NS, VAD)를 하나의 패키지로 제공합니다.

ESP-SKAINET
ESP-SKAINET — Espressif의 오픈소스 음성 비서 프레임워크

설치 및 빌드

# 1. ESP-IDF 환경 준비 (Linux)
mkdir -p ~/esp && cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh esp32s3
source export.sh

# 2. ESP-SKAINET 클론
cd ~/esp
git clone --recursive https://github.com/espressif/esp-skainet.git
cd esp-skainet

# 3. Wake Word 감지 예제 빌드
cd examples/wake_word_detection
idf.py set-target esp32s3
idf.py menuconfig
idf.py -p /dev/ttyUSB0 flash monitor

Menuconfig 설정

# Audio Settings → Audio Sample Rate: 16000 Hz
# Audio Settings → Audio Bit Depth: 16 bit
# WakeNet Model → "Hi ESP" (기본) 또는 커스텀 워드
# Board → Custom board (JC3248W535C)

Wake Word 커스터마이징

기본 Wake Word는 "Hi ESP" 또는 "Hi Lexin"입니다. 한국어 워드(예: "허미스")를 원하면 두 가지 방법이 있습니다:

실무적으로는 "Hey Jarvis"를 사용하는 것을 추천합니다. 영어 워드는 WakeNet9이 이미 학습된 상태이며, 인식률 95% 이상을 보장합니다.

I2S 마이크 음성 녹음 코드

Wake Word가 감지되면 I2S 마이크로 음성을 녹음합니다. ESP-IDF 기준 코드:

#include <driver/i2s.h>

#define SAMPLE_RATE       16000
#define BITS_PER_SAMPLE   16
#define CHANNEL_NUM       1
#define RECORD_BUFFER_SIZE 1024

static i2s_config_t i2s_config = {
    .mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate = SAMPLE_RATE,
    .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = I2S_COMM_FORMAT_STAND_I2S,
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
    .dma_buf_count = 8,
    .dma_buf_len = 1024,
    .use_apll = false,
    .tx_desc_auto_clear = false,
    .fixed_mclk = 0
};

static i2s_pin_config_t pin_config = {
    .bck_io_num = 40,   // I2S Clock (공유)
    .ws_io_num = 41,    // Word Select (공유)
    .data_out_num = 43, // Speaker (MAX98357A)
    .data_in_num = 42   // Mic (INMP441)
};

void record_voice() {
    int16_t *buffer = malloc(RECORD_BUFFER_SIZE * sizeof(int16_t));
    size_t bytes_read;
    int total_samples = 0;
    int silence_count = 0;

    while (total_samples < SAMPLE_RATE * 10) { // 최대 10초
        i2s_read(I2S_NUM_0, buffer, RECORD_BUFFER_SIZE * 2,
                 &bytes_read, portMAX_DELAY);

        // VAD: RMS 기반 침묵 감지
        int32_t sum = 0;
        for (int i = 0; i < RECORD_BUFFER_SIZE; i++) {
            sum += abs(buffer[i]);
        }
        float rms = sum / RECORD_BUFFER_SIZE;

        if (rms < 300) {  // 침묵 임계값
            silence_count++;
            if (silence_count > 30) break; // ~1초 침묵 = 종료
        } else {
            silence_count = 0;
        }
        total_samples += RECORD_BUFFER_SIZE;
        // 버퍼 → 서버 전송 (2편에서 구현)
    }
}

VAD (음성 활동 감지)

VAD는 ESP-SKAINET의 AFE(Audio Front-End) 모듈에 내장되어 있습니다. 별도로 구현할 필요 없이, ESP-SKAINET이 Wake Word 이후의 음성 구간을 자동으로 감지합니다.

이 AFE 파이프라인 덕분에 복잡한 오디오 처리를 직접 구현할 필요가 없습니다. "말 끝을 어떻게 감지하지?" 같은 문제를 ESP-SKAINET이 알아서 해결해줍니다.

이번 편 요약

다음 2편에서는 이 녹음된 음성을 WiFi를 통해 Hermes AI 서버로 전송하고, STT → LLM → TTS 파이프라인을 구축합니다.

참고 링크

← 모든 글 보기