[Flutter] STT를 이용한 한국어의 발화적 텍스트 유사도 측정 라이브러리 만들기(1)

Yellowtoast·2024년 3월 11일
2

Flutter

목록 보기
4/6

해당 글은 한국어 특성 기반의 STT 엔진 정확도를 위한 정량적 평가방법 연구 : 민소연, 이광형, 이동선, 류동엽(2020) 논문을 참고하여 작성되었습니다.

특정 텍스트의 발화적 유사도를 측정하는 라이브러리를 구현하는 과정에 대한 글입니다.

기본 구현 원리

가장 쉽게 구현할 수 있는 방법은 기존 pub.dev의 STT 패키지를 이용하여 단순 음성을 텍스트로 변환하고, 원본 텍스트와 변환된 텍스트를 고전 알고리즘으로 비교하는 방식입니다.

이를 위해 N-gram, 레벤스타인 거리(Levenshtein Distance), 유클리디언 거리(Euclidean Distance) 등의 고전 알고리즘을 사용할 수 있겠습니다.

문제점

하지만 위의 방법은 사용자의 발화가 정확히 의도한 바의 텍스트로 변환되지 않았을 경우 문제가 발생할 수 있습니다.

STT : "산 톡기 톡기야 어 데를 가는야"
원본 텍스트 : "산 토끼 토끼야 어디를 가느냐"

위의 두가지 텍스트는 고전 알고리즘(N-gram)을 사용하였을 때 약 0.19의 유사도로 측정됩니다.
하지만 한국어의 발화적 특성을 고려하면 더 높은 유사도를 가진 것으로 측정되어야 합니다.

결국 위의 문제는 2가지로 정리할 수 있습니다.

  1. STT 성능에 대한 신뢰
  2. 결과값(STT)과 원본 텍스트의 유사도 측정 알고리즘이 '한국어' 특성에 맞게 설계되었는가

1. STT 성능에 대한 신뢰 문제

고도화된 머신러닝 모델을 가지고 STT 정확도를 증가시킬수는 있겠으나, 흔하게 사용되는 STT 텍스트 모델은 문자열의 형태와 순서만이 아닌 의미와 맥락 정보까지 임베딩 데이터에 들어가므로, 단순 발화적 유사성을 측정하고자 할 때에는 적절하지 않습니다.

또한 일반적으로 라이브러리를 통해 가져다 쓸수있는 STT 기능들은 최대한 발화된 텍스트와 가까운 텍스트로 변환하도록 내부적으로 구현되어있습니다.

따라서 해당 라이브러리에서는 별다른 머신러닝 모델의 사용 없이 기본적인 STT 기능만을 사용하기로 하였습니다.

2. 한국어 특성에 맞는 텍스트 유사도 알고리즘 설계

한글은 영어처럼 알파벳으로 이루어지지 않 고 초,중,종성이 하나의 글자를 이루며, 뜻은 다르지만 동일한 발음을 내는 문자가 많습니다. 예를 들면 ‘게’와 ‘개’같은 경우는 STT변환이 난해해지게 됩니다. 또한 위에서 제시한 예시 또한 비슷한 상황입니다.

원본 텍스트 : "산 토끼 토끼야 어디를 가느냐"
STT : "산 톡기 톡기야 어 데를 가는야"

원본 텍스트 : "밥 먹었어요?"
STT : "밥 머겄서요?"

구현 방향

우선 기존의 STT기능을 사용하였을 경우 변환된 텍스트에 대해 온전히 신뢰할 수 없습니다. 두음법칙, 연음법칙, 외래어 변환, 숫자 변환 등에 대해서 어떻게 원본 텍스트를 생성하느냐가 달라질 수 있기 때문입니다.

따라서 기존의 STT가 명확한 텍스트로 변환되지 않았을 경우에도 STT와 원본 텍스트의 비교에 있어 정확도를 높이는 알고리즘의 설계가 필요합니다.

즉, 아래와 같은 한국어 특성에 기반한 알고리즘의 설계가 필요합니다.

  1. 초,중,종성에 따른 고려가 필요함
  2. 숫자, 날짜, 기호에 대한 변환기준이 필요함

다음 글에서는 위의 구현 방향을 기준으로 레벤스타인 거리(Levenshtein Distance) 알고리즘을 일부 변형하여 한국어 특성에 기반한 유사도 측정 알고리즘을 만들어 보겠습니다.

profile
Flutter App Developer

0개의 댓글