chrome speech synthesis service 개발기

- "크롬을 음성합성 서버"로 사용해보자







"사장님, 스마트 미러가 리눅스에서 잘 안돼요. 어떻하죠?"

.

.

.

작년 말에 접하게 된 마이크로소프트의 에반군이 만든 garage 프로젝트인 스마트미러(Smart Mirror) 에서 확인 했었고, 거의 모든 오픈소스 스마트 미러 프로젝트는 라즈베리파이(RPi)등의 Arm기반 보드에서 "리눅스"로 돌리고 있었기 때문에 믿기 힘든 비보였습니다.


"쫌! 잘해봐. 말이돼냐? (썩소)"  "아니예요, 실제 잘 안된다고 어디서 본것도 같아요.(떨리는 눈빛)"


'에이 설마, 또 초짜 주우우니어 호빗 개발자의 닥질..'  여전히 그 생각이였고, 솔직히 다른 OS에서 다되는데 리눅스에서 안된다는 건 약간은 리눅스(마이프레셔스!)를 데탑으로 끌어 안고 사는 한때 호빗 개발자였던 골름의 밥상에 돌 던진듯한 느낌을 받는... 


그래도 한번 속는셈 치고 들어나 보기로 했습니다.


"그래 뭐가 안된다는 건데?(썩소2)"       "아, 제가 이번에 연동한게 유투브, 지도API, 어쩌구 저쩌구..."

"아 그러니까 뭐가 안된다는 건데?(확신찬 썩소썩소썩소)"           ".. 그러니까.. 저.. 말하는게 안되요!"


"응?!?  혹시 말하기 기능 넣었어?(반짝반짝)"   "..네.."  (이 시점에서 소으니:골름 = 1:0!) 



바로 소으니는 맥에서 잘되는걸 보여줬고, 리눅스에서는 안되는것도 보여줬다. (2:0!)


"아.. 그..러네.  그래도 니가 비동기 방식의 javascript 쓰다가 뭔가 잘못한거?" (쓸데없는 의심, 3:0!)


"네,  그런데 일단 코드가 너무 간단해서... 잘못하기 힘든데요?"







크롬에서 음성합성 예제: HTML5 Speech Synthesis API 사용

========================================





여기서 말하기 기능이라는 것은 '음성합성' 또는 'Speech Synthesis'라고 불립니다.  다들 아시겠지만, 우리가 은행이나 콜센터에 전화를 걸었을 때 자동으로 대답을 해주는 약간 어색한 사람 목소리를 위장한 마디마디 리코딩된 기계음 등이 이 부류입니다.   



코드군: 

var utterance = new SpeechSynthesisUtterance('Hello, 세상');

var voices = window.speechSynthesis.getVoices();


utterance.voice = voices.filter(function(voice) { return voice.name == 'Google 한국의'; })[0];


window.speechSynthesis(utterance);



'잉, 코드군이 너무 간단한데? ' 


뒷목이 뻑뻑한 느낌이 들더군요. 지은죄가 있는지라 몇일 구글군의 힘을 빌어 뒷북 뒤지기를

시작했는데, 음성합성을 쓰기 위해서 엔지니어링 관점에서 몇가지 알고 있어야 될것들이 나왔습니다.




음성합성(Speech Synthesis) 간략정리

=========================


0. Speech Synthesis는 나름 긴역사가 있다.  특히 예전에 sphinxsearch검색하면 검색결과 밀어 

버리고 쓸데 없이 나오던 sphinx도 speech 관련해서 꽤 유명한 놈이더라. (제대로 잡설!)


1. 웹브라우저가 사용할수 있는 Speech Synthesis API는  Speech Recognition API와 나름 2년이나 되었다.  (since google chrome 33+, 현재 쓰고 있는 버젼은 48+)

구글 크롬이야 당연히 지원하고 있었고, 사파리도 지원하고 브라우저들이 다들 지원하는 분위기다.


2.  위의 내용 1을 순진하게 믿고 테스트 하다보면, 지금 그닥 쓸만한 놈은 chrome이다.  

     그리고 된다는 SSML은 아직 안된다.  SSML은 음성합성을 XML로 표기하여 끝말올리기, 반복하기 등을 표기할수 있는 방법입니다.    


