음성인식 텍스트로 실시간 음성 합성하기 – Speech to Text to Speech

우선 이 영상을 참고하자. 특유의 덜렁이 속성과 귀여움으로 사랑받고 있는 버추얼 유튜버 “노라캣”의 첫 자기소개 영상이다. 지금 채널이나 모델은 이 영상과 다르며, 현재 채널 링크는 여기에.

자기소개에서 언급했듯, 음성인식된 텍스트를 보이스로이드로 실시간으로 변환해 말하는 방식을 사용하고 있다. 이 과정에서 오인식이 잦아 이상한 말이 나오기도 하지만, 어쨌든 귀여우면 그만인 세상이다.

그렇다면 이 음성인식 → 음성합성 구조는 어떻게 만들어야 할까? 우선 음성인식(STT, Speech to Text)부터 알아보자. 음성인식을 하려면 딥러닝을 사용해 음성을 학습시키고, 학습시킨 음성을 토대로 입력된 음성을 제대로 문자로 변환할 수 있어야 한다. 그리고 음성 자료의 질과 양이 무조건 좋고 많을수록 음성인식의 퀄리티가 높아지며, 어지간히 있어서는 기대하는 결과를 얻을 수가 없다. 이런 것을 처음부터 시작하려면 당연히 머리가 아프다. 하지만 지금이 어떤 시대인가. 우리는 이미 만들어진 서비스를 사용하는 것으로 쉽게 음성인식을 사용할 수 있다. 예를 들면 구글이나 네이버의 클라우드 플랫폼, 그리고 검색해보면 다른 API들도 나오는데, 일단은 구글 클라우드 STT를 사용하였다. 보통 이런 서비스는 시간당 요금을 책정하는데, 구글의 경우 60분까지는 무료로 사용할 수 있다. 네이버도 비슷한 정책을 가지고 있을 것이다. 정말로 돈을 낼 수가 없다면 오픈소스 STT 프로젝트도 있는 것 같으니 그 쪽을 찾아보면 좋을 것 같다. Kaldi라는 음성인식 툴킷을 기반으로 한 Zeroth라는 한국어 음성인식 오픈소스 프로젝트가 있다고 한다.

다음은 음성합성(TTS, Text to Speech)이다. 아쉽게도 한국어 환경에서는 보이스로이드나 보컬로이드같은 목적을 가진 음성합성 시스템은 없어 보인다. 흔히 생각하는 보이스웨어 같은 종류 뿐이라, 이걸 캐릭터에 써먹기는 좋지 않아 보인다. 구글 TTS는 한국어 음성이 남성 뿐이다. 그래서 일단은 네이버 TTS를 사용하기로 했다. 웹 API 방식으로, URL 넣고 API에 맞는 명령을 주면 음성 파일을 내뱉는 방식이다.

선택한 방식은 구글 클라우드 STT → 파이썬 3 → 네이버 TTS API 이다. 물론 구글과 네이버 각각 플랫폼에 서비스, API 사용 신청을 해야 하며, 결제 수단도 등록해야 한다. 결제 수단이 없거나 해서 안 된다면 오픈소스 쪽을 찾아봐야 할 것이다.

구글 클라우드 STT의 음성 인식 스트리밍 예제를 가져와서, 결과값을 네이버 API로 보내도록 약간의 수정을 가했다. 그 결과, 음성 파일이 MP3 형태로 제대로 출력되었다. 하지만 음성 파일이 저장되었을 뿐 재생되지는 않는다. 이것을 파이썬에서 재생하는 것도 골치가 아픈데, 주로 쓰이는 라이브러리로 pyaudio라는 것이 있으나 이것은 wav 파일만 재생 가능하고, pygame은 파이썬으로 게임을 만들 때 쓰이는 라이브러리로, mp3 재생이 가능하나 재생이 끝났다는 것을 알 수가 없어서인지 sleep 함수를 넣는 것 같다.

지금은 여기서 막히고 있다. 현재 pygame 라이브러리를 사용해 mp3 파일을 두 번 정도 재생하면 오류가 나버린다. 그리고 결론적으로, 노라캣과 비슷한 시스템을 구축했으나 음성이 마음에 들지 않아 망했다는 것이다.