반응형

본 체험 제품은 아이씨뱅큐(주)에서 진행하는 무상 체험단 활동으로 작성한 것입니다.


 최근에  AI 스피커가 핫하다고 할수 있는데요. AI 스피커의 핵심 기능들은 1) 음성인식, 2) 텍스트 해석, 3) 해석결과에 따른 서비스 제공 등이 될것 같습니다.  구글과 여러 회사들(국내에서는 네이버, KT등이 관련 서비스를 제공하네요.) 이 음성인식-텍스트 해석 등에 대한 API 를 제공하고 일정부분은 무료로 사용할 수 있습니다. 일반 개발자들이 개발-테스트 또는 개인적 활용 정도로는 사용할수 있을듯 합니다.


 이번 포스팅과 이후 포스팅에서는 Tinker Board S와 공개된 여러 솔루션, API등을 이용해서 AI 스피커를 만드는 과정을 설명해 보도록 하겠습니다. 첫번째로, 음성명령을 대기하게 하는 Hot-Word Detection (또는 Key-word Spotting)에 대해서 포스팅 해볼까 합니다.


[Snowboy를 Hotword-Detector로 활용하기]


1. Background

Hot-Word Detection  으로 사용할수 있는 것은 (그것도 성능이 좋은 것은..) 그리 많지 않습니다. 대표적인 솔루션이   snowboy(https://snowboy.kitt.ai/) 인데요.  snowboy는 자기 목소리를 학습시켜서, hot-word 로 설정할수 있습니다. 가격 정책은 다음과 같습니다.


일반 개발자가 개인 용도로 쓰는 것은 큰 문제가 없어 보입니다.


 Hot-Word 는 훈련된 모델을 기반으로 하는데요, 두가지 종류가 있습니다. ".pmdl" 로 끝나는 Personal 모델과 ".umdl"로 끝나는 universal 한 모델이 있습니다.  Personal 모델은 audio sample을 제공한 사람에게만 동작하는 것으로 개인 목소리를 학습시켜서 학습시킨 목소리에만 detection 합니다. universal 한 모델은 특정 단어들에 대해서 snowboy에서 여러 목소리에 반응하도록 제공하는 것인데요. "alexa", "snowboy","jarvis", "smart mirror" 등에 대해서 Hot-word detection을 제공합니다. 다시 말해 Personal 모델은 자기가 원하는 단어를 Hot-Word로 등록할 수 있습니다. 하지만 녹음한 본인의 목소리만 인식하는 단점이 있습니다. Universal 모델은 지정된 단어만 사용 가능합니다. 그렇지만 여러 사람의 목소리를 인식하는 장점이 있습니다. 

 이 사이트에서는 다른 사람이 등록한 Personal 모델의 녹음에 참여할 수 있습니다. 사이트에서 보면 2000개의 샘플이 녹음되면 universal 모델로 올라갈 수 있다고 합니다.



2. 마이크 및 Y connector 준비

Tinker Board의 경우 http://alnova2.tistory.com/1223 에서 소개해 드린 것처럼 오디오 칩을 탑재하고 있습니다. 이 오디오 칩은 Recording을 지원하고 3.5mm audio jack으로 microphone 입력이 가능합니다. 아래 그림의 맨 오른쪽 Standard(Apple) connector에 해당합니다. 


일반적으로 로 마이크가 달려 있는 이어폰/헤드폰이 호환됩니다.AI 스피커로 활용하려면 입력/출력을 분리해야 하는데, 다음과 같이 Y-connector로 분리할 수 있습니다.



3. Tinker Board설치 S/W 설치

Snowboy는 공식적으로 다음 플랫폼에 대해서 지원합니다.

- all versions of Raspberry Pi (with Raspbian based on Debian Jessie 8.0)

- 64bit Mac OS X

- 64bit Ubuntu 14.04

- iOS

- Android

- ARM64 (aarch64, Ubuntu 16.04)


Tinker Board는 공식 지원하지 않는걸로 되어 있습니다. 이번 포스팅에서는 node.js 프로그래밍 언어 기반으로 설명하도록 하겠습니다.


node.js에서는 쉽게 설치 가능하며 잘 동작합니다. node.js 에서 다음과 명령어로 snowboy 패키지를 설치할 수 있습니다..


npm install snowboy


snowboy 동작을 위해서는 다음의 matrix 계산을 위한 atlas 라이브러리 설치가 필요합니다. 


sudo apt-get install libatlas-base-dev


node.js 에서 마이크 녹음을 위하여 다음의 패키지를 설치합니다.


npm install node-record-lpcm16


snowboy 모듈을 이용하기 위해서는 node snowboyd 모듈 설치 폴더(./node_modules/snowboy) 의 resources 폴더에 있는 common.res 가 필요하고 이 폴더에 있는 호출어 모델이 필요합니다.(resources/model/snowboy.umdl')


4. 예제 실행

다음은 기본으로 제공하는 예제를 환경에 맞게 수정한 코드 입니다.

const record = require('node-record-lpcm16');

const Detector = require('snowboy').Detector; //---1)

const Models = require('snowboy').Models; //---2)


const models = new Models();


models.add({

  file: 'resources/models/snowboy.umdl',

  sensitivity: '0.5',

  hotwords : 'snowboy'

}); //---3)


const detector = new Detector({

  resource: "resources/common.res",

  models: models,

  audioGain: 2.0,

  applyFrontend: true

});


detector.on('silence', function () {

  console.log('silence');

});


detector.on('sound', function (buffer) {

  // <buffer> contains the last chunk of the audio that triggers the "sound"

  // event. It could be written to a wav stream.

  console.log('sound');

});


detector.on('error', function () {

  console.log('error');

}); 


detector.on('hotword', function (index, hotword, buffer) {

  // <buffer> contains the last chunk of the audio that triggers the "hotword"

  // event. It could be written to a wav stream. You will have to use it

  // together with the <buffer> in the "sound" event if you want to get audio

  // data after the hotword.

  //console.log(buffer);

  console.log('hotword', index, hotword);

}); //---4)

const mic = record.start({

        sampleRateHertz:16000,

        threshold: 0,

        verbose: false,

        recordProgram:'arecord',

        silence:'10.0'

}); //---5)

mic.pipe(detector); //---6)


코드는 간단히 설명드리겠습니다. 

1), 2) : snowboy 모듈의 Detector와 Models 객체를 로드합니다.

