반응형

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


 이전 포스팅(http://alnova2.tistory.com/1230)에서는 Hot-Word Detection을 살펴 보았습니다. 이번 포스팅에서는 음성인식에 대해서 살펴 보도록 하겠습니다. 한국어 음성인식읃 몇몇 회사에서 제공하고 있습니다. 대표적으로 구글 Cloud Speech-to-Text가 있으며, 네이버, 카카오 그리고 최근에는 KT에서 개발자들에게 음성인식을 제공하고 있습니다. 네이버, 카카오 등은 모바일, 즉 안드로아드와 iOS에서 개발 가능한 SDK를 제공하는 형태로 되어 있어서 Tinker Board에서는(라즈베리 파이도 동일) 사용이 불가능합니다. 본 포스팅에서는 구글 Cloud Speech-to-Text를 이용한 음성인식을 알아보겠습니다.


[구글 Cloud Speech-to-Text]

구글 Cloud Speech-to-Text의 경우 두가지 프로토콜로 음성인식 API를 이용할 수 있습니다. 첫번째로 녹음된 PCM wav 파일을 HTTP 프로토콜을 통해서 전송하고 결과를 수신하는 Rest API 방식과 gRPC라는 HTTP2기반의 RPC 프로토콜을 이용한 방법이 있습니다. Rest API 방식은 녹음이 완료된 파일을 전달하고 최종 결과를 받을수 있습니다. 반면에 gRPC 방식은 녹음 파일을 전달하고 최종 결과를 받거나, PCM 데이터를 스트리밍으로 전송하고, 전송된 음성 데이터의 인식 결과를 스트리밍 텍스트로 받을 수 있습니다. AI 스피커의 경우 녹음 시작점을 Hot-Word Detection으로 잡을 수 있으나, 음성의 끝점을 잡기가 어렵습니다. (이를 위해서는 특별한 기술들이 필요합니다.) PCM 데이터를 스트리밍으로 전송하는 방법은 음성을 다 끝내면 끝점을 잡아서 종료해주는 듯 합니다. 본 포스팅에서는 스트림 방식의 API를 이용해 보도록 하겠습니다.


1. Credential 신청

구글 Cloud Speech-to-Text를 사용하기 위해서는 구글 Cloud Platform 개발자로 등록 해야 합니다. 등록 후 Speech API를 사용하기 위한 Credential을 신청해야 하는데요. Credential 신청은 구글 개발자 콘솔에서 가능합니다. 다음과 같이 credential을 신청-다운로드 합니다.

 https://console.cloud.google.com 로 이동하여 로그인합니다. 로그인하면 다음과 같은 화면이 보이는데요. 왼쪽 위 Google Cloud Platform 글자 옆을 클릭하면 프로젝트를 생성 또는 선택할 수 있습니다.


왼쪽 메뉴에 보면 API및 서비스 메뉴가 있습니다. 


클릭해서 들어가면 왼쪽 메뉴에 "사용자 인증 정보"가 있습니다. "사용자 인증 정보" 메뉴를 클릭하면 "사용자 인증 정보 만들기가 보입니다. 사용자 인증정보를 만들 때 "서비스 계정 키"를 선택합니다.

이후 서비스 계정을 선택하도록 되어 있는데, 서비스 계정은 생성하고 JSON 파일을 다운로드 합니다. (파일을 grpckey.json 으로 저장하겠습니다.)


2. GRPC로 음성인식 

node.js 프로그래밍 언어로 GRPC 음성인식을 테스트 해보겠습니다. 구글 cloud speech-to-text API를 위한 node.js 모듈은 다음과 같이 설치 가능합니다.


npm install --save @google-cloud/speech


녹음을 위해서 node-record-lpcm16 모듈을 설치합니다. 


npm install node-record-lpcm16


다음은 googls cloud speech api를 이용해서 마이크에서 입력을 받아서 음성인식 결과를 넘겨주는 코드 입니다.

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

const speech=require('@google-cloud/speech');

const projectId='project_id_in_json';

const keyfile='./grpckey.json'; //---1)

const client=new speech.SpeechClient({

projectId:projectId,

keyFilename:keyfile

}); //---2)

const request={

config:{

encoding:'LINEAR16',

sampleRateHertz:16000,

languageCode:'ko-KR'

},

interimResults:false

}; //---3)


const recognizeStream = client.streamingRecognize(request); //---4)

recognizeStream.on('error',

(error)=>{

console.log('recognizeStream Error:'+error);

mic.unpipe(recognizeStream);

recognizeStream.end();

}); //---5)

recognizeStream.on('data',

(data) =>{

console.log('date received:'+JSON.stringify(data));

if(data.results[0] && data.results[0].alternatives[0]){

let sayData= data.results[0].alternatives[0].transcript

console.log(sayData);

recognizeStream.end();

mic.unpipe(recognizeStream);

record.stop();

process.exit(0);

}

}

); //---6)

const mic= record.start({

    sampleRateHertz: 16000,

    threshold: 0,

    verbose: false,

    recordProgram: 'arecord',

    silence: '10.0',

}) //---7)

mic.pipe(recognizeStream);  //---8)

코드를 설명드리겠습니다.

1) Credential 신청에서 다운로드한 json 파일 경로를 설정해 줍니다.

2) speechClient 객체를 생성합니다. 이때 projectid와 credential json 파일 경로를 넣어 줍니다. (projectId는 credential json 파일을 열어보면 project_id 항목에 있습니다.)

3) 요청 파라미터를 설정합니다. node모듈이 마이크에서 데이터를 가져오는 형식과 일치해야 합니다. 16000Hz 샘플링 레이트 Linear16 형식으로 언어 코드는 한국어(ko-KR)를 설정합니다. interlimResult는 중간중간 결과를 받을수 있도록 해줍니다. interimResult를 true로 설정하게 되면 음성인식기 되는대로 결과를 넘겨 주게 되어 있습니다. 이 경우 6)에서 결과를 받을때 스트림을 종료하는 코드를 변경해 주어야 합니다.

4) streamingRecognize 객체를 생성합니다. streamingRecognize는 스트림을 받아서 인식 결과를 넘겨주는 객체입니다.

5) error 발생시 처리할 콜백을 등록합니다.

6) data를 받을떄 처리할 콜백을 등록합니다. interlimResult가 false이기 때문에 결과는 최종 인식된 결과를 받게 됩니다. 인식 결과를 받으면 프로세스를 종료하도록 하였습니다.

7) 마이크에서 음성 데이터를 가져오기 시작합니다. 레코딩 프로그램은 arecord를 이용하였고 16000Hz 로 샘플링 합니다.

8) 마이크 입력 스트림을 recognizeStream 객체로 연결해서 전달합니다.


google_stt.js 로 저장하고 node.js google_stt.js 로 실행합니다. 다음은 실행 결과 입니다.



구글 CLoud Speech API는 월 60분이 무료 입니다. 60분 초과는 과금이 되는데요, 다음의 가격표를 참고해서 테스트 해야 할듯 합니다.



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




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

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

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



반응형
Posted by alias
,