반응형

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


 이전 포스팅에서는 Hot-Word Detection과 음성인식, 음성 합성에 대해서 포스팅을 하였습니다. 이번에는 텍스트 해석에 대한 부분을 설명하겠습니다. 1) 디바이스를 깨우고(Hot-Word Detection) 2) 음성인식을 하고 그 인식된 결과를 해석하기 위하여 3)텍스트 해석이 필요합니다. NLP또는 NPU라고 칭하는 과정을 거치고 언어 처리 이후에 해당 텍스트가 어떤걸 의도했는지를 파악하는 것입니다. 사용자의 발화 의도를 해석하는 과정이라고 생각하시면 될것 같습니다.


 텍스트 해석은 google 에서 제공하는 google assistant 를 이용할 수 있습니다. 그리고 google assistant 에 개발자가 원하는 의도(Intention)을 편집할수 있는 웹 기반의 dialog 생성 툴과 생성한 dialog를 조회할수 있는 api를 제공합니다. 이번 포스팅은 이 dialogflow 편집 툴을 이용해서 내가 원하는 의도를 등록하고 활용하는 방법을 알아 보겠습니다.


[DialogFlow에서 Entity/Intent 생성]

 DialogFlow는 https://dialogflow.com 에서 이용 가능합니다. google 계정으로 가입 가능합니다. 가입 후 console에 접속하면 다음과 같은 화면이 나타납니다.


"CREATE AGENT" 를 클릭해서 에이전트를 생성해 보겠습니다.

Agent 이름을 설정하고, Default Language를 Korean으로 설정합니다.CREATE를 하게 되면 google project가 자동 생성됩니다. google project는 "Actions on Google" 프로젝트입니다. 생성하게 되면 다음의 화면이 나타납니다. 기본적으로 두개의 Intent가 생성되어져 있습니다. 


"Intent" 는 사용자의 어떤 해석된 의도 또는 목표를 나타냅니다. Action은 Intent에 매핑되어 특정 행위(fullfillment)를 가지고 있는 것입니다.

Default Fallback Intent는 사용자 입력이 정의된 Intent와 매치되지 않을 때 처리하는 Intent 입니다. 클릭해 보면 다음의 Text response들이 정의되어 있습니다.


Default Welcome Intent는 앱에 진입할때 실행되는 Intent입니다. Intent는 특정 목적을 가진 의도로, 이 Intent를 추출하기 위해서는 Text에서 Entity를 추출하고 Entity가 어떤 의미를 가지는지 등록해야 합니다. 사용자가 "유투브에서 이승철 노래 틀어줘"와 같이 특정 가수의 노래를 유투브에서 제생하라는 Intent를 생성해 보도록 하겠습니다. Intent는 텍스트를 NLP/NLU 처리한 다음에 처리 결과들의 의미가 무엇인지 분석을 합니다. 처리 결과로 분해되어진 요소를 Entity 라고 하며, Entity를 우선 등록해야 합니다. Entity는 단어들의 해석 단위라고 보시면 될것 같습니다.

 Entity를 생성해 보도록 하겠습니다.Entity는 Artist를 구별해 주는 TargetArtist, 무엇을 해야 할지에 대한 TargetAction, 그리고 어떤 미디어에서 재생해야 할지에 대한 TargetMedia로 Entity를 정의해 보겠습니다. DialogFlow 메인 화면에서 Entity를 클릭합니다. 다음과 같이 TargetArtist를 정의합니다.

대표 명을 입력하고, 동의어를 입력합니다. 동의어는 NLP 처리 이후에 대표 명으로 변경됩니다.

TargetAction은 노래 켜, 노래 꺼로 구별하겠습니다. 다만 대표 명은 Action 처리를 위해서 영문명으로 하곘습니다.

TargetMedia는 유튜브만 등록하겠습니다.


Entity를 생성했으면 Intent를 생성합니다. AskPlayYoutube라는 Intent를 생성하겠습니다.

(1)우선 Training 하기 위한 텍스트를 등록합니다. 텍스트는 실제 사용되는 문장 그대로를 입력하면 됩니다. 예를 들어 "이승철 노래 유튜브에서 틀어줘"를 입력합니다. 그리고 해당 단어들을 이전에 생성한 Entity에 매핑시켜 줍니다. 마우스로 "이승철"까지 선택하고 오른쪽 버튼을 누르면 사전에 준비된 또는 등록한 Entity를 매핑시킬 수 있습니다.

