소소한 컴퓨터 이야기

음성 탐지, Voice Activity Detection 작업 일지

by Cori

회의록 서비스 성능 고도화 프로젝트의 일환으로, 이전 포스트에서 설명한 화자 구분 프로세스 중 Voice Activity Detection 적용 과정을 여기에 기록한다. 사실, 해당 파트는 허깅페이스에 공개되어 있는 모델을 사용하고 있어 정리할 내용이 많이 없다. 그래서 여기서는 VAD 자체 내용 보다는, VAD를 STT 및 화자 구분에 어떻게 사용하고 있는지 소개하는 내용을 주로 다룬다. 


0. VAD 모델

VAD는 음성 파일에서 음성 구간이 존재하는 지점을 탐지하는 작업으로, 여러 오픈 소스 모델들이 공개되어 있다. 현재 사용중인 모델은 Hugging Face에 올라와있는 Pyannote 모델이다. Pyannote 에서 화자 구분 파이프라인을 공개해두었는데, 해당 파이프라인을 사용중이기 때문에 다른 모델을 사용하는 것은 따로 고려하지 않았다. 

 

다만 이렇게 모델 소개를 마치기에는 아쉽기에 다른 모델도 소개하니, 관심 있는 분들은 다른 모델들도 사용해보기 바란다. 

 

1. 화자구분 & STT 파이프라인에서의 VAD 활용

이전에 소개한 Front-end Processing을 적용한 오디오 파일은, 화자 고유의 음성 벡터 값도 변형시키기 때문에 화자 구분 및 STT모델에 직접적으로 사용하기 힘들거 같다는 말을 잠깐 했었다. 실제로 Front-end Processing을 적용한 오디오 파일에 대해 각 작업을 수행했을 때, 성능이 원본 파일보다 떨어지는 것도 확인했다. 다만, VAD의 경우 화자별 음성 정보값을 직접적으로 필요로 하지 않기에, Front-end Processing을 적용한 오디오 파일을 사용하는 것이 가능하고, 그렇게 사용하고 있다. 

 

화자 구분 파이프라인의 경우, 원본 파일에 대한 화자 구분 결과값 (발화 시간, 발화 종료 시간, 화자 정보)을 추가 검증하는데 VAD를 활용할 수 있다. 원본 오디오 파일에 대해 화자 구분을 수행하면, 생각보다 화자 외 잡음이나 추임새, 웃음 소리 등 불필요한 정보도 화자로 구분해버리는 경우가 허다하다. 그것도, 새로운 화자 정보로 말이다. 그렇다고 원본 오디오 파일에 Front-end Processing을 적용하고 난 후 화자 구분을 수행하면, 화자 고유의 임베딩 정보가 뭉개져서 다른 화자의 발언을 동일 화자로 구분하거나, 동일 화자의 발언을 다른 화자로 구분하는 경우가 빈번했다.

 

그래서 생각한 것이, 원본 파일에 대해 화자 구분을 적용한 후, Front-end Processing을 적용해 추출한 VAD 타임라인과 비교해서 추가 필터링하는 방법(Resegmentation)이다. 화자 구분을 통해 얻은 타임라인과 VAD를 통해 얻은 타임라인. 이 둘의 교집합을 구해서, VAD 타임라인과 겹치지 않는 화자 구분 타임라인 값들을 제거하는 방식으로 활용하기로 했다. 실제로 다음과 같이 겹쳐지지 않는 구간을 출력해보니, 0.5초 이하의 매우 짧은 구간 혹은 길이가 길지만 웃음소리 등의 무의미한 정보가 포함된 구간들이 필터링 되는 것을 확인할 수 있었다. 

 

STT 파이프라인의 경우, STT를 적용하기 전에 음성 구간을 검출하고, 검출된 음성 구간에 대해서만 STT를 수행하도록 하는데 VAD를 활용할 수 있다. STT 모델은 생성형 모델이다 보니, 음성이 포함되지 않은 구간에 대해서도 어떤 말이든 생성해내려 하는 경향이 강하다. 이번 서비스를 구축하며 가장 많이 본 할루시네이션 문장으로 'MBC 뉴스 이덕영입니다, 시청해주셔서 감사합니다' 등이 있다. 이러한 문장들은 STT 모델의 파라미터 설정으로 걸러내는 데에는 한계가 있었다. no speech prob 값으로 필터링하는 경우, 음성 파일의 품질이 좋지 않은 경우 일반적인 음성도 no speech prob 값을 높게 예측해버려 함께 필터링되는 경우가 많았다. temperature 값으로 필터링하는 경우, 보통 저렇게 모델이 창작한 문장은 temperature 값이 1처럼 높게 나오는데, 창작했으나 0으로 반환하는 경우도 꽤 빈번해서 완벽한 품질을 보장하기 힘들었다. 

 

그래서 고안한 것이, 원본 파일에 Front-end Processing을 적용해 추출한 VAD 타임라인을 활용하는 것이다. STT 모델은 너무 짧은 음성 파일에 대해서는 성능이 좋지 않기 때문에, VAD 타임라인을 그룹화시키고, 음성이 존재하는 구간에 대해 STT를 수행하도록 구성했다. 그룹화 길이 설정 값에 따라 STT 결과가 달라지는 거 같아 이 부분은 좀 더 살펴봐야 하겠지만, 확실히 무음 구간에서 나타나던 이상한 문장들의 발생 빈도가 대폭 줄어든 것을 확인할 수 있었다.


이 파트는 생각보다 소개할 내용이 많지 않아 VAD를 어떻게 활용하는지에 대해 간단하게 언급하고 마무리한다. 다른 인사이트가 있다면 공유해주시면 감사할 거 같다.

블로그의 정보

코딩하는 오리

Cori

활동하기