3.  그리고 결정적인, Speech Synthesis가 "리눅스에서는 안되고, 맥에서는 된다"는 틀렸다.  



정확한 정보는 "(목소리가 없기 때문에) chromium에서는 안되고, chrome에서는 된다" 이다.  (앗싸.  3:1!)


3번은 알고 나면 허무하지만, 약간의 보충설명이 필요합니다. 그래서 조금 내용을 살펴 보겠습니다.





Chromium은 Chrome과 다르기 때문에 

구글의 완성도 높은  아름다운 목소리를 가져올수 없습니다.

======================================



원래 웹브라우저의 Speech Synthesis API에 대한 표준화 문서를 보면,

Speech Synthesis API는 API이지 실제 voice라는 리소스는 웹브라우저가 

지원(provision)할수도 있고, OS가 지원하는 네이티브 리소스로 (따라서 chrome external) 

voice를 사용할 수도 있습니다. (양자택일!)



그런데, 대부분의 우리가 수행했던 Speech Synthesis의 테스트는 

구글 크롬(default로 날아오는 voice는 google이 제공)했기 때문에 문제가 없었고, 

쓸수 있는 API만 있지만, chromium은 google의 voice API 키가 없기 때문에, 

말할 '목소리'가 없습니다. 


기계가 목소리가 없어서 인간이 안되고 결국 허무하게 여기서 거품으로 끝난다는건 어디서 많이본 

동화같습니다.(아이씨- 언더더씨 네요.)





그럼 소으니가 말했던 스마트 미러가 맥은 되고 리눅스에서는 목소리가 안나오는 이유는 뭘까요?  

네. 우리가 쓴 node.js의 electron은 (예전에는 ATOM으로 불렸었죠) chrom"ium"의 분신이고

따라서 보이스 실물 리소스가 존재하지 않습니다. 구글에서 허락없이 땡겨올수 없기 때문이죠.  

하지만, Mac에서 제공하는 네이티브 목소리가 있기 때문에 맥(electron)에서는 잘 되었던거고,

리눅스(electron)에서는 안된겁니다.  여기서 "댕~"하는 상황은 리눅스의 chrome에서는 되니까

더 헛갈린겁니다.  알고나면, 구글의 chrome이니까.  구글 목소리니까 당연한거죠.


즉, 확실한건 chrome != chromium에서 생기는 문제인거요. 


아, 참고로 chromium을 걍 컴파일 해서 쓸까 (electron) 했는데요, 저같은 생각을

하는 골름들이 무지 많나 봅니다. chromium 사이트에 노란색 볼드체 으로 

이렇게 적혀 있네요. ㅎ


https://www.chromium.org/developers/how-tos/api-keys





"Do NOT post to the various Chromium groups/mailing lists for questions about the Speech API."


(헐- 넹. 골름골름)



Chrome에서 사용 가능한 목소리들은 OS별로 살짝 다릅니다. 
========================================

실제 가장 많이들 쓰시는 Windows 10(7,8도 비슷할겁니다)에서 chrome을 사용하면 
운영체제가 제공하는 네이티브목소리 (언어별로 하나씩 있는듯 보입니다!) 한개만 
"Lang"환경에 딱 맞춰서 추가 사용가능하며, 크롬에서는 가지고 있는 목소리
다주세요 라고 하면 구글 목소리 리스트에 딸랑 한개 더 얹어서 나옵니다.  맥의 
경우에는 맥이 제공하는 목소리들 전체를 "Lang"환경을  고려하지 않고 모두 다 선택할수 
있게 주즈륵 보태서 보여줍니다.  
(아, 나름 맥의 목소리 리스트도 구글군같이 아름답습니다) 