매핑이 되면 Action and Parameters 에 파라미터가 등록되고 Training Phrases 의 해당 부분과 동일한 색으로 변경됩니다.

 (2) 해당 Action이 무엇인지 등록합니다. PlayYoutube 로 정의하겠습니다.

 (3) AskPlayYoutube Intent로 확인 되었을 경우 Response에 대해서 정의합니다.


이렇게 등록한 Intent에 대해서는 텍스트를 입력해서 Simulation 할 수 있습니다. Simulation은 Dialogflow 오른쪽에서 마이크 버튼옆에 텍스트를 입력하면 해석 결과를 볼 수 있습니다.


등록한 Intent를 실제 사용하기 위해서는 Integrations 에서 해당 Intent를 어디에서 사용하게 할지 설정해야 합니다. Integration을 틀릭하면 통합 가능한 여러 옵션들이 나타납니다. 

여기에서 google assistant를 클릭합니다.클릭하면 google assistant에서 사용할 Intent를 등록할수 있습니다. "Add Intent 부분에서 AskPlayYotube를 선택합니다.




[API Credential 생성]


팅커보드에서 dialogflow에 등록한 Intent에 대한 해석을 위해서는 dialogflow API를 호출해야 합니다. API 이용 방법은 다음의 사이트에서 참조할 수 있습니다.


https://dialogflow.com/docs/reference/agent


Agent 의 Setting 화면으로 들어가면 관련 설정을 보실수 있습니다. 현재 V2 API가 제공되고 있으며, V2용 API 키를 받기 위해서는 Service Account 부분을 클릭해서 계정부분에서 키를 받아야 합니다.


Service Account를 클릭하면 다음의 계정 설정 화면이 나오는데요. 대상이 되는 계정을 클릭합니다.


클릭 후 왼쪽 메뉴 텝에서 "키만들기"을 선택합니다.


JSON을 선택하고 저장합니다. 


[팅커보드에서 호출]


다음은 이 credential을 이용해서 node.js 에서 Text로 Intent를 조회해보도록 하겠습니다. dialogflow api는 node.js에서 dialogflow라는 모듈을 이용할 수 있습니다. 다음과 같이 dialogflow 모듈을 설치 합니다.


npm install dialogflow


다음은 dialogflow 모듈을 이용해서 "유투브에서 아이유 노래 틀어줘"라는 텍스트에 대한 해석 결과를 출력하는 node.js 프로그램 입니다.

const projectId = 'YOUR_PROJECT_ID';

const sessionId = 'SESSION_TO_PROCESS';

const query = '유투브에서 아이유 노래 틀어줘';

const languageCode = 'ko-KR';

const credentials_file_path = '/home/linaro/work/test_dss/gcpKey.json';

const dialogflow = require('dialogflow');

const sessionClient = new dialogflow.SessionsClient({

        projectId, keyFilename: credentials_file_path,

});

const sessionPath=sessionClient.sessionPath(projectId,sessionId);

const request={

        session:sessionPath,

        queryInput:{

                text:{

                        text:query,

                        languageCode:languageCode,

                },

        },

};

sessionClient.detectIntent(request).then((responses) => {

        console.log('Detected intent:'+JSON.stringify(responses));

}).catch((err) => {

        console.error('ERROR:', err);

});


결과는 꽤 복잡합니다. 이중에서 Intent 와 그 파라미터만 추출해 보도록 하겠습니다. sessionClient.detectIntent부분을 다음으로 변경합니다.

 sessionClient.detectIntent(request).then((responses) => {

        console.log('Detected intent:'+JSON.stringify(responses));

        const queryResult=responses[0].queryResult;

        const action=queryResult.action;

        const TargetAction=queryResult.parameters.fields.TargetAction;

        const TargetArtist=queryResult.parameters.fields.TargetArtist;

        const TargetMedia=queryResult.parameters.fields.TargetMedia;

        const fulfillmentText=queryResult.fulfillmentText;

        console.log('action:'+action+

                ' TargetAction:'+TargetAction.stringValue+

                ' TargetArtist:'+TargetArtist.stringValue+

                ' TargetMedia:'+TargetMedia.stringValue+

                ' Fullfillment:'+fulfillmentText);

}).catch((err) => {

        console.error('ERROR:', err);

});

다음은 실행 결과 입니다.

action과 우리가 원하는 파라미터들이 전달됨을 확인할 수 있습니다. "Prebuild Agent"에 보면 몇몇 Prebuild된 Agent들을 볼 수 있습니다. 


다음은 Hot-Word Detection -> 음성인식 -> 텍스트 해석 -> TTS 안내 -> 유투브 재생 으로 이어지는 과정을 만들어 보겠습니다.


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

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

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




반응형
Posted by alias
,