TT Lab
요금제

한국어

시작하기
블로그

블로그

소리로 바운드 듣기: onset 검출과 표면 분류, 그리고 실제 녹음에서는 효과가 없었다는 기록

상태: 초안 (2026-10-13), 실측 반영(부정 결과 포함). 분류 실험과 열화 실험은 2026-10-11–12 에 CPU 임시 파드와 노트북에서 잰 값입니다. 끝단(점수) 효과는 실제 소리가 아니라 정답 시각에서 만든 모의 onset 으로만 쟀습니다. 휴대폰 녹음 조건은 미실측입니다. 논문 수치는 「논문」으로 표시했습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.

목차

1. 왜 소리인가

탁구장에서 눈을 감고 있어도 랠리를 따라갈 수 있습니다. 「똑」 하는 테이블 소리와 「탁」 하는 라켓 소리가 번갈아 들립니다. 소리가 매력적인 이유는 셋입니다.

  1. 영상이 약한 곳에서 버틴다. 어둡거나, 공이 번지거나, 선수 몸에 가려도 소리는 들립니다. 2편에서 공 찾기가 크게 무너진 조건(어두움 0.685, 가림 0.842)이 소리에는 상관없습니다.
  2. 시간이 촘촘하다. 60fps 영상은 16.7ms 마다 한 장이지만, 44.1kHz 소리는 1ms 안에 44개의 표본이 있습니다. 바운드 순간을 프레임보다 정확히 짚을 수 있습니다.
  3. 타구와 바운드를 직접 가른다. 5편의 가장 흔한 실수인 「타구를 바운드로 읽음」에, 소리는 「그 순간 들린 것은 라켓 소리였다」고 직접 답할 수 있습니다.

2. 원리 하나: onset 검출

onset 은 소리가 갑자기 시작하는 순간입니다. 공이 테이블에 닿는 소리는 몇 ms 안에 크게 올랐다가 사라지는 짧은 충격음이라, onset 을 찾으면 바운드 시각을 얻습니다.

직관은 「소리의 세기가 방금 전보다 갑자기 커진 곳」입니다. 계산은 대개 세 단계입니다.

  1. onset 세기 곡선을 만든다. 짧은 창(수 ms)마다 에너지를 재거나, 주파수 성분별로 직전 창보다 늘어난 양만 더합니다(spectral flux). 늘어난 양만 보는 이유는 소리가 이어지는 동안이 아니라 시작하는 순간만 잡으려는 것입니다.
  2. 기준선을 따라간다. 주변 소음 수준은 시시각각 바뀌므로, 고정 문턱 대신 최근 평균(이동 평균이나 지수 이동 평균)의 몇 배를 문턱으로 씁니다.
  3. 봉우리를 고른다. 문턱을 넘는 국소 최댓값을 onset 으로 하고, 너무 가까운 봉우리는 하나로 합칩니다.

이 분야의 고전 정리는 Bello et al. 의 onset 검출 해설(IEEE Trans. Speech and Audio Processing, 2005)이고, 파이썬의 librosa 는 onset.onset_detect 로 「onset 세기 곡선에서 봉우리 고르기」를 제공합니다.

탁구 소리 논문(Gossard et al., arXiv 2409.11760, IEEE STAR 2025)은 더 단순한 길을 택했습니다. 10kHz 고역 통과 필터(5차 버터워스)로 낮은 소음을 잘라 내고, 1ms 창의 에너지를 지수 이동 평균과 비교합니다. 공이 부딪치는 소리는 높은 주파수 성분이 강해서, 사람 말소리나 발소리 대부분이 필터에서 걸러집니다. 깨끗한 녹음에서 정밀도 0.98·재현율 1.00, 말소리를 섞어도 0.98·0.95 였습니다(논문, 지향성 마이크를 선수 쪽 50cm–2m 에 둔 녹음).

3. 원리 둘: 표면 분류

onset 을 찾았으면 「무엇에 부딪친 소리인가」를 가릅니다. onset 직후의 짧은 조각(TT Sounds 는 15ms)을 잘라 특징을 뽑고 분류합니다.

특징은 소리의 「음색」을 숫자로 요약한 것입니다. 우리 실험은 77차원을 썼습니다. 사람 귀의 주파수 감각에 맞춘 MFCC 20개의 평균과 표준편차, 스펙트럼의 무게중심·퍼짐 같은 모양 지표, 주파수 띠별 로그 에너지 등입니다. 테이블은 넓은 판이라 낮고 긴 울림이, 라켓은 고무와 나무라 짧고 둔한 소리가 납니다. 이 차이가 특징에 드러납니다.

분류기는 단순한 것으로 충분했습니다. 로지스틱 회귀, 랜덤 포레스트, 히스토그램 기반 그레이디언트 부스팅(HistGradientBoosting)을 비교했습니다. 논문은 작은 CNN 으로 표면 분류 F1 0.97, 노트북 CPU 4.2ms 를 보고했습니다(논문).

4. 실측: 깨끗한 녹음에서는 거의 완벽했다

TT Sounds(튀빙겐 대학, CC BY-NC 4.0)의 15ms 표본 5,702개로 했습니다. 라켓 3,396 · 테이블 777 · 바닥 290 · 기타 1,239 이고, 원래 녹음 115개에서 잘라 낸 것입니다.

중요한 결정이 하나 있었습니다. 데이터셋이 준 80/20 분할은 같은 녹음에서 잘라 낸 이웃 표본이 학습과 시험 양쪽에 들어갑니다. 이웃 표본은 거의 같은 소리라, 시험이 사실상 외운 것을 다시 묻게 됩니다. 그래서 원래 녹음 단위로 다섯 겹을 나눠, 시험에는 처음 듣는 녹음만 들어가게 했습니다. 데이터셋 분할로 재면 0.1–0.8%p 높게 나왔습니다.

