root layout

패스트캠퍼스

  1. 강의 질문
  2. AI TECH

클로바노트 프로젝트 화자분리 질문

2025.03.06 12:11 작성

강의 잘 들었습니다.

덕분에 궁금한 부분들 많이 해소되었고 즐거운 학습이 되었어요.


다만 목소리가 비슷하거나 성별이 같은 상대와 대화를 나눈 것을 업로드하여 프로그램을 실행하니 분리가 명확하지 않고 뭉쳐서 결과값이 나오더라구요.


예를들어 화자 1과 2가 말한게 분리되지 않고 뭉쳐서 이어지다가 설정하지 않은 화자 3에게 화자 2의 음성이 할당되는 등의 일이 발생합니다.


제가 해본 해도들


1. 메서드나 threshold 값을 다르게 설정해봤습니다.

-> 설정한 인원수를 초과한 스피커가 출현하거나 음성이 잘려나가는 현상이 발생합니다.


self.pipeline.clustering.method = "complete"

self.pipeline.clustering.threshold = 0.6


2. 음성에 노이즈 제거 전처리를 하고 실행해보았습니다. -> 다소 뭉치는 현상은 줄었지만 단어가 다르게 식별되거나 서로 다른 화자인데 같은 화자에게 배정됩니다.


3. 말투 등으로 구분하는 코드를 넣어봤습니다.

-> 딱히 결과값이 달라지지는 않았습니다.


from difflib import SequenceMatcher


def text_similarity(text1, text2):

"""두 개의 텍스트 유사도를 비교하여 0~1 사이의 점수를 반환"""

return SequenceMatcher(None, text1, text2).ratio()


def refine_speaker_labels(diarization_results): """Whisper 전사된 텍스트를 기반으로 화자 레이블을 보정"""

for i in range(len(diarization_results) - 1): similarity = text_similarity(diarization_results[i]["text"], diarization_results[i+1]["text"]) if similarity > 0.8: # 문장 유사도가 높으면 같은 화자로 인식 diarization_results[i+1]["label"] = diarization_results[i]["label"] return diarization_results


def _match_by_diars(self, segments, diars): matched_segments = [] assigned_segments = set() for diar in diars: diar_text = "" for segment in segments: if (segment["start"], segment["end"]) in assigned_segments: continue # 겹치는 구간 계산 overlap = min(segment["end"], diar["end"]) - max(segment["start"], diar["start"]) if overlap > -0.1: diar_text += " " + segment["text"] assigned_segments.add((segment["start"], segment["end"])) matched_segments.append({ "start": diar["start"], "end": diar["end"], "label": diar["label"], "text": diar_text.strip() })

# Whisper 전사된 텍스트 기반으로 화자 레이블 보정 matched_segments = refine_speaker_labels(matched_segments) return matched_segments


제가 어떤 부분을 설정하거나 추가해보면 좋을까요?


ps. 클로바노트를 이용해봤는데 음성이 비슷하거나 동성인 경우 동일하게 다른 화자에게 배정되는 문제는 생겨도 한 사람이 말이 끝나고 다른 사람이 말할때 그것에 대한 분리는 잘 되더라구요.

그래서 분명 해결 가능한 문제라고 믿고싶습니다!



답변 

연관 질문

커뮤니티 질문보기