HTML5/HTML News 2014.04.18 17:54 신고

패턴인식(Pattern Recognition)의 한 분야인 음성인식은 오늘날(현 2014년) 많이 대중화가 되어있고, 다양한 분야에서 활용되고 있습니다.  음성인식에서 두각을 나타내고있는 여러 대기업들중 Google에서 제공하는 STT(Speech To Text)의 활용법에 대해 간단히 정리한 내용입니다.  글쓴이는 음성인식 분야에 무지하며, 이를 참조해서 읽어주세요.

 

인식률은 사람의 성별, 사용된 마이크, 주변 잡음, 인식할 단어의 수, 얼마나 문법적으로 올바른 문장을 발화하는가 등 다양한 요소에 의해서 좌우됩니다. 따라서 인식 성능이 얼마나 나올 것인가를 결정하려면 이러한 조건들이 명확하게 알아야하고, 그 후에야 대강의 성능을 예측하여 볼 수 있습니다.

[출처] 음성인터페이스연구실 게시판 발췌하였습니다.

1. Google의 음성인식

① x-webkit-speech (HTML5 Speech Input API)

2011년 Google이 자사 브라우저 Chrome 버전11.0.696.16 Beta 버전부터 HTML5 Speech Input API Specification를 지원하였습니다. 이는 다른 미들웨어(Flash, ActiveX)의 도움없이 브라우저에서 마이크로부터의 input을 캡쳐해 낼수 있게됩니다.  x-webkit-speech라는 이름으로 input태그에 아래와같이 x-webkit-speech속성만 추가하시면, 음성인식 샘플테스트를 해보실 수 있습니다. 아래 마이크를 클릭하시고 말해보세요~(크롬에서만 동작)

 

 <input x-webkit-speech=”” id=”mike” style=”width:500px;height:100px”>

 <- 마이크 클릭테그의 속성하나만을 추가해도 음성인식이 되는 매력적인 기능이지만 슬프게도 2014년 4월 현재, 다른 브라우저의 지원이 부족하고, 태그의 속성으로만 사용할 수 있기에 확정성이 용이하지 못하였습니다. 이러한 이유로 x-webkit-speech의 사용은 점점 사라져 가는 추세입니다. 대신 자바스크립트API인 Web Speech API가 등장하게 됩니다.

② New Approach : Web Speech API

2013년 Chrome 버전25 부터 Web Speech API Specification를 지원하게 됩니다. 음성을 텍스트포멧으로 변환(Speech To Text, 이하 STT)이 순수 웹브라우저만으로 가능해 졌습니다.

(데모소스코드)

Speech Input API 스펙은 HTML5스펙이었다면, Web Speech API는, HTML5스펙에 포함된 것이 아니라 따로 독립적인 Speech API가 독립적으로 분리되어 있습니다.  Web Speech API 소개를 간추리면 아래와 같습니다.

*출처:Web Speech API Creates Interactive Experiences

③ 크롬브라우저 확장기능인 Google Voice Search Hotword

이 기술을 이용해 Google은 ‘Hands free’라는 모토로 확장기능을 제공하고 있습니다. 이는 Apple의 Siri와 같은 개념으로, 말로써 검색을 하고, 이메일을 보내는 등 좀 더 편리한 PC웹브라우징을 하실 수 있습니다.

Google Voice Search Hotword(beta)로 가셔서 설치하시고, 설정->확장 프로그램-> Google Voice Search Hotword(Beta) 0.1.1.5 사용 설정을 합니다.

google.co.kr 이 아닌 google.com으로 접속하시면 다음과 같이 ‘OK Google’이라고 말하세요. 라는 문구를 검색어 창에서 확인하실 수 있습니다. Apple의 Siri와 같이, Chrome브라우저에서 음성명령만으로 검색이 가능해졌습니다. 단, 아직 베타버전이어서 한국어 지원을 하지 않습니다.

2. 어떻게 동작하는가

Google Speech API는 크게 두가지 형태로 디자인 되었습니다.

첫째, 크롬브라우저에 음성엔진이 built-in

둘째, 구글서버로 음성Data를 보내고 feedback받는 형태

두개지 방법에는 장단점이 있습니다. 크롬브라우저 자체 내에 음성인식엔진이 내장되어 있는경우 서버를 거치지 않기때문에 속도가 빠름니다.  서버를 거치게 될 경우, 내장엔진에 저장되어있는 data보다 훨씬 방대한 data가 저장되어 있기때문에, 내장음성엔진에 비해 정확도가 더 높다고합니다.

3. Google Speech API Server 이용해보기