과제 로지스틱 랜덤 포레스트 HistGB 테이블 재현율 / 정밀도(로지스틱)
테이블 대 라켓 99.3% 98.9% 99.1% 98.3% / 98.1%
테이블 대 나머지 셋 98.8% 98.8% 98.9% 97.0% / 94.5%
네 가지 97.4% 97.5% 97.6% 97.3% / 96.3%

특징 뽑기는 표본 하나에 4.7ms, 예측은 0.001–0.04ms(CPU)였습니다. 실시간으로 충분합니다.

5. 실측: 조건이 나빠지면

같은 표본의 시험 겹에만 열화를 입혔습니다. 말소리는 실제 코치 음성을 섞었고, 음악과 잔향은 합성입니다. 「테이블 소리인가」의 재현율 / 정밀도입니다.

조건 깨끗한 소리로만 학습 열화를 섞어 학습
깨끗함 0.946 / 0.972 0.891 / 0.991
백색 잡음 SNR 20dB 0.623 / 0.992 0.960 / 0.979
백색 잡음 SNR 10dB 0.009 / 1.0 0.945 / 0.960
말소리 SNR 0dB 0.738 / 0.740 0.860 / 0.923
옆 테이블 바운드 0dB 0.983 / 0.407 0.940 / 0.605
마이크 8m(잔향 합성) 0.421 / 0.968 0.852 / 0.911

두 가지가 분명합니다.

6. 부정 결과: 실제 녹음에서는 효과를 확인하지 못했다

여기까지는 깨끗하게 따로 녹음한 소리였습니다. 진짜 질문은 「경기 영상과 함께 찍힌 소리에서도 되나」입니다.

먼저 부딪친 벽은 데이터였습니다. OpenTTGames 영상에는 소리 트랙이 없습니다(ffprobe 로 12편 모두 영상 스트림 하나뿐임을 확인). 영상·소리·바운드 정답이 함께 있는 공개 데이터를 찾지 못했습니다.

그래서 영상에 소리가 함께 담긴 T3Set(아마추어 다구 훈련, CC BY-NC-SA 4.0)을 썼습니다. 영상 파일(mkv)에 소리(AAC 44.1kHz)가 같은 컨테이너로 붙어 있어 시각 정렬은 보장됩니다. 8라운드(선수 8명)에 위 분류기를 붙여 보았습니다.

관찰 값 기대
거의 무음인 라운드 8개 중 2개(onset 0개, 1개) 0
라켓 센서(IMU)가 잰 타구 시각 ±30ms 안의 라켓 소리 타구 8–16개 중 1–5개 거의 전부
타구 사이 테이블 소리 수 0–15 로 흩어짐 다구 훈련이면 2 근처

실제 훈련장 녹음에서 바운드를 가를 수 있다는 근거가 나오지 않았습니다. 잣대 자체도 약했습니다. 라켓 센서의 시계와 영상 파일 이름(초 단위)의 어긋남이 라운드마다 −1.5초에서 +3초로 달라, 타구 시각 정렬부터 흔들렸습니다. 그래서 소리는 엔진에 넣지 않았습니다.

모의 실험: 소리가 있었다면 점수는?

영상과 소리와 정답이 함께 있는 데이터가 없으니, 실제 경기 12편의 정답 바운드·타구 시각에서 가짜 onset 을 만들어 「이런 품질의 소리가 있다면」을 쟀습니다. 실제 소리가 아니라는 점을 다시 강조합니다. 설계는 소리가 판정을 바꾸지 않고 「확인 필요」만 바꾸는 방식이라, 승자 정확도는 모든 행에서 93.1% 그대로입니다.

소리 품질(모의) 확인 없이 틀림 확인 필요
소리 없음(기준) 10 41.1%
깨끗한 근접 마이크(재현 0.95, 시각 흔들림 5ms, 동기화됨) 8 41.8%
T3Set 수준(재현 0.2, 라벨 30% 뒤바뀜)을 그대로 믿음 7 54.2%
같은 소리, 「소리 건강 낮음」으로 판정해 무시 10 41.1%
소리와 영상이 100ms 어긋남, 동기화 없음 3 77.8%
100ms 어긋남, 동기화로 빼냄 8 41.8%

읽는 법은 이렇습니다. 깨끗하고 동기화된 소리는 확인 없이 틀린 판정 2건을 사람 앞으로 끌어옵니다. 동기화가 안 된 소리는 라켓 소리가 바운드 자리에 겹쳐 확인 필요를 두 배로 만듭니다. 사람이 거의 모든 랠리를 다시 봐야 하니 쓸모가 없습니다. 소리를 쓰려면 소리–영상 어긋남 추정과 「이 소리는 믿을 만한가」 판정이 먼저입니다.

7. 붙인다면 이렇게

엔진에 붙일 때의 설계는 정해 두었습니다.

그 전에 필요한 것은 하나입니다. 촬영 안내대로 찍은 휴대폰 영상에, 사람이 바운드 시각을 단 시험셋. 휴대폰 마이크, 탁구장의 울림, 옆 테이블 소리에서 위 숫자가 어떻게 되는지는 그 시험셋이 있어야 잴 수 있습니다(미실측). 사전학습된 범용 오디오 임베딩으로 잡음에 강한 분류기를 만드는 방법도 조사했지만 아직 실험 전입니다(진행 중).

티티 한마디. 조용한 방에서 녹음한 「똑」은 99% 알아들었는데, 진짜 탁구장 소리에서는 아직 못 알아들었어요. 못 한 것도 기록해 두는 게 다음에 덜 헤매는 길이에요.

참고

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다