Deep Learning/NLP, ASR

[NLP / ASR] pyannote.audio diarization 의문점 정리

LiaLi_1997 2023. 1. 19. 14:29

pyannot-audio 를 사용해 보면서 생기는 의문점들에 대해 정리하는 곳이다.

1. overlap은 따로 플래그가 존재하지 않는 것 같다.

diarization.for_json() 에서 나오는 track 이라는 플래그는 화자를 구분하기 위한 플래그 인 듯 하다.

diarization.for_json()

{'pyannote': 'Annotation',
 'content': [{'segment': {'start': 10.9603125, 'end': 21.1021875},
   'track': 'A',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 31.665937500000002, 'end': 37.690312500000005},
   'track': 'B',
   'label': 'SPEAKER_00'},
             .
            .
            .
  {'segment': {'start': 155.44406250000003, 'end': 159.0046875},
   'track': 'G',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 158.17781250000002, 'end': 161.48531250000002},
   'track': 'AA',
   'label': 'SPEAKER_01'},
            .
            .
            .
  ],
 'uri': '1_10039'}

diarization.get_overlap().for_json()

{'pyannote': 'Timeline',
 'content': [{'start': 51.56156250000001, 'end': 51.78093750000001},
  {'start': 158.17781250000002, 'end': 159.0046875},
  {'start': 192.53531250000003, 'end': 192.5859375},
  {'start': 197.49656249999998, 'end': 197.6821875},
  {'start': 205.1746875, 'end': 205.19156250000003},
  {'start': 284.3859375, 'end': 284.6728125}],
 'uri': '1_10039'}

위의 overlap json 에서 {'start': 158.17781250000002, 'end': 159.0046875} 부분을
diarization.for_json start 와 end 가 일치하는 것을 찾을수가 없다.
하지만 'start': 158.17781250000002 와 'end': 159.0046875 의 값은 아래처럼 존재하긴 한다.

{'segment': {'start': 155.44406250000003, 'end': 159.0046875},
   'track': 'G',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 158.17781250000002, 'end': 161.48531250000002},
   'track': 'AA',
   'label': 'SPEAKER_01'},

overlay 의 제거가 용이하지 않았던 이유는 위와 같은 이유인 듯 하다.

 

 

2. track 의 의미

track 프로퍼티는 지금까지 테스트 해 본 결과 화자의 각 순서와 연관이 있었다.

SPEAKER_00, SPEAKER_01 이 존재한다고 가정하면

SPEAKER_00 의 발화 순서가 A, B, C ... AE 라고 하면

SPEAKER_01 의 발화 순서가 AF, AG, AH ... BZ 형태로 나오게 된다.

{'pyannote': 'Annotation',
 'content': [{'segment': {'start': 10.9603125, 'end': 21.1021875},
   'track': 'A',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 31.665937500000002, 'end': 37.690312500000005},
   'track': 'B',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 50.144062500000004, 'end': 51.9665625},
   'track': 'O',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 51.56156250000001, 'end': 51.78093750000001},
   'track': 'C',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 52.7934375, 'end': 53.97468750000001},
   'track': 'P',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 53.97468750000001, 'end': 59.57718750000001},
   'track': 'D',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 59.948437500000004, 'end': 60.21843750000001},
   'track': 'Q',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 60.85968750000001, 'end': 63.79593750000001},
   'track': 'R',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 68.2340625, 'end': 69.3309375},
   'track': 'S',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 71.3221875, 'end': 76.8065625},
   'track': 'T',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 81.2278125, 'end': 85.0921875},
   'track': 'U',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 91.6565625, 'end': 94.0528125},
   'track': 'V',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 94.1540625, 'end': 100.6509375},
   'track': 'E',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 101.56218750000001, 'end': 106.82718750000001},
   'track': 'W',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 112.4971875, 'end': 117.77906250000001},
   'track': 'X',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 121.7278125, 'end': 122.0990625},
   'track': 'Y',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 137.30343750000003, 'end': 143.10843749999998},
   'track': 'F',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 144.44156250000003, 'end': 145.99406249999998},
   'track': 'Z',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 155.44406250000003, 'end': 159.0046875},
   'track': 'G',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 158.17781250000002, 'end': 161.48531250000002},
   'track': 'AA',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 169.1296875, 'end': 177.24656249999998},
   'track': 'H',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 181.5834375, 'end': 187.0340625},
   'track': 'AB',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 188.7553125, 'end': 189.61593750000003},
   'track': 'AC',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 190.94906250000003, 'end': 193.93593750000002},
   'track': 'AD',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 192.53531250000003, 'end': 192.5859375},
   'track': 'I',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 194.96531249999998, 'end': 195.84281249999998},
   'track': 'AE',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 197.10843749999998, 'end': 198.6609375},
   'track': 'AF',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 197.49656249999998, 'end': 197.6821875},
   'track': 'J',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 199.3696875, 'end': 201.39468750000003},
   'track': 'AG',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 204.09468750000002, 'end': 206.3390625},
   'track': 'AH',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 205.1746875, 'end': 205.19156250000003},
   'track': 'K',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 215.8565625, 'end': 221.1721875},
   'track': 'L',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 222.5390625, 'end': 225.05343750000003},
   'track': 'AI',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 227.8040625, 'end': 229.7446875},
   'track': 'AJ',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 231.4659375, 'end': 232.74843750000002},
   'track': 'AK',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 234.6721875, 'end': 236.3596875},
   'track': 'AL',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 237.57468750000004, 'end': 240.8146875},
   'track': 'AM',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 245.9615625, 'end': 248.4928125},
   'track': 'AN',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 251.80031250000002, 'end': 255.25968749999998},
   'track': 'AO',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 262.0603125, 'end': 262.9040625},
   'track': 'M',
   'label': 'SPEAKER_00'},
  {'segment': {'start': 262.92093750000004, 'end': 268.2534375},
   'track': 'AP',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 269.0971875, 'end': 270.3290625},
   'track': 'AQ',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 270.9534375, 'end': 275.61093750000003},
   'track': 'AR',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 277.6359375, 'end': 282.0234375},
   'track': 'AS',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 282.96843750000005, 'end': 284.6728125},
   'track': 'AT',
   'label': 'SPEAKER_01'},
  {'segment': {'start': 284.3859375, 'end': 286.4615625},
   'track': 'N',
   'label': 'SPEAKER_00'}],
 'uri': '1_10039'}

 

정리하자면 아래와 같다.

1. pyannote-audio 의 speaker-diarization 은 애초에 overlap 을 고려하지 않는다.

2. pyannote-audio 의 detect-overlap 메소드에서 overlap 에 대한 부분을 따로 추출하는 듯 하다.

--> 즉 diarization 에서 overlap segment 를 포함하는 것이 아니라 애초에 화자 분리 이후에 overlap 을 계산하는 것 같다.

아직 이 부분이 명확하지 않아서 조금 더 찾아보고 글을 수정해야 할 것 같다.