자동차 소리로 고장 진단하는 오디오 ML 파이프라인 'cardiag'
스마트폰으로 녹음한 자동차 소리만으로 기계적 고장을 분류하는 엔드투엔드 오디오 머신러닝 파이프라인인 'cardiag'가 공개되었습니다. 이 프로젝트는 YouTube나 TikTok에서 데이터를 수집해 정제한 뒤, 고정된 CLAP(Contrastive Language-Audio Pretraining) 모델로 특징을 추출하고 경량 모델을 학습시켜 고장을 분류합니다. 무엇보다 확신이 없을 때 부정확한 답변 대신 '불확실(UNCERTAIN)'하다고 알려주는 책임감 있는 설계가 돋보이며, 이러한 오디오 전처리 및 정직한 학습 방법론은 다른 오디오 데이터셋에도 재사용할 수 있다는 점에서 가치가 있습니다.
원문 제목: Show HN: 대조 언어-오디오 사전 학습(CLAP)을 활용한 기계적 고장 분류 출처: 해커뉴스(Hackernews)
본문: cardiag — 소리만으로 자동차 고장을 진단하다 cardiag는 엔드투엔드 오디오 ML 파이프라인입니다. YouTube와 TikTok에서 고장 난 소리 클립을 스크래핑하고, 오디오를 정제하며(음성, 음악, 소음에서 기계음만 분리), 고정된(frozen) CLAP 모델을 사용해 임베딩한 후, 작은 선형 헤드(linear heads)를 학습시켜 고장을 우선순위별로 분류합니다. 이는 CLI(명령줄 인터페이스)와 실시간 웹 앱 형태로 제공됩니다. (cardiag-demo.mp4)
이것은 개념 증명(Proof of concept)에 해당하며, 그 의미를 있는 그대로 솔직하게 받아들여야 합니다. 스마트폰 녹음만으로 자동차 고장을 진단하는 것은 결코 쉽지 않기 때문에, cardiag는 '진단기'라기보다는 보정된 '분류 보조 도구(triage aid)'로 설계되었습니다. 즉, 무언가 소리가 이상한지, 대략적으로 자동차의 어느 부분에서 나는 소리인지, 그리고 의심되는 부품의 순위 목록을 알려줍니다. 오디오 데이터만으로 판단하기 어려울 때는 억지로 추측하지 않고 "불확실(uncertain)"하다고 답합니다.
이 프로젝트의 진짜 가치는 오디오 정제 및 정직한 학습 레시피에 있으며, 이는 다른 오디오 데이터셋에도 재사용할 수 있습니다. 다소 낮아 보이는 정확도는 휴대폰 녹음이라는 열악한 환경에서 비롯된 문제의 난이도를 반영할 뿐입니다(기존 문헌의 성능 상한선에 도달함). 동일한 방식을 깨끗한 엔진 오디오에 적용하면 0.93의 AUROC를 달성합니다. 자세한 내용은 docs/DEFENSE.md를 참조하세요.
대화형 데모 두 가지 페이지는 파이프라인의 처음 두 단계를 시각화합니다:
- 엔진 오디오 분리 — 시끄러운 YouTube 오디오(음성, 음악, 도로 소음)에서 짧은 기계음 구간만을 추출해 내는 clean() 캐스케이드 과정을 대화형으로 살펴볼 수 있습니다.
- CLAP 시각화 — 고정된 CLAP 모델이 추출된 구간을 선형 헤드가 분류할 수 있는 512차원 임베딩으로 변환하는 과정을 보여줍니다.
실제 달성한 성능 샘플 외부 데이터에 대해 측정되었으며 데이터 유출을 방지했습니다(1,031개 비디오 그룹에 대한 비디오별 그룹 교차 검증, 순열 검정 p = 0.0005). 이는 리더보드 점수가 아닌 객관적인 수치입니다.
기능 / 결과 (무작위 추측 대비)
- 무언가 잘못되었나요? (고장/정상) / AUROC 0.79 [0.76, 0.83] / (무작위 시 0.50)
- 자동차 어느 부분인가요? (6개 구역) / 상위 3개 안에 정확한 구역 포함 확률 약 75% / (무작위 대비 2배)
- 어느 부품인가요? (12개 이상 제품군) / 상위 3개 안에 정확한 부품 포함 확률 약 45-65% / (무작위 대비 3-4배)
- 모르는 상황을 인지함 / 보정됨(ECE ≈ 0.04), '불확실(UNCERTAIN)' 반환
자세한 내용과 샘플 외부 데이터에서 성능이 떨어져 사용을 중단한 헤드(knock)에 대한 설명은 docs/MODEL_CARD.md에 있습니다.
빠른 시작: 복제 후 바로 추론하기 저장소를 복제(clone)하면 즉시 사용할 수 있습니다. models/ 디렉터리에 미리 학습된 소형 모델이 포함되어 있고, 합성 데모 클립도 함께 제공되므로 별도로 다운로드하거나 스크래핑할 필요가 없습니다.
git clone < this-repo > && cd car-diagnosis uv venv && source .venv/bin/activate uv pip install -e ".[scrape,web,dev,viz]" # Python 3.11 cardiag doctor # 사전 확인: 설치된 내용 확인 cardiag train --fixtures # 약 2초 만에 오프라인으로 작동하는 모델 구축 (스크래핑 및 2GB 다운로드 불필요) cardiag diagnose < clip.wav > # 판정 결과 + 자동차 내 위치 + 부품 순위 cardiag serve --model models # 실시간 웹 앱: 클립을 드롭하거나 링크를 붙여넣어 "이유 설명" 확인
격리된 작업 트리에서 전체 과정을 엔드투엔드로 검증하려면: bash scripts/clone_verify.sh 를 실행하세요.
작동 방식 오디오 ──► clean() 캐스케이드 ──► CLAP 임베딩 ──► 선형 헤드 ──► 진단 (구간 분리) (고정됨, 512차원) (고장/구역/부품/노킹) (보정됨, 불확실 인식)
세그먼테이션(분할) 경로는 하나입니다. 스크래핑된 클립, 사용자가 직접 녹음한 오디오(cardiag ingest, 길이 제한 없음), 추론 시 업로드되는 파일은 모두 동일한 clean() 캐스케이드를 통과하여 짧은 기계음 구간만 추출됩니다. 약 10초 이상의 구간은 윈도우로 분할되어 CLAP 모델이 임의로 잘라내는 일(자른 truncation)이 발생하지 않도록 합니다. 학습과 서빙 과정이 동일한 임베딩 방식을 공유하므로 학습-서빙 간의 불일치(train/serve skew)가 발생하지 않습니다.
사용법 cardiag diagnose clip.wav # 전체 모델: 판정 + 위치 + 부품 순위 cardiag triage clip.wav # 보정된 엔진 vs 구동계(동력 전달 장치) 분류 cardiag clean clip.wav # 기계음만 분리 (모델 불필요) cardiag inspect clip.wav -o r.html # 파이프라인 시각화/청취: 구간, 스펙트로그램, 점수 cardiag ingest ./my_audio --kind fault --cause wheel_bearing # 사용자 오디오 불러오기 cardiag scrape youtube | tiktok # 말뭉치 구축 (Reddit은 너무 시끄러워 제외됨) cardiag train # 보유한 말뭉치로 학습
추론 명령어에 --json을 추가하면 머신 리더블(Machine-readable, 기계가 읽을 수 있는 형태) 출력을 얻을 수 있습니다.
문서 docs/DEFENSE.md — 의도적으로 단순한 방식이 어떻게 의미 있는 분류 결과를 얻어내는지에 대한 솔직한 설명. docs/MODEL_CARD.md — 헤드별 지표, 예상 사용 사례, 한계점. docs/arch