그럼 모바일 환경에서는 어떨까요?  일단 안드로이드의 크롬에서는 구글의 많은 언어별 
목소리가 리스트로는 다 사용가능한것 처럼 나옵니다. 이건 근데 나름 함정입니다. 
다른 언어의 목소리를 선택하더라도 같은 목소리 한개의 목소리만 나오는데, 우리나라의 
경우(ko-KR)를 예로 들면, 한국 여성분의 목소리 하나로 통일되어 나옵니다. 
다른 목소리를 듣고 싶으시면, 안드로이드의 OS언어환경을 바꾸시면 그 환경에
맞는 한개의 목소리만 나옵니다.  즉 동시에 두개의 언어의 목소리는 들을수 
없습니다.  이런 접근은 Windows의 접근이랑 비슷합니다.
(네. 착한 구글군이 요즘은 많이 다르네요.  아마도 단일 언어 사용자가 대부분인 OS 
환경을 고려한 배려이겠지만서도, 선택 따위는 니가가라 하와이~네요. OS가 되는 순간, 
약간 거만한 느낌이 듭니다. 쩝.)  

참 여담으로 애플사의 iPad 에서는 chrome이 뭐가 잘못되었는지 소리가 안나더군요.  
그리고 ChromeOS/ChromeBit는 없어서 테스트 못해봤습니다.

Note:  그리고 약간 더 헛갈리는건 다같은 chrome이라도 안드로이드의 목소리 
이름(voice name)이 데탑용 OS에서 와는 다르게 나옵니다.  예를들어, 
원도우,맥,리눅스 OS에서는 구글의 우리나라 목소리는 "Google 한국의"(ko-KR) 인데 
한국어일때는 "대한민국" 한국 으로 나오고, 영어일때는 심지어 
"Korean South Korea"(ko_KR)로 나옵니다.  

범용적 웹어플 만들때 무지 곤란할것 같습니다.


그럼, 크로미엄(chromium)기반 또는 
스마트 미러에서 목소리가 나오게 하려면 어떻게 해야 할까요?
===================================================

힘듭니다. 대신 정품 무료 chrome을 쓰시면 됩니다. 하지만, kiosk같이 원도우 매니저의 기능으로 
웹앱을 만드시려면, 또는 저희같이 node.js electron.js 를 쓰려면 얄짜없이 OS에서 
제공하는 목소리를  fallback됩니다. 

근데 이렇게 대충 하다보면 개발비 백만원짜리 거울아거울아 탄생도 가능합니다.  두둥. 

이건 여러모로 봅잡하죠. 그래도 꼭 하시고 싶으시면 OS를 구분으로 제가 생각할수 있는 몇가지 
옵션을 생각해 볼수 있습니다.  일단 제 개인적인 생각이니 참고만 하시면 좋겠네요.  
(가정: 모든 OS에서 node.js electron은 돕니다.)    

1) 원도우로 한다.   
   일단 제일 싸고 입맛에 맞는 저렴한 Intel Stick PC (아톰 기반) 나 패드를 약 10만원에 구입합니다.
   원도우8 깔려있으니 걍 쓰거나 7월전에 빨리 10으로 공짜 업그레이드 합니다.  작고 이쁘고 나쁘지 
   않은 옵션인듯 보입니다. (RPi2관련 약 2배 정도 가격으로 생각하시면 되지만서도)

2) 맥으로한다.  
  미친척하고 1)에 해킨토시를 설치한다. 근데요, 아톰은 설치가 안된다는 이야기가 있던데요. 
  이런 도전은 정신건강에 해로울수 있습니다.

3) 리눅스로 한다. 
    아, 그런데 RPi/odroid가 안되네요. 으..   Intel Stick PC도 안되네요.  (위설명 참조) 으...
   3)이 안된다는것  심히 골름골름합니다. 그래서 RPi는 구글님이 chrome을 안주니 
     (chromium만 존재) 포기 하더라도,  인텔에서 안되는건 진짜 못참겠습니다.  

(아, RPi qemu로 x86 emul 하면 어떨지는 모르겠네요. OS2개 크롬(미엄) 2개? ㅎ)
     

 포기하기는 좀 그렇고, 뭔가 하면 될것도 같은데요?




Note:  참, 여기 한번 가보세요. http://labs.naver.com/ 
      이번 스마트 미러 프로젝트에 필요한 모든 기술을 다 똬악 모아서 하고 있네요. ㅎ
      나름 열심히 잘하는것 같기는 합니다.  음성인식/음성합성/기계번역등은 앞으로 IT의 발전에
      중요한 공공재와 같다고  생각합니다.  그런 취지에서 보면 정말 칭찬해주고 싶습니다.  
      어째튼, 막써야 되는 공공재를 약간 조심스럽고 고급스럽게 접근하는게 제 취향은 아닌듯 보입니다.