3) : 모델을 추가해 줍니다. 여기에서 snowboy.umdl 이라는 universal 모델을 설정해 줍니다. 이 모델은 "스노우보이"에 대해서 인식합니다.

4) : detector에서 hotword 이벤트가 발생하면, Hot-Word가 detect 되었다는 것입니다. 

5) : arecord 프로그램을 이용해서 샘플 레이트 16000Hz로 녹음 데이터를 가져오도록 레코드 객체(node-record-lpcm16)을 설정합니다. 대체로 음성인식은 16000Hz Sample Rate, Single Channel, 16bit linear signed integer 의 샘플 데이터를 이용합니다.


실행 시키고, "snowboy"를 마이크에 발화하여 인식이 되면 "hotword 1 snowboy"라는 텍트스가 보입니다.



5. Personal 모델 등록

Personal 모델을 등록해 보도록 하겠습니다. https://snowboy.kitt.ai/ 에 접속해서 login in 합니다. login은 github, 구글, 페이스북 계정을 이용할 수 있습니다. 로그인 하면 다음과 같은 Dashboard 화면이 보입니다.


여기에서 "Create Hotword"를 클릭해서 들어가면 다음처럼 설정하는 화면이 나옵니다.

이름과 언어를 선택하고 다음으로 넘어가면 다음과 같이 녹음할수 있는 화면이 나옵니다. 녹음시에는 웹브라우저에서 접근할 수 있는 마이크 장치가 있어야 합니다. (웹캠으로도 충분합니다.)


녹음하면 다음과 같이 테스트하고 다운로드 할 수 있는 화면이 나타납니다.

다운로드 하면 pmdl 이 다운로드 됩니다. 이 파일을 tinker board로 옮기고 이전 예제의 snowboy.umdl 을 이 파일 이름으로 대체해서 동일하게 테스트 할 수 있습니다.


다음은 음성인식에 대해서 포스팅하도록 하겠습니다.




- ASUS 팅커보드 S 공식 구입처: 아이씨뱅큐 http://www.icbanq.com/

- 아이씨뱅큐 공식 카페: http://cafe.naver.com/icbanq

- 아이씨뱅큐 공식 블로그: http://blog.naver.com/icbanq









반응형
Posted by alias
,