0. ABSTRACT
본 논문은 speaker diarization을 위해 python에서 작성된 open-source toolkit인 pyannote.audio를 소개한다. PyTorch 머신 러닝 프레임워크를 기반으로 하는 이 도구는 speaker diarization pipelines를 구축하기 위해 결합하고 공동으로 최적화할 수 있는 일련의 훈련 가능한 end-to-end neural building blocks을 제공한다. 또한 pyannote.audio에는 음성 활동 감지, 화자 변경 감지, 화자 임베딩 등 광범위한 도메인에 대한 pre-trained model이 포함되어 있으며 대부분의 도메인에서 최첨단 성능을 발휘한다.
1. INTRODUCTION
speaker diarization은 화자 별로 audio stream을 시간적인 segment로 분할하는 작업이다. Fig. 1에 표시된 것처럼 이 작업은 일반적으로 각 특정 작업을 처리하는 building blocks 모음을 조합해 해결한다.
본 논문에서는 Python에서 작성되고 PyTorch 머신러닝 프레임워크 기반의 open-source toolkit인 pyannote.audio를 소개하며, 각각에 대한 end-to-end neural implementations를 제공한다. speaker diarization을 처리하는 몇 가지 open-source toolkit이 이미 존재한다. 각 tool에는 장단점이 있다.
S4D
S4D는 모든 pyannote.audio 대안 중에서 가장 유사하다. Python으로 작성되었으며, 앞서 언급한 대부분의 blocks를 제공하고, 시스템의 실제 평가까지 쭉 설명한다. 그러나 전통적인 접근 방식(즉, deep learning으로의 전환 이전)에 초점을 맞추고 pipeline의 joint optimization이 부족하다는 점에서 pyannote.audio와 다르다.
Kaldi
Kaldi는 몇 가지 speaker diarization recipe를 제공하지만 Python으로 작성되지 않았으며 대부분 음성 및 화자 인식 시스템 구축에 전념한다.
ALIZ´
speaker diarization을 위한 ALIZE와 LIA SpkSeg extension은 C++로 작성되었으며 speaker diarization을 위한 최신 deep learning approach를 제공하지 않는다.
pyAudioAnalysis
pyAudioAnalysis는 Python으로 작성되었으며 보다 일반적인 오디오 신호 분석을 다루지만 speaker diarization에도 사용할 수 있다.
2. FEATURE EXTRACTION WITH BUILT-IN DATA AUGMENTATION
pyannote.audio는 파형에서 직접 모델을 훈련할 수 있도록 지원하지만, pyannote.audio.features 모듈은 라이브러리에서 제공되는 implementation를 사용해 MFCC나 spectrogram과 같은 표준 feature extraction 기법을 제공한다. 이 모듈은 모두 신경망 훈련에 매우 편리한 on-the-fly data augmentation을 지원하는 동일한 FeatureExtraction base class로부터 상속된다. 예를 들어, 무작위 audio chunk에서 feature를 추출하는 동시에 MUSAN과 같은 데이터베이스에서 additive noise를 적용하는 것을 지원한다. 각 원본 audio 파일의 고정된 수의 증강 버전을 미리 생성하는 다른 도구와는 달리, pyannote.audio는 audio chunk가 처리될 때마다 즉석에서 aumentation이 수행되므로 사실상 무한한 수의 버전을 생성할 수 있다.
3. SEQUENCE LABELING
pyannote.audio.labeling은 voice activity detection, speaker change detection, overlapped speech detection, 심지어 re-segmentation을 포함한 여러 speaker diarization sub-module을 위한 신경망을 훈련하는 통합 프레임워크를 제공한다.
3.1 Principle
각각은 입력이 feature vector $ X = \{x_{1}, x_{2}, ..., x_{T}\} $의 sequence이고 예상 출력이 $ y_{t} \in [1;K] $를 갖는 해당 레이블 $ y = \{y_{1}, y_{2}, ..., y_{T}\} $의 sequence인 sequence labeling 작업으로 처리할 수 있다.(여기서 class K의 수는 작업에 따라 달라진다.) pyannote.audio는 feature sequence $ X $를 해당 label sequence $ y $에 매치하는 neural network $ f : X \rightarrow y $를 학습시키는 일반 코드를 제공한다. 실제 neural network architecture의 선택은 사용자에게 맡겨지지만 pyannote.audio는 Fig. 2에 요약된동일한 일반 PyanNet 기반 architecture를 공유하는 사전 학습된 PyTorch 모델을 제공한다.
가변 길이의 긴 오디오 파일을 처리하는 것은 실용적이지도 효율적이지도 않기 때문에, pyannote.audio는 더 짧은 고정 길이의 하위 sequence에 의존한다. 훈련 시에는 training set에서 고정 길이의 하위 sequence를 무작위로 추출해 mini batch를 형성함으로써 training sample의 variability(data augmentation)과 training time(shorter sequences)을 늘린다. 테스트 시에는 training에 사용된 것과 동일한 길이의 sliding window를 겹쳐 오디오 파일을 처리한다. 각 time step $ t $에 대해 여러 개의 겹치는 K-dimensional 예측 점수 시퀀스가 생성되며, 이를 평균해 각 class의 최종 점수를 얻는다.
3.2 Voice activity detection
Voice activity detection은 주어진 audio stream이나 녹음에서 음성 영역을 감지하는 작업이다. 위의 원리를 이용해 pyannote.audio에서 K=2를 사용해 이를 해결할 수 있다. : time step $ t $에 음성이 없으면 $ y_{t} $는 0이고, 음성이 있으면 $ y_{t} $ = 1이다. 테스트 시 예측 점수가 조정 가능한 threshold $ \theta_{VAD} $보다 큰 단계는 음성으로 표시된다. Table 1.에 나와있는 것처럼 다양한 데이터셋에서 최첨단 성능에 도달하는 pre-trained model을 사용할 수 있다.
3.3 Speaker change detection
Speaker change detection은 주어진 audio stream이나 녹음에서 화자 변경 지점을 감지하는 작업이다. time step $ t $에서 화자 변경이 없으면 $ y_{t} = 0 $, 있으면 $ y_{t} = 1 $의 동일한 sequence labeling 원리를 사용해 pyannote.audio에서 처리할 수 있다. 주소를 지정하려면 class imbalance 문제를 해결하고 human annotation imprecision을 설명하기 위해, 화자 변경 지점 $ t_{}^{*} $의 가까운 일시적인 time step $ \{t | \left|t - t_{}^{*} \right| < \delta \} $는 훈련에 인위적으로 양수로 레이블로 지정된다. 실제로, $ \delta $의 자속 순서는 200ms이다. 테스트 시에는 예측 점수 로컬 최댓값에 해당하고 조정 가능한 threshold $ \vartheta_{SCD} $보다 큰 시간 단계가 스피커 변경 지점으로 표시된다. 전반적으로 이것은 원래 [Speaker Change Detection in Broadcast TV Using Bidirectional Long Short-Term Memory Networks]에서 설명한 speaker change detection의 버전을 구현한 것이다. Table 2.에 나와있는 것처럼 다양한 데이터셋에서 최첨단 성능에 도달하는 pre-trained model을 사용할 수 있다.
3.4 Overlapped speech detection
overlapped speech detection은 최소 2명의 화자가 동시에 말하는 영역을 감지하는 작업이다. 이 작업은 K = 2인 동일한 sequence labeling 이론을 사용하는 pyannote.audio에서 처리된다. : time step $ t $에 화자가 0명 또는 1명일 경우 $ y_{t} = 0 $, 화자가 2명 이상일 경우 $ y_{t} = 1이다. class imbalance 문제를 해결하기 위해 Fig 3.에 표시된 것처럼 training sub-sequences의 절반은 두 개의 무작위 sub-sequence의 가중치 합으로 인위적으로 만들어진다. 테스트 시 예측 점수가 조정 가능한 threshold $ \vartheta_{OSD} $보다 큰 time step.은 중복된 음성으로 표시된다. Table 3.에 나와있는 것처럼 다양한 데이터셋에서 최첨단 성능에 도달하는 pre-trained model을 사용할 수 있다.
3.5 Re-segmentation
Re-segmentation은 diarization pipeline에서 나오는 speech turn과 label을 정제하는 작업이다. 이 작업은 unsupervised task지만, pyannote.audio에서 동일한 sequence labeling 원리를 사용해 $ K = \kappa +1 $로 처리되며, 여기서 $ \kappa $는 drarization pipeline에서 가설로 설정한 화자 수이다. : time step $ t $에서 활성화된 화자가 없는 경우 $ y_{t} = 0 $이며, speaker $ \kappa \in [1;\kappa] $가 활성화되었다면 $ y_{t} = k $가 된다. re-segmentation step이 설계상 unsupervised되었기 때문에, re-segmentation model은 pre-train되지 않는다. 각 audio file에 대해 새로운 re-segmentation model은 diarization pipeline의 (자동화된, 따라서 불완전한) 출력을 학습 레이블로 사용해 처음부터 학습된다. 여러 epoch $ \epsilon $에 대해 훈련된 모델은 훈련된 그 파일에 바로 적용되므로 이 접근 방식은 완전히 비지도 방식이다. 각 time step은 예측 점수가 가장 높은 class(non-speech 또는 k speaker 중 하나)에 할당된다. 이것은 [Neural Speech Turn Segmentation and Affinity Propagation for Speaker Diarization]을 구현한 것으로, $ \epsilon =20 $이 적절한 epoch라는 것을 확인했다.
4. SEQUENCE EMBEDDING AND CLUSTERING
voice activity detection과 마찬가지로, clustering은 speaker diarization pipeline에서 가장 중요한 부분 중 하나이다. clustering은 화자의 실제 신원에 따라 speech segment를 그룹화하는 것으로 구성된다. 2019년 10월 현재, 가장 성능이 우수한 speaker diarization system은 clustering step의 입력으로 $ x-vector $를 사용한다. 일반적으로 고정 길이의 sliding window에서 추출되며, 확률론적 선형 판별 분석(PLDA)을 통해 pairwise similarity matrix를 얻는다. $ x-vector $와 PLDA의 오픈 소스 구현은 이미 많이 존재하며, pyannote.audio는 아직 이러한 접근 방식의 다른 버전을 제공하지 않는다.
대신에, clustering step은 사전에 정의된(일반적으로 cosine) distance에 대해 직접 최적화된 speaker embedding을 훈련하기 위해 metric learning approach를 사용해 간소화되며, PLDA와 같은 기술의 필요성을 줄인다. Table 4.에 보고된 대로, 증가하는 metric learning approach collection이 pyannote.audio.embedding에 구현되어 이 접근 방식 모음에 대한 통합 프레임 워크를 제공한다.
다른 블록과 마찬가지로, speaker embedding은 제작한 feature들이나 waveform에서 직접 end-to-end 방식으로 학습할 수 있다. pre-trained end-to-end model은 Vox Celeb speaker verification task에서 최첨단 성능에 도달하지 못하지만, Table 5.에서는 일부 speaker diarization test set에서 최첨단 성능으로 이어진다는 것을 보여준다.
5. TUNABLE PIPELINES
각 building block은 개별적으로 training 해야 하지만, pyannote.audio.pipeline은 이것을 speaker diarization pipeline으로 결합하는데, 이 pipeline의 하이퍼파라미터는 diarization error rate를 최소화하기 위해 공동으로 optimized된다. [Neural Speech Turn Segmentation and Affinity Propagation for Speaker Diarization]에서 논의한 대로, 이 joint optimization process는 일반적으로 서로 독립적으로 조정된 여러 building block의 조합보다 더 나은 결과를 가져온다. Table 5.는 [Neural Speech Turn Segmentation and Affinity Propagation for Speaker Diarization]에서 도입한 pipeline의 결과를 보고하는데, 이 pipeline에서는 voice activity detection을 위한 VAD와 speaker change detection을 위한 SCD를 포함해 여러 하이퍼 파리미터가 공동으로 optimized 되었다. 또한 re-segmentation step에서 overlapped speech detection 를 통합해 개선된 점을 보고한다.
6. REPRODUCIBLE RESULTS
pyannote.audio는 Figure 1에 나열된 module의 training, validation 및 application을 위한 일련의 명령줄 도구를 제공한다. pyannote.metrics 및 구성 파일의 체계적 사용을 통해 reproducible research가 용이해지고, pyannote.database를 사용해 train/dev/eval split을 적용함으로써 머신 러닝 모범 사례가 보장된다.
또한 voice activity detection을 위한 Figure 1, speaker change detection을 위한 Figure 2, overlapped speech detection을 위한 Figure 3, speaker embedding을 위한 Figure 4에서 이미 보고된 pre-trained model collection이 함께 제공된다. speaker embedding은 VoxCeleb에서 훈련 및 테스트되었지만, 다른 모든 모델(전체 diarization pipeline 포함)은 AMI의 회의, ETAPE의 방송 뉴스, DIHARD의 최대 11개 도메인 등 광범위한 도메인을 포함하는 세 가지 다른 데이터 세트에서 training, tunning, test되었다.
이것은 모두 Figure 2에 나와 있는 일반 PyanNet architecture에 의존한다. sequence labeling task는 1차 및 2차 미분과 함께 25ms window에서 10ms 마다 추출된 19개의 handcrafted MFCC 계수 또는 학습 가능한 SincNet function을 사용해 2초의 audio chunk에서 학습했다. end-to-end variant은 handcrafted features 기반의 변형보다 speaker embedding(아직 handcrafted features variant을 학습하지 않음)을 제외한 모든 작업에서 지속적으로 성능이 뛰어나 대부분의 경우 새로운 최첨단 성능을 정의한다.
나머지 network에는 two stacked bi-directional LSTM recurrent layers(forward와 backward 모두 128개 units 포함), no temporal pooling, two feed forward layers(128units, tanh activation), final classification layer(2 units, softmax activation)이 포함된다. speaker embedding은 약간 더 넓고(128개 대신 512개의 unit), 더 깊은(2개 대신 3개의 recurrent layer) network를 사용하고, $ x-vector $와 유사한 statistical temporal pooling에 의존하며, 더 짧은 500ms audio chunk에서 학습되었다. training process(epoch 수, optimizer 등)에 대한 자세한 내용은 pyannote.audio repository에서 제공되는 관련 구성 파일에서 직접 확인할 수 있다.