그럼 내 데스크탑 Chrome을 서버로 써서, 
"Chrome이 대신 말하게" 하면 어떨까요?=============================




이렇게 하면, 위의 인텔PC 기반에서 리눅스(마이프레셔스!)에서 돌릴수 있습니다.
그리고 여차하면, RPi를 그냥 쓰고 말하기를 딴데로 보낼수도 있습니다. 
(물론 생각해 보면  다시 택배 받을수도 있을겁니다. WebRTC? ㅋ 가난하게 살다보면 뭐..)



어째튼, Chrome을 서버로 쓰는걸 만들기로 해봅니다, 골름골름~



그래서 Chrome을 웹 보이스 서버로 세워봤습니다.
==================================

준비물:

0) 스피커 달린 Intel PC + 마이프레셔스  (뭐 개발용 아무거나)
1) 웹서버 (node.js, express 씁시다. npm install 좋던데요?)
2) 대신 말해줄 google chrome (네 여기 까지는 구글군이 꽁짜로 줍니다)

여기서 문제는 1)과 2)의 연결 문제인데요, 제가 동굴에서 물고기를 쌩으로 자바(script) 먹을 때랑은
다른 새로운 세상이 열렸더군요. socket.io라는 그물(socket)으로 편하게 잡을수 있더군요.

그래서 그걸로 1)과 2)를 연결하면 되겠더군요.

... 그리고  결과물이 여기 있습니다.  코드는 이것저것 빌려왔는데, 
만들다 보니 살짝 재미있는 장난감이 나왔습니다.


쓸데없는 소리 이제 그만!  Show Me! Please talk to me!

======================================





1)  기본테스트:   


너그러운 마음에서 데모 한번 봐주시고,  


http://speech.embian.com/



2)  확장테스트:


재미로 준비한 추가 데모 꼭 해보시고, 한번 쭉 소리나는거 들으시고, 

*setting: 의 en-GB 를 ko-KR로 바꿔 들어 보세요 ㅎ

(강추! 우리집 꼬마가 좋아합니다.)

중국어/영어/일어/스페인어등 언어 공부하시는 분들 무료로 활용법을 찾으시면

만든 골름은 무지 감사할것 같습니다. 


http://speech.embian.com/rap



3)  혹시 수정이나 설치 필요하신 분 계시면 github에서 오픈소스로 제공합니다.

https://github.com/embian-inc/chrome-speech-synthesis



아, 외로운 친구의 PC/폰에 크롬띄워놓고 이성의 목소리로 "밥 먹으로 가요"를 

날려볼수 있습니다.  퍽이나 재미집니다.  골름골름~




맺음말

=====


동굴에 들어간지 오래 되어 소스가 날것이라 전혀 이쁘지는 않습니다. 

지나가던 저희 개발자 호빗 무리들이 무지 비웃었습니다. 


하지만, 골름은 사랑받기 위해서 

태어난 한때 호빗이였던 아이입니다.              이뻐해 주시면 좋겠네요. (최종스코어:  3:2!)


그럼 전 가족부양하러 물고기 잡으러 다시 동굴로 돌아갑니다.긴글 읽어 주셔서 감사합니다. 


마이프레셔스, 골름골름~

  


ps 결국 구글님이 무료로 열어줘서 편하게 쓰지 않을까 생각합니다. 언젠가는 ^^ 

아님 네이버님, 왓쓴님 이라도.  아니면 누군가는 문익점 되서 디지탈씨앗 몇개 날라야죠, 뭐. 






References:


Standard for Web Speech Synthesis

* https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#examples-synthesis


Standard for SSML

* http://stackoverflow.com/questions/21952736/the-right-way-to-use-ssml-with-web-speech-api

* https://www.w3.org/TR/speech-synthesis11/#edef_emphasis


Main Code of Speech Synthesis API Example

* http://blog.teamtreehouse.com/getting-started-speech-synthesis-api



신고
Posted by 골름골름