Senko 소개
Senko는 오디오 데이터에서 **“누가 말했는지”**를 자동으로 구분하는 화자 분리(Speaker Diarization) 파이프라인입니다. 회의 녹음, 팟캐스트, 유튜브 영상 분석처럼 여러 사람이 대화하는 음성 데이터에서는 화자별 구분이 필수적입니다. Senko는 기존 방식보다 훨씬 빠르고 정확하게 이를 수행할 수 있어, 실시간 응용부터 대량 데이터 처리까지 폭넓게 활용 가능합니다.
특히 속도 면에서 큰 강점을 가지고 있습니다. 예를 들어, RTX 4090과 Ryzen 9 7950X 환경에서는 1시간 분량의 오디오를 단 5초 만에 처리할 수 있으며, 이는 Pyannote 3.1 대비 약 17배 가량 빠릅니다. Apple M3에서도 1시간을 23.5초 만에 처리할 수 있어 GPU와 CPU 환경 모두에서 효율적입니다.
Senko는 Zanshin 미디어 플레이어에 내장되어 실제 사용자 환경에서 사용되고 있으며, 연구용을 넘어 실용적 도구로 자리 잡고 있습니다. 또한 Pyannote 기반 모델을 부분적으로 활용하면서도 파이프라인 전반을 최적화하여 더 높은 속도와 효율성을 달성했습니다.
Senko의 기술적 구조
Senko는 3D-Speaker 프로젝트 기반으로 개선된 파이프라인입니다.
- VAD: Pyannote segmentation-3.0 또는 Silero VAD
- Fbank 특성 추출: C++ 기반, 모든 CPU 코어 활용
- 화자 임베딩: CAM++ 모델의 배치 처리
- 클러스터링: GPU 환경에서는 RAPIDS로 가속 가능
Senko의 언어 의존성 여부
일반적으로 화자 분리 기술은 음성의 언어적 의미보다 음향적 특징(목소리의 톤, 주파수, 발화 패턴 등) 에 의존합니다. Senko 역시 이 원리에 따라 작동하기 때문에 언어 비의존적(language-agnostic) 입니다.
Senko는 영어(VoxConverse 데이터셋) 및 중국어(AISHELL-4 데이터셋)의 두 가지 언어에서 벤치마크 평가를 진행했고, 모두 기존 Pyannote보다 낮은 DER(Diarization Error Rate)을 기록했습니다. 이는 Senko가 특정 언어에 특화된 것이 아니라, 한국어를 포함한 다양한 언어에서도 그대로 적용할 수 있음을 의미합니다.
다만, 성능은 언어 자체보다 녹음 품질, 배경 잡음, 마이크 환경에 더 큰 영향을 받습니다. 즉, 한국어 회의나 팟캐스트 음성에도 충분히 사용할 수 있지만, 음질이 낮거나 화자가 겹쳐 말하는 경우 성능 저하가 발생할 수 있습니다.
Pyannote와 비교
화자 분리 분야의 대표적인 도구는 Pyannote입니다. Pyannote는 연구와 커뮤니티 지원이 활발해 안정적인 성능을 제공하지만, 속도에서는 한계가 있습니다:
- VoxConverse (영어): Pyannote 3.1 → 11.3% DER vs. Senko → 10.5% DER
- AISHELL-4 (중국어): Pyannote 3.1 → 12.2% DER vs. Senko → 9.3% DER
즉, Senko는 정확도 면에서도 우수할 뿐 아니라, 처리 속도는 최대 17배 이상 빠른 성능을 보여줍니다.
Senko 설치 방법
Senko는 Linux, macOS, WSL 환경에서 Python 3.11.13을 기반으로 동작합니다. 이를 위해 clang과 uv가 미리 설치되어 있어야 합니다. 다음과 같은 명령어로 설치할 수 있습니다:
# CUDA 7.5 이상 (GTX 16 시리즈 이상)
uv pip install "git+https://github.com/narcotic-sh/senko.git[nvidia]"
# CUDA 7.5 미만 (GTX 10 시리즈 등)
uv pip install "git+https://github.com/narcotic-sh/senko.git[nvidia-old]"
# Mac(mps) 및 CPU 실행
uv pip install "git+https://github.com/narcotic-sh/senko.git"
Senko 사용 예시
다음은 Senko 라이브러리를 사용해 오디오 파일에서 화자를 분리(Speaker Diarization)하고, 그 결과를 파일로 저장하는 예시 코드입니다:
import senko, json
diarizer = senko.Diarizer(torch_device='auto', warmup=True, quiet=False)
wav_path = 'audio.wav' # 16kHz mono 16-bit wav
result = diarizer.diarize(wav_path, generate_colors=False)
senko.save_json(result["merged_segments"], 'audio_diarized.json')
senko.save_rttm(result["merged_segments"], wav_path, 'audio_diarized.rttm')
이를 통해 JSON 및 RTTM 형식으로 결과를 저장할 수 있어 후처리 및 시각화에 활용 가능합니다.
라이선스
Senko 프로젝트는 MIT License으로 공개되어 있으며, 상업적 사용을 포함한 폭넓은 활용이 가능합니다.
Senko 프로젝트 GitHub 저장소
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다.
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~