김훈: AI in Kakao
일반적으로 사람들이 생각하는 음성인식 서비스는 사람과 대화할 때처럼 자신의 말에 적절히 반응하거나 명령을 수행하는 등 기계가 자신의 의도를 파악해 반응하는 과정 전체를 생각한다. 이 과정은 크게 사용자의 음성을 문자 정보로 변환하는 과정, 변환된 문자 정보에서 사용자의 의도를 파악하는 과정, 적절한 액션을 취하는 과정으로 나눌 수 있다. 음성을 문자 정보로 변환하는 과정을 음성인식, 문자 정보로부터 사용자의 의도를 파악하는 과정을 자연어 처리라 부른다.
당연히 음성인식과 자연어 처리 모두 좋은 성능을 보일 때 유용한 음성인식 서비스가 가능하다. 음성인식 단계에서 틀리면 자연어 처리 성능이 아무리 뛰어나다고 하더라도 전체 시스템이 제대로 동작하지 못할 것이므로 음성인식 성능이 음성을 이용한 서비스의 전제 조건이 된다.
이 글에서는 자연어 처리 과정은 빼고 사람이 발성한 음성을 문자 정보로 변환하는 음성인식 방법에 대한 주요 개념을 소개하고, 카카오에서는 음성인식 성능을 높이기 위해 무슨 일을 하고 있고 이렇게 개발된 음성인식 엔진을 어떻게 활용하고 있는지에 대해 설명하고자 한다.
[카카오 AI 리포트] Vol. 6 (2017년 8월호) 는 다음 내용으로 구성되어 있습니다.
[1] Industry - 데이터와 음성인식
01. 하용호 : 머신러닝 적용의 실제, 논문이 가르쳐주지 않는것들
02. 김훈 : 음성인식 방법과 카카오i의 음성형엔진 (이번글)
[2] Trends - 생생한 AI 현장의 이야기
04. 하영식 : AI 접목된 의료영상의 주요 플레이어들
[3] Learning - AI 연구 동향과 강화학습 개념
06. 엄태웅 : 딥러닝 연구의 현재와 미래 part 2
07. 최성준, 이경재 : 알파고를 탄생시킨 강화학습의 비밀 part 2
[4] Information
[카카오 AI 리포트] Vol. 6 전체글 다운받기
내용 중간의 [ ]는 뒷부분에 설명 및 관련 문헌의 소개 내용이 있음을 알리는 부호입니다. 예를 들어, [1]에 대한 설명은 '설명 및 참고문헌'의 첫 번째에 해당합니다.
음성인식 개요
음성인식 과정을 단순화 하면 [그림 1]과 같이 입력된 음성에 대해 여러 단계의 처리과정을 거친 후 단어 열로 변환해 출력해 주는 것이다. 음성인식은 입력된 음성이 어떤 단어들로 이루어져 있을 확률이 가장 높은가를 찾는 문제로 다음과 같이 정의할 수 있다.
‘일정 길이 T 동안 입력된 음성 sequence X 에 대해서 인식기가 표현할 수 있는 모든 단어들의 조합 중 확률적으로 가장 가능성이 높은 단어 열 W는 무엇인가’가 된다. 수식으로 표현하면 [수식 1] 과 같다.
여기서 P(X|W)은 음향 모델 확률로 W라는 단어를 발성했을 때 X라는 신호적 특성이 발성될 확률이다. 사용자가 ‘카카오’ 라고 발음한다고 가정할 때 모델링 된 음항모델을 이용해서 P(X|카카오), P(X|카키색), P(X|카드) 등의 확률을 구해보면, P(X|카카오)가 가장 높은 확률값을 보일 것이다. P(W)는 언어모델이라고 하는데 음성신호 특징에 해당하는 X가 없다. 이 값은 음성신호와 관계없이 그 음성이 무엇이라고 예측하는 값으로 어떤 단어가 말해질 확률을 미리 계산해 가지고 있다. 단어가 말해질 언어적 확률은 일반적으로 대량의 텍스트 말뭉치(text corpus)에서 단어의 발생 빈도를 계산해 구한다. 음성인식 과정은 크게 음성분석, 음향모델 계산, 언어모델 계산, 디코딩의 4단계로 나눌 수 있다.
음성분석
음성신호에서 주파수 분석을 통해 음성의 특징되는 부분을 추출하는 과정을 말한다. 음성인식을 위해서는 음성을 마이크로폰(mic)을 이용해 디지털 신호로 바꾸는데 이 과정을 샘플링 이라고 한다. 대체로 1/16000 초 간격으로 음성의 크기를 측정하고 각 샘플은 2byte short 로 표현한다. 이렇게 음성을 샘플링 했을 때, 1초의 음성이 가질 수 있는 경우의 수는 2^(16000*2*8)이다. 이 값은 대략 10^100000정도로 1 다음에 0을 10만개 써야 할 만큼 큰 수이다. 이는 같은 사람이 같은 단어를 여러 번 발음한다고 해도 동일한 값이 나올 확률은 0에 가깝다는 뜻이다.
이렇게 항상 다른 값을 갖는 데이터 이지만 사람은 어떤 음성이 ‘가’ 인지 ‘나’인지 누구의 소리인지 등을 구별하며 의사 소통을 한다. 이렇게 할 수 있는 이유는 최소한 사람이 음성을 인식하는 과정에서 음성을 샘플 단위 하나 하나로 구별하며 인식하지 않기 때문일 것이다. 음성이 가질 수 있는 다양한 변이를 훨씬 작은 차원으로 줄인 후 어떤 특징을 인지하기 때문에 말을 알아들을 수 있다.
위에 보이는 그림은 ‘카카오’ 라고 발성했을 때의 음성파형이다. 발성 기관인 성대의 떨림 정도와 성도의 모양 변화에 따른 공기 흐름으로 여러 소리가 만들어 지는데 성대의 떨림 정도나 모양이 급격하게 변할 수 없으므로 음성은 짧은 구간(보통 0.02초)동안의 주기적인 특성(quasi-stationary)으로 가정하고, 이 단위로 음성을 분석하며 소리가 만들어진 상태를 예측한다. 0.02초 길이의 음성 파형을 어떤 주파수적인 특성을 갖는지 분석하는 등 여러 단계의 신호처리과정을 거쳐 최종적으로 수십 개의 숫자들로 표현하는데, 이 값들을 특징 벡터라고 한다.
음향모델
음향모델링은 음성을 0.02초 구간을 0.01초씩 시간축에 따라 움직이며 만든 특징 벡터열 X와 어휘 셋 W에 대해 P(X|W) 확률을 학습하는 과정이다. 고전적인 음성인식은 음소를 GMM(Gaussian Mixture Model)으로 모델링하고 이 음소들의 연속적 변화를 HMM(Hidden Markov Model)으로 예측하는 GMM-HMM 방식인데 GMM 확률 모델 부분만을 딥러닝(deep learning, DNN)으로 대체하는 방법(DNN-HMM[1]) 과 HMM으로 음성의 변화를 예측하는 부분까지 포함하여 신경망으로 대체한 종단 간(end-to-end) 방식으로 음성인식을 구현하는 많은 시도가 있다[2][3].
종단 간 방식은 기존 음성인식 구현을 위해 필요한 신호처리, 발음변환, 언어모델, 디코딩 단계에 전문적인 지식이 개입하는 것을 최소화하면서 이 부분의 모델링을 신경망이 학습하게 함으로써 뛰어난 성능을 보이고 있다. 하지만 아직은 GMM 확률 모델링 부분만 DNN으로 대체한 DNN-HMM에 기반한 음성인식이 가장 좋은 성능을 보인다. End-to-End 기반 음성인식이 번역에서처럼 기존 통계적 방법을 뛰어넘지 못하는 것은 입력인 음성 sequence 길이 T 가 출력인 문자열 개수 N에 비해 아주 긴 프로세스이기 때문이 아닐까 한다.
1초짜리 음성을 샘플로 보면 T=16,000, 특징벡터를 추출하는 간격으로 봐도 T=100 sequence이고 이때 output sequence N=1~3개로 T>>N 인 프로세스이다.DNN으로 모델링 할 때 신경망(neural network) 구조를 CNN(convolutional neural network), LSTM(long short-term model), FNN(fully connected neural network) 중 어떤 구조를 사용할 것인지에 따라 약간씩 성능 차이는 있지만 그 차이는 그리 크지 않다. 단어 W는 음소 단위 조합으로 만들어졌다고 보고 일정 간격으로 발생하는 특징 벡터에 대해 이 시점 어떤 음소가 가장 높은 확률을 가져야 하는지를 타겟(target)으로 모델을 학습한다. [그림4]은 DNN 음향모델을 표현한 것이다.
음향모델 학습을 위해서는 음성데이터와 이 음성데이터는무슨 문장을 발성한 것인지에 대한 원고(script)가 있어야 한다. 음성데이터 수집을 위해 원고를 주고 사람들에게 읽게 해서 녹음하거나 음성만 녹음된 데이터가 있을 경우 이를 사람이 듣고 정답을 달아주는 옮겨쓰기(transcription) 작업이 필요하다. 원고를 주고 읽어서 수집한 데이터는 아무래도 실제 사용자 환경을 반영했다고 볼 수 없다. 그러므로 이 데이터를 이용해 프로토타입을 만들고 그 후 서비스를 하면서 입력되는 로그 데이터를 활용하여 실제 사용자 환경을 반영한 음향모델을 학습시킨다.
언어모델
언어모델은 방대한 텍스트를 분석해 모델을 만들어 현재 인식되고 있는 단어들 간의 결합 확률을 예측하는 과정이다. 언어모델에서는 특정 단어 다음에 나올 단어의 확률 추정이 이뤄진다. 언어모델은 단어들 간의 관계를 확률로 나타내어 서로 관계가 높은 단어들이 결합할 가능성을 높이는 역할을 한다. 언어모델을 이용하면, 발음이 비슷한 단어가 많거나 불분명하게 발음되어 음향모델으로만 판단했을 때 잘못된 인식이 발생할 위험을 낮춘다.
예를 들어 ‘나는 점심으로 밥을 먹었다’ 라고 발음했다고 할 때 ‘점심으로’ 다음에 음향모델에만 의존하는 ‘밥’이 발음이 비슷한 ‘방’, ‘밤’ 등으로 잘못 인식될 수 있다. 언어모델은 이러한 문제의 발생을 차단하는 역할을 하는 것이다. 언어모델은 탐색할 필요가 없는 단어를 사전에 걸러 내어, 결과적으로 음성 인식 속도를 높이는 데 기여한다. N개의 단어로 구성된 문장 W, W1,W2,W3 .....,WN 에 대해서 문장 생성 확률은 다음과 같다.
이때 문장이 길어짐에 따라 확률 계산이 현실적이지 않게 되어 최근 n개의 history로 근사화 한다. 이를 n-gram 모델이라고 하는데 대용량 데이터를 이용하여 통계적 모델로 학습한다. N-gram 모델링 부분을 DNN 기반으로 학습한 많은 시도가 있었고 높은 성능을 보이는 경우도 있지만 음성인식에서는 아직 통계적 n-gram 방법에 비해 비효율적이라 많이 사용되지 않는다.
언어모델은 해당 도메인의 텍스트(text) 데이터를 최대한 많이 수집한 후 단어들 간의 통계적 특성을 추출한다.이때 서비스 하고자 하는 도메인에 적합한 데이터를 최대한 많이 수집해야 하는 것은 기본이며 수집된 데이터에 포함된 오타나 띄어쓰기 오류 등을 얼마나 잘 수정했는지에 따라 언어모델의 성능이 좌우된다.
디코딩
음향모델과 언어모델로 구성된 탐색 공간에서 가장 최적인 경로를 찾는 과정으로 음성이 어떤 단어열을 나타내는지를 추정한다. 연속음성인식 디코딩은 문장을 이룰 단어의 개수와 각 단어의 경계에 제한을 두지 않고 탐색하는 것으로 그 경우의 수가 크다.
인식해야 할 음성이 N개의 단어라고 가정하고 음성의 발화 길이가 T개라고 하면 이는 T 개의 frame에서 N-1개의 경계를 찾는 문제로 발생할 총 가지수는T^(N-1)이다.5초의 음성이 6단어 정도로 이루어 졌다고 만 해도 T=500, N=6 이므로 500^5 = 약 2500억개 경우를 탐색해야 한다. 이 탐색과정을 효율적으로 수행하기 위해 음성인식에서는 크게 Lexical Tree 기반 디코딩과 wFST(Weighted Finite State Transducer) 기반 디코딩(decoding)을 이용한다.
Lexical Tree 기반 디코딩은 HMM, Context 정보, 발음열, 문법정보를 별도로 구현한 후 인식 시 네크워크를 만들어 가면서 탐색한다. Lexical Tree는 음향학적 특성이 같은 노드들을 공유해 탐색공간을 줄일 수 있지만 leaf node에 도달하기 전에는 언어모델을 적용할 수 없어 인식률이 저하될 수 있다.
wFST는 HMM 모델, context 정보, 문법정보에 사용되는 망을 하나의 통일된 틀로서 결합하고 최적화할 수 있는 장점이 있다. 최근에 발표되는 대어휘(large vocabulary) 음성인식 엔진 대부분이 wFST 기반의 디코더 기술을 사용하고 있는 것으로 알려져 있다[4]. wFST는 결합한 네트워크를 미리 만들어 놓고 탐색하는 방식으로 빠르고 정확하지만 어휘나 언어모델이 약간만 변경되어도 네트워크를 다시 구성해야 하고 어휘와 언어모델이 커지면 네트워크 수립 시에 많은 메모리가 필요하다.
카카오 음성인식/합성 기술의 API 공개
음성인식을 이용하면 기기의 복잡한 기능을 사람과 대화하듯이 자연스럽게 풀어주고 단계를 거쳐야 하는 기능을 한번에 쉽게 사용할 수 있는 등 인터페이스로서 많은 장점을 가지고 있어 오래전부터 지속적인 연구개발이 진행되어 온 분야이다. 오랜 역사를 가지고 여러 시행착오를 거치며 음성인식 기술 각 단계별로 특징 벡터는 무엇을 사용해야 하고 음향모델링은 어떻게 하는게 좋은지에 대한 표준이 거의 정해져 있다. 최근 음성인식기의 성능이 많이 향상된 것은 딥러닝을 이용한 음향모델링의 개선을 제외하면 특별한 알고리듬이 새로 개발되었기 때문이 아니다.
카카오 음성기술도 다른 음성인식 업체와 비교해 알고리듬이나 기술에 있어 큰 차별점은 없다.단지 실수없이 기본에 충실하게 개발된 엔진이 있고 이를 적용할 서비스를 운영하고 있으며 이 과정에서 축적되는 데이터를 잘 활용하고 있을 뿐이다.
음성인식 개발 과정을 보면 결국은 기계를 학습시키는 것으로 다양한 데이터를 많이 학습할 수록 뛰어난 성능을 발휘한다. 일정 수준 이상 되는 프로토타입 인식기를 개발하고 이를 적절한 서비스에 적용하면 사용자로부터 실제 상황의 데이터가 수집되고 이를 이용해 성능을 개선하면 편리성을 느낀 사용자가 더 많이 사용하면서 더 다양한 데이터가 축적되고 이는 다시 성능 개선에 활용된다. 카카오는 개발된 음성인식/합성 기술을 카카오 자체서비스인 다음, 카카오내비, 카카오맵, 카카오택시, 카카오 드라이버, 카카오톡 치즈[5], 멜론[6]앱 등 다양한 분야에 적용하고 있다. 대부분 음성인식 기술을 이용한 음성검색이며 음성합성은 다음 뉴스를 음성으로 읽어 주는 서비스에 활용되고 있다.
이렇게 서비스를 운영하며 쌓인 데이터로 업그레이드 된 음성인식 엔진은 다른 회사에서도 성능을 인정받아 자체 서비스 이외에 현대차[7], LG유플러스[8], KT[9] 에도 음성기술을 제공하고 있다. 카카오에서 개발한 음성인식/합성 엔진은 기술을 공유해 많은 영역에서 음성을 기반으로 한 발전을 가능하게 할 목적으로 오픈API로 공개하였다. 2014년 2월 음성인식, 2014년 6월 음성합성 기술을 하루 5000회 호출까지 무료로 사용할 수 있는 형태로 오픈했고 2017년 1월부터 무료이용 기준 범위를 하루 2만 회까지 확대했다.
현재까지 카카오 음성 API를 이용해 음성관련 서비스를 하고 있거나 시도해 본 기업 및 개인은 470여 곳이다. 쇼핑, 교육, 병원 등 다양하게 분포돼 있다. 특히 주소나 지역명 검색 빈도가 높은 업종에서 효율적으로 사용되고 있다. 카카오 음성인식 API는 다음과 같은 4가지 서비스 모드를 지원한다.
[ 카카오 음성인식 API 4가지 서비스 ]
고립어(service type word)
연속어(service type dictation)
웹검색(service type web)
지도(service type local)
카카오가 제공하는 음성 API 이용에 대한 자세한 내용은 카카오 디벨로퍼스 홈페이지(https://developers.kakao.com/features/ platform#음성)를 참조하면 된다.
음성인식은 인식방법에 따라 고립어 인식과 연속어 인식으로 나눌 수 있다. 고립어 인식이란 정의된 어휘 중 어느 한 단어만을 발음했을 것으로 가정하고 인식하는 것이며, 연속어 인식이란 정해진 어휘들의 조합으로 발생할 수 있는 모든 경우를 발음했을 것으로 가정하고 인식하는 것이다.
예를 들어, 음성인식기가 인식할 수 있는 단어가 ‘카카오’, ‘인공지능’ 두 단어라고 하면 고립어 인식은 입력된 음성이 ‘카카오’나 ‘인공지능’ 둘 중 하나일 것으로 가정하고 ‘카카오’ 아니면 ‘인공지능’ 이라고 답한다. 연속어 인식은 ‘카카오 인공지능’, ‘카카오 인공지능 카카오’, ‘카카오 카카오 카카오’ 등과 같이 두 단어의 조합으로 만들어질 수 있는 어떤 어휘도 모두 인식하는 방법이다.
검색어, 주소, 지역 정보(point of interest, POI) 인식과 같이 인식해야 할 어휘의 조합이 거의 무한대인 경우는 연속어 인식 기술을 사용해야 한다. 고립어 인식은 명령어나 ‘예’, ‘아니오’ 와 같이 사용자의 발화 형태를 명확히 예측 할 수 있는 상황에서 사용하면 연속어 방식에 비해 높은 인식 성능을 얻을 수 있다. 고립어 모드에 사용할 어휘는 개발자가 텍스트 형태로 정의해서 입력해 주면 그 어휘 중에서만 인식한다. 음성 검색, 로컬 검색, 딕테이션에 적용된 연속 음성인식기의 인식사전은 100만 단어 규모로 100만 단어들의 조합으로 가능한 모든 문장을 인식대상으로 한다.
웹검색이나 지도검색 모두 기본적으로는 연속어 인식 방법이지만 언어모델을 그 검색이나 로컬 분야에 대해 특화시켜 놓은 것만 다르다. 음성인식기를 어떤 분야에서 주로 사용할 것인지 예측할 수 있다면 그에 적합한 서비스 모드를 선택해 일반 연속어 모드를 사용하는 것보다 높은 인식률을 얻을 수 있다. 예를 들어 지도 검색의 경우는 인식해야 할 POI는 수백만 개 이상 이지만 지도 검색에서 발생할 만한 패턴을 잘 모델링 할 수 있으므로 다른 서비스 도메인에 비해 인식률이 높다.
[그림 6] 은 언어모델을 세분화 해 잘 모델링하면 하나의 공통된 언어모델을 사용하는 것으로 보이는 구글 음성인식 API보다 얼마나 좋을 수 있는지 실험한 결과이다.
범례에 대한 설명
1) 이 실험은 2016년 6월에 구글 open api를 이용하여 실시됨. 구글 open api를 이용해 구글 음성인식결과를 text 형태로 저장할 수 있게 됨으로써 인식비교가 쉬어졌음. 동일한 음성파일을 구글 api와 카카오 엔진에 각각 입력해서 그 결과로 나온 text를 서로 비교해 인식률을 측정하는 방식임. 과거 구글과 비교 테스트를 위해서는 테스트 화자가 구글앱과 다음앱에 동시에 직접 발화하고 앱에 표시되는 인식 결과를 표시해 counting하는 형태로 이루어져 테스트 화자수와 시간에 제약이 많았으나 인식결과를 text로 저장할 수 있어 훨씬 다양한 환경의 대량의 데이터로 실험할 수 있게 됨. 실험에 사용된 음성파일은 음성인식 앱을 사용하는 사용자들의 음성을 랜덤하게 추출하여 구성함.
2) 실험 결과는 어떤 엔진이 모든 경우에 좋다 이런 뜻이 아님. 사용할 도메인에 잘 맞게 언어모델을 최적화 하면 그렇지 않은 경우에 비해 큰 차이를 보인다는 의미임. 검색, 지도, 문자 등에 사용할 때 거기에 맞는 언어모델을 잘 설계하는게 중요하다는 것을 시사함.
3) 사용자 로그 데이터를 랜덤하게 추출했기에, 양쪽(카카와 구글) 모두에 유불리는 없었음.
두 엔진은 일반적인 문장에 대해 테스트한 딕테이션(dictation) 영역에서는 차이가 없지만 지도검색 분야에서는 지도검색에서 사용할 만한 문장들로 최적화한 언어모델을 사용하는 카카오i의 음성형 엔진이 구글보다 30% 정도 높은 인식률을 보인다. 딕테이션은 모든 음성인식기가 사람말을 받아 쓰는 것을 의미하는데, [그림 6]에서 딕테이션은 영역 제한을 두지 않고 랜덤하게 문장을 추출하는 것을 뜻한다. 이와 같이 음성인식을 사용할 범위(domain)를 적절하게 한정하면 인식률을 비약적으로 높일 수 있다. 카카오의 음성 인식 기술 대상은 현재까지는 한국어에 한정되어 있다.
마치며
최근 음성인식 성능이 비약적으로 향상 되었지만 아직 사용자가 원하는 수준에 미치지 못하는 부분이 많다. 특히 잡음, 반향, 사용하는 디바이스 특징 등으로 인해 음성신호가 학습데이터와 일치하지 않는 상황이나 간투사가 빈번이 발생하고 한번에 발음하지 못하고 버벅거리며 일반적인 어순과 다르게 발음하는 경우가 많은 일반 대화체 상황에서 성능이 급격하게 하락한다. 음성인식에 사용되는 모델링 방법이 사람이 음성을 이해하는 방법을 잘 모델링 했다면 데이터가 많이 투입되고 컴퓨터의 계산 능력이 발전한다면 현재까지 정립된 방법론을 이용해 언젠가는 사람과 비슷하거나 뛰어넘는 음성인식기가 나올 것이다. 하지만 방법이 잘못 되었거나 음성이해 과정을 제대로 모델링하지 못한 부분이 있다면 데이터만 늘린다고 해결 되지 않을 것이다. 카카오는 기존 방법으로 양질의 데이터를 잘 활용해 학습하는 방법과 새로운 접근법을 찾는 연구를 병행하며 인식성능을 개선시키기 위해 노력하고 있다.
글 | 김훈 eldon.kim@kakaocorp.com
어쩌다 보니 이쪽 일을 20년 가까이 하고 있습니다. 이정도 했으면 이 분야에 대해 도가 터야 하는데 아직도 어렵네요. ‘10년 후면 사람처럼 말을 알아듣는 인식기를 만들 수 있을 거’라고 생각했는데, 그 10년이 두 번째 지나고 있습니다. 다음 10년 안에는 음성인식의 모든 문제가 해결됐으면 좋겠고 그 일에 제가 조금은 기여했으면 합니다.
참고문헌
[1] 참고 | G. Hinton, Deep Neural Networks for Acoustic Modeling in Speech Recognition, IEEE Signal Processing Magzine, 2012.
[2] 참고 | Y. Zhang, Towards End-to-End Speech Recognition with Deep Convolutiional Networks, arXiv:1701.02720, 2017.
[3] 참고 | D. Amodei, End-to-End Speech Recognition in english and mandarin, ICLR 2016, 2016.
[4] 참고 | 권오욱, WFST 기반 음성인식 연구동향, 제 21권 제 2호, 컴퓨터정보통신연구 , 2013.
[5] 참고 | http://v.media.daum.net/v/20170727111503886 - 치즈앱에 음성인 식 적용 관련 기사.
[6] 참고 | http://v.media.daum.net/v/20170811084822273 - 멜론앱에 음성으로 음악검 색 적용 관련기사.
[7] 참고 | http://v.media.daum.net/v/20170725030405241 - 현대차 관련 기사.
[8] 참고| http://v.media.daum.net/v/20140310151110273 - LG유플러스 관련 기사
[9] 참고 | http://v.media.daum. net/v/20130912142710116 - KT 관련 기사