AI : 10. pyannote로 음성 화자 구분하는 법
pyannote.audio는 음성에서 화자 구간을 찾는 라이브러리다.
Whisper가 음성을 텍스트로 바꾼다면, pyannote는 누가 언제 말했는지 구분한다.
https://github.com/pyannote/pyannote-audio
사전 준비
이 글에서는 community-1 모델을 사용한다.
모델을 내려받으려면 Hugging Face 토큰이 필요하다.
https://huggingface.co/pyannote/speaker-diarization-community-1
토큰을 로컬에 저장해 두려면 다음 명령으로 로그인한다.
hf auth login
설치
pyannote.audio 패키지를 설치한다.
pip install pyannote.audio
Windows에서 torchcodec 오디오 디코딩 오류가 발생하면 shared FFmpeg를 사용하고 있는지 확인한다.
where.exe ffmpeg
where.exe ffmpeg로 확인한 폴더에 avcodec-*.dll, avformat-*.dll, avutil-*.dll 같은 파일이 있어야 한다.
ffmpeg.exe만 있다면 shared FFmpeg가 아니다.
기본 사용법
기본 형태는 Pipeline을 만들고 음성 파일을 넘기는 방식이다.
from pyannote.audio import Pipeline
pipeline = Pipeline.from_pretrained(
"pyannote/speaker-diarization-community-1",
token="HUGGINGFACE_TOKEN",
)
output = pipeline("audio.wav")
for turn, speaker in output.speaker_diarization:
print(f"{turn.start:.1f}s ~ {turn.end:.1f}s: {speaker}")
실행 결과는 다음과 같이 화자별 시간 구간으로 나온다.
0.0s ~ 3.2s: SPEAKER_00
3.5s ~ 8.1s: SPEAKER_01
8.4s ~ 12.0s: SPEAKER_00
주요 옵션
num_speakers화자 수를 알고 있을 때 지정한다.min_speakers예상되는 최소 화자 수를 지정한다.max_speakers예상되는 최대 화자 수를 지정한다.
화자 수를 알고 있다면 num_speakers를 사용한다.
output = pipeline(
"audio.wav",
num_speakers=2,
)
정확한 화자 수를 모른다면 min_speakers, max_speakers로 범위를 지정한다.
output = pipeline(
"audio.wav",
min_speakers=2,
max_speakers=4,
)
화자 구간 결과
community-1의 output에서는 두 가지 화자 구간을 확인할 수 있다.
기본 결과인 speaker_diarization은 두 화자의 시간이 겹쳐 나올 수 있다.
예를 들면 다음과 같은 형태다.
SPEAKER_00 10.0 ~ 13.0
SPEAKER_01 12.0 ~ 15.0
반면 exclusive_speaker_diarization은 한 시점에 한 명의 화자만 남도록 정리한 결과다.
같은 구간이라도 다음과 같이 시간이 겹치지 않는다.
SPEAKER_00 10.0 ~ 12.0
SPEAKER_01 12.0 ~ 15.0
각 값은 output에서 꺼내 사용할 수 있다.
diarization = output.speaker_diarization
exclusive_diarization = output.exclusive_speaker_diarization
Whisper 결과와 함께 사용
Whisper와 pyannote를 함께 사용할 때는 두 결과의 시간을 기준으로 맞춘다.
Whisper : 0.0s ~ 3.0s 안녕하세요
pyannote : 0.0s ~ 3.2s SPEAKER_00
결과 : SPEAKER_00 안녕하세요
두 결과의 시간이 겹치는 구간을 찾아 텍스트에 화자 이름을 붙이는 방식이다.
댓글남기기