※ Google Speech API 의 사용은 개발목적과 개인사용에 한합니다.  

① Chromium-dev 가입

Chromium-dev Community로 가셔서 회원가입을 합니다. 가입하지 않으면 API설정에 Speech API 자체가 보이지 않습니다.

② Speech API 사용설정

Chromium-dev에 가입하셨다면 Google Developers Console로 가보면 Speech API가 보일것입니다.  STATUS를 ON으로 바꿔주세요. 하루 50번의 요청제한이 있습니다. 단, 요청횟수를 더 늘릴 수도 있습니다.

③ key만들기

④ Google서버로 요청

Google Speech API를 이용하시려면, HTTP POST 요청을 합니다. Google Speech API v2버전에서는 다음의 두가지 data형식을 인식할 수 있습니다. 클라이언트가 어떤 언어로 되어있든, Google서버에 요청시 아래의 형태를 맞추셔야합니다.

Data 인코딩 정보

1. FLAC

Flac file; 44100Hz 32bit float, exported with Audacity. Check the audio folder in this repository for some hilarious examples.

Channels       : 2

Sample Rate    : 44100

Precision      : 32-bit

Sample Encoding: 32-bit Float

2. 16-bit PCM

The following audio options are confirmed working for 16-bit PCM sample encoding:

Channels       : 1

Sample Rate    : 16000

Precision      : 16-bit

Sample Encoding: 16-bit Signed Integer PCM

요청 Header정보

1. Flac

Content-Type: audio/x-flac; rate=44100;

FLAC파일의 rate와 똑같이 맞춰주셔야 합니다. 일반적으로 44100Hz로 맞추지만, 다른 rate도 지원을 합니다.

2. 16-bit PCM

Content-Type: audio/l16; rate=16000;

16bit signed-integer로 인코딩된 파일은 44100Hz 혹은 16000Hz를 지원합니다.

※주의 : 오디오 캡처할때 rate와 header의 rate는 같아야 합니다!

HOST 주소

https://www.google.com/speech-api/v2/recognize

KEY값
AIzaSyCnl6MRydhw_5fLXIdASxkLJzcJh5iX0M4
 
위의 키값은 위에서 언급한 Google Hotword Chrome Extension에서 쓰이는 키값으로, 소스코드에서 추출한 키값입니다.  Google Developers Console에서 생성된 키값을 입력하여도 되고,  Google Hotword Chrome Extension에서 추출한 키값을 입력하셔도 됩니다. 다만, 생성한 키값은 하루 50회 이용제한이 있고, Google Hotword Chrome Extension에서 추출한 키값은 이용제한이 없습니다.
 
2014년 5월. 위의 키값은 더이상 동작하지 않습니다. Google에서 막아놓은듯 합니다. 그리고 v1버전도 어쩌다 동작할 때도 있는듯 하고, 직접 추출된 50회 이용제한 Key값또한 50회 이상 되고 있군요.  하루중 몇번씩 되었다 안되었다 하는…. ㅠㅠ

LANG값

var langs =

[[‘Afrikaans’,       [‘af-ZA’]],

[‘Bahasa Indonesia’,[‘id-ID’]],

[‘Bahasa Melayu’,   [‘ms-MY’]],

[‘Català’,            [‘ca-ES’]],

[‘Čeština’,          [‘cs-CZ’]],

[‘Deutsch’,         [‘de-DE’]],

[‘English’,          [‘en-AU’, ‘Australia’],

[‘en-CA’, ‘Canada’],

[‘en-IN’, ‘India’],

[‘en-NZ’, ‘New Zealand’],

[‘en-ZA’, ‘South Africa’],

[‘en-GB’, ‘United Kingdom’],

[‘en-US’, ‘United States’]],

[‘Español’,          [‘es-AR’, ‘Argentina’],

[‘es-BO’, ‘Bolivia’],

[‘es-CL’, ‘Chile’],

[‘es-CO’, ‘Colombia’],

[‘es-CR’, ‘Costa Rica’],

[‘es-EC’, ‘Ecuador’],

[‘es-SV’, ‘El Salvador’],

[‘es-ES’, ‘España’],

[‘es-US’, ‘Estados Unidos’],

[‘es-GT’, ‘Guatemala’],

[‘es-HN’, ‘Honduras’],

[‘es-MX’, ‘México’],

[‘es-NI’, ‘Nicaragua’],

[‘es-PA’, ‘Panamá’],

[‘es-PY’, ‘Paraguay’],

[‘es-PE’, ‘Perú’],

[‘es-PR’, ‘Puerto Rico’],

[‘es-DO’, ‘República Dominicana’],

[‘es-UY’, ‘Uruguay’],

[‘es-VE’, ‘Venezuela’]],

[‘Euskara’,         [‘eu-ES’]],

[‘Français’,        [‘fr-FR’]],

[‘Galego’,          [‘gl-ES’]],

[‘Hrvatski’,        [‘hr_HR’]],

[‘IsiZulu’,         [‘zu-ZA’]],

[‘Íslenska’,        [‘is-IS’]],

[‘Italiano’,        [‘it-IT’, ‘Italia’],

[‘it-CH’, ‘Svizzera’]],

[‘Magyar’,          [‘hu-HU’]],

[‘Nederlands’,      [‘nl-NL’]],

[‘Norsk bokmål’,    [‘nb-NO’]],

[‘Polski’,          [‘pl-PL’]],

[‘Português’,       [‘pt-BR’, ‘Brasil’],

[‘pt-PT’, ‘Portugal’]],

[‘Română’,          [‘ro-RO’]],

[‘Slovenčina’,      [‘sk-SK’]],

[‘Suomi’,           [‘fi-FI’]],

[‘Svenska’,         [‘sv-SE’]],

[‘Türkçe’,          [‘tr-TR’]],

[‘български’,       [‘bg-BG’]],

[‘Pусский’,         [‘ru-RU’]],

[‘Српски’,          [‘sr-RS’]],

[‘한국어’,            [‘ko-KR’]],

[‘中文’,             [‘cmn-Hans-CN’, ‘普通话 (中国大陆)’],

[‘cmn-Hans-HK’, ‘普通话 (香港)’],

[‘cmn-Hant-TW’, ‘中文 (台灣)’],

[‘yue-Hant-HK’, ‘粵語 (香港)’]],

[‘日本語’,           [‘ja-JP’]],

[‘Lingua latīna’,   [‘la’]]];

Request 예제 (Flex로 만든 예제, Google서버로 요청하는 부분입니다.)

 .

 .

 .

 var PATH:String = “https://www.google.com/speech-api/v2/recognize?output=json&lang=ko-kr&key=AIzaSyCnl6MRydhw_5fLXIdASxkLJzcJh5iX0M4”;

 var urlRequest:URLRequest = new URLRequest(PATH);

 var urlLoader:URLLoader = new URLLoader();

 urlRequest.contentType = “audio/x-flac; rate=44100”;

//urlRequest.contentType = “audio/l16; rate=16000”;

 urlRequest.data = flacData;

 urlRequest.method = URLRequestMethod.POST;

 urlLoader.dataFormat = URLLoaderDataFormat.TEXT;

 urlLoader.addEventListener(Event.COMPLETE, urlLoader_complete);

 urlLoader.addEventListener(ErrorEvent.ERROR, urlLoader_error);

 urlLoader.load(urlRequest);

.

.

 .

JSON으로 리턴되며, XML은 지원하지 않습니다.

 {

“result”:[

{

“alternative”:[

  {“transcript”:”안녕하세요”,”confidence”:0.57016742}

 ,{“transcript”:”아냐세요”}

 ,{“transcript”:”안냐세요”}

                                          ]

  ,”final”:true

                }

 ]

,”result_index”:0

 }

4. Google Speech API Server를 통해 서비스가 가능한가

Google Speech API는 무료이지만 공식적인 API(Official Public API)는 아닙니다.  말인즉 공식적인 API가 아니므로, Google은 사전예고없이 API를 바꿔버리면 예상치 못한 여러 에로사항이 생길 가능성이 다분합니다. 한가지 예로 2012년 Google의 일방적(?)인 Google Weather API차단으로 이를 이용해 날씨서비스를 하던 많은 기업들이, 다른 Weather API로 갈아탓더랬습니다. (stackoverflow) 또한 위에서 업급했던 것처럼, 개발과 개인에게만 사용을 허가합니다.

5. 흥미로운 음성 엔진들

① Sphinx (100% Open Source Toolkit For Speech Recognition)

CMUPhinx는 미국 펜실베이니아에 위치한 카네기멜론대학(Carnegie Mellon University)의 Sphinx그룹과 Sun Microsystems연구소, Mitsubishi Electric Research Labs (MERL), and Hewlett Packard (HP)들이 협력해서 연구개발중인 음성엔진입니다.  (소스코드Tutorial)

② MIT의 WAMI

WAMI는 MIT 연구실에서 만든 iPhone, iPod Touch 모바일 웹브라우저에서 음성인식을 하는 toolkit입니다. 이것도 역시 오픈소스입니다.

③ Online Speech Recognition API

6. Flex로 구현해본 음성인식 샘플

크로스 브라우징 Google STT 구현을 위해, 마이크Input을 Flex로 받아와서 처리를 해보았습니다.

7. 끝으로…(Graphic User Interface -> Voice User Interface)

후드래빗님의 의견처럼 ‘음성인식 기술이 새로운 인터페이스로 자리잡고 있다’ 에 100% 동의합니다. 아니면 ‘이미 자리잡았다’ 가 될 수도 있겠네요. Warable Device, 자동차, 의료, 스마트TV, 게임, 교육 등등 다양한 분야에 활용되고 있습니다. MS의 코타나, 구글의 Now, 애플의 Siri 등 공룡기업들의 ‘개인비서’ 서비스가 강세를 보이는 가운데, 우리나라에서도 음성인식 기술에 대한 연구가 활발하게 진행중입니다. 대표적으로 2010년 네이버는 음성검색엔진을 자체 기술로 개발하기시작한 이래로, 현재는 Google음성엔진에 못지않은 음성인식률을 보이고 있습니다. ‘다음’은 음성 검색 서비스 강화를 위해 음성인식 전문기업 ‘다이알로이드’를 인수하고, 최근(2014년2월)에 ‘다음’은 국내최초로 국내최초로 ‘모바일 음성 인식 API’ 를 공개하기도 하였습니다.

인공지능과 Voice User Interface의 끝을 보여주는 영화 ‘her’

끝으로 우리나라가 IT강국이라 하지만, 순수 ‘대한민국 소프트웨어 기술’이라 내세울 만한 것 하나 없는 이 현실에서, 소수의 우리나라 음성인식 기술자분들의 노고에 감사를 드립니다~

* 참고 (이 글은 아래의 사이트를 참고로 작성하였습니다.)

* W3C 음성인식 커뮤니티 : W3C Speech API Community Group

* W3C 오디오 API : Web Audio API

* W3C Speech Input : HTML5 Speech Input API Specification

* W3C Speech : Web Speech API Specification

* Web Speech Presentation문서 : Web Speech API Creates Interactive Experiences

* Web Speech API 사용법 : Example on how to user Web Speech API

* Google Speech API v1(Github) – Google Speech To Text API

* Google Speech API v2(Github) – Reverse Engineering Google’s Speech To Text API (v2)

* Chomium Speech 소스코드 – http://src.chromium.org/viewvc/chrome/trunk/src/content/browser/speech/

* 도움글 : Accessing Google Speech API / Chrome 11

* 도움글 : Google’s Speech API (옵션설명)

* 도움글 : stackoverflow질문답변

* nodejs for Google Speech API : Google Speech API wrapper for node

* 관련유틸 : SoX (콘솔 사운드파일 포멧변경유틸)

* 관련기사 : 이젠 노트북과 PC에서도 “OK, 구글” … 구글, 음성 검색 확장 기능 공개

* 관련기사 : 넥서스5의 핵심 기능 ‘Ok Google’, 한국어로는 사용 불가

* 관련글 : 음성검색, ‘열려라 참깨’의 비밀

* 관련글 : KLDP 게시판 글 (음성인식 공부방법, 책, 참고사이트)

* 음성인식 강의 : 충북대학교 권오욱 교수의 음성인식 한글강의

* 충북대학교 : 음성통신연구실 SC Lab

* 카이스트 음성인식연구실 : 한국과학기술원 전기전산학과 음성 인터페이스 연구실

* 음성관련 논문자료 : 사단법인 한국 음성 학회

* 음성/언어정보연구센터 :  ETRI

* HTK 공식 홈페이지 :  http://htk.eng.cam.ac.uk/

* AS3-STT : SimpleSoundApp

* Flash on flac encoder : Flach Encoder

* Flash-Red5-Spring-Sphinx : Java Speech Recognition and Adobe Flex

* Java이용, Google STT 예제 : SPEECH TO TEXT LIBRARY FOR PROCESSING

* Java 음성API 개발 문서 : Java Speech API Programmer’s Guide

* Sphinx관련 URL 모음 : Open Source Speech Software from Carnegie Mellon University

* Sphinx Java 예제 만들기 : How to Make Simple Speech to Text Recognition using Java Sphinx

* 음성인식오픈소스 링크모음 : Open source Speech Projects

* Flash기반 음성인식 예제 : Voice Gesture

* Java기반 음성인식 (TalkingJava SDK 이용, NON-COMMERCIAL 라이센스) : Speech To Text using Java API

* Java 사운드 : Java Sound, An Introduction

저작자 표시 비영리 변경 금지

HTML5 > HTML News‘ 카테고리의 다른 글