본문으로 건너뛰기

화자 분리를 pyannote로 직접 돌린다

맥락

현재 공급자 ElevenLabs 실시간 API에는 화자 분리 파라미터가 문서상 없다. 지금은 화자가 아예 안 나뉜다. 어느 쪽으로든 정해야 하는 자리다.

같은 자리에 상반된 제안 둘이 열려 있다. 2026-08-01 STT 벤더 비교의 결론은 "교체할 이유는 가격이 아니라 화자 분리다"였다. Soniox가 플래그 하나(enable_speaker_diarization: true)로 추가 비용 없이 준다는 것이었고, 그래서 4시간 PoC 조건부로 벤더 교체를 제안했다(결정 원장 S-015). 반대로 S-016은 자체 전사 모델 서빙(vllm·nemotron·pyannote)을 Q3 범위에 넣지 않는 쪽을 제안했다. 근거는 "벤더 교체가 우리 moat가 아니듯 자체 구현도 moat가 아니다"였다. 상위 결정 P-008(전사 정확도로 경쟁하지 않는다)에서 파생된 판단이다.

이 카드는 S-016을 뒤집는 제안이다. 무엇이 그 판단을 바꿨는지가 본문이어야 하는데, 그것이 아직 없다.

결정

pyannote로 자체 화자 분리를 한다.

⚠️ 아래가 채워지기 전에는 상태를 채택됨으로 올리지 않는다. 지금 기록된 것은 선택지 이름뿐이고 선택 근거가 없다.

  1. 실시간인가 사후인가. 실시간이면 전사 파이프라인 안에 들어가 지연이 붙는다. 사후면 전사와 화자가 두 파이프라인으로 갈린다. 세그먼트에 화자를 되붙이는 매칭 문제가 새로 생긴다.
  2. 어디서 도는가. heymoa-ai EC2 위인가, 별도 인스턴스인가, GPU가 필요한가. 인프라가 하나 늘어나느냐가 인프라 결정 전체에 걸린다. 그 결정들은 EC2 두 대 + RDS 하나를 전제로 서 있다.
  3. S-016을 무엇이 뒤집었는가. "자체 구현은 moat가 아니다"가 여전히 참인데도 하기로 했다면 그 이유(한국어 성능? 벤더 종속 회피? Soniox 한도?)가 근거로 남아야 한다.
  4. Soniox PoC 결과. S-015가 "4시간 PoC 결과로 판정한다"고 정한 판정을 건너뛰는 것인지, PoC가 끝났고 진 것인지.

대안

대안 1 — Soniox로 벤더 교체. 플래그 하나에 추가 비용 0이다. 우리 partial/final 세그먼트 모델과도 1:1로 대응한다. 기각한 이유: 아직 기각하지 않았다. 한국어 등급 미공개 · context+diarization 동시 사용을 깨는 미해결 벤더 버그 · 동시 연결 10 한도(베타 규모에서 바로 걸린다, 상향 승인 필요)가 남아 PoC 없이는 판정이 끝나지 않는다.

대안 2 — 화자 분리 보류. 결정 원장 S-002가 이미 MVP 3으로 이월해 뒀다. 8~12 사람·일로 추정된 일감이다. 기각한 이유: 회의록에서 "누가 말했는가"가 계속 빠진 채로 간다.

대안 3 — ElevenLabs에 남고 화자 없이 간다. 현행 유지라 아무 비용이 없다. 기각한 이유: 같음 — 화자 없는 회의록의 값이 얼마인지가 아직 판정되지 않았다.

결과

  • 공급자를 바꾸지 않고 화자 분리를 얻는다. 벤더의 한도·버그·언어 등급을 더는 따라다니지 않아도 된다.
  • 운영할 것이 하나 더 붙는다. 모델 가중치·GPU·버전 관리가 3인 팀의 일감이 된다. P-008이 "패리티만"으로 정한 축(A1 캡처·전사)에 Q3 시간이 들어간다.
  • 벤더 기능이면 공짜로 따라올 것(모델 갱신·언어 확장)을 우리가 계속 따라가야 한다.
  • 실시간으로 붙이면 지연이, 사후로 붙이면 파이프라인이 갈린다. 어느 쪽이든 final segment에 화자를 어떻게 매다는지를 세그먼트 모델 위에서 새로 정해야 한다.
  • pyannote는 라이선스·모델 접근 조건이 붙는다(HuggingFace 게이트). 배포 파이프라인에 그 인증이 든다.