Alexa Skills Kit for Node.js (alexa-sdk)로 음악 파일 울림 (2018/3/21 추가)

추가 (2018/3/21)



Alexa Skills Kit Sound Library 라는 것이 공개되었습니다.
Alexa 기술 개발을 위해 효과음과 배경음과 같은 자산을 준비한 것 같습니다. 일본어 환경에서도 사용할 수 있습니다.
여기를 사용하면 음악 파일을 준비하지 않고 Skill을 만들 수 있습니다!
물론 Sound Library의 소리를 조합하여 무언가를 만드는 것도 가능합니다.

sample.js
let speechOut = '用意されている奴をコピペするだけ!簡単!';
speechOutput += "<audio src='https://s3.amazonaws.com/ask-soundlibrary/nature/amzn_sfx_rain_01.mp3'/>";

this.emit(':tell', speechOut);

전치



이것, 별로 찾아도 알기 쉬운 정보가 없었기 때문에 써 보겠습니다.

대상자:
・JavaScript, Node.js 초보자
· 우선 샘플 등으로 스킬을 움직여 본 사람

샘플 코드



sample.js
let speechOut = '音楽はこのように鳴らします。';
speechOut += "<break time ='1s' />";
speechOut += "<audio src='https://xxx.mp3' />";
speechOut += "<break time ='1s' />";
speechOut += 'ね、簡単でしょ?';

this.emit(':tell', speechOut);

설명



SSML 정보



Alexa 본문이 문자를 음성으로 변환할 때 SSML이라는 언어를 사용합니다.
Alexa의 공식 참조에 해설이 실려 있습니다.
음성 합성 마크업 언어(SSML) 참조

SSML은 단순한 출력 외에도 합성 음성에 장식을 추가 할 수 있습니다.
HTML의

<\h1>←같은 놈의 음성판이군요.

Alexa의 응답으로 소리



위의 공식 레퍼런스에 Alexa에서의 응답 방법이 실려 있습니다.
"outputSpeech": {
    "type": "SSML",
    "ssml": "<speak>This output speech uses SSML.</speak>"
}

Alexa SDK로 소리 울림



에...하지만 이것과 샘플 등에 있는 this.emit라든지 어떻게 연결되어 있는 거야?
SDK의 Readme에도 왠지 쓰고 있지만・・・
전혀 모르겠어! (〇거거)

그래서 this.emit에서 사용하는 경우의 사용법을 조사해 보았습니다.
즉 SDK의 내용을 쫓아봅니다.

첫째, emit이라는 것은 EventEmitter라는 Node.js의 기능입니다.
emit(이벤트명, [arg1], [arg2], [...])라는 느낌으로,
Emitter가 인수를 전달하고 처리하게 합니다.

그럼, Alexa sdk에서 이 Emitter 처리부는 어디에 있는지, 라고 하면,
response.js 에 있습니다.

response.js
        ':tell': function (speechOutput) {
            if(this.isOverridden()) {
                return;
            }

            this.handler.response = buildSpeechletResponse({
                sessionAttributes: this.attributes,
                output: getSSMLResponse(speechOutput),
                shouldEndSession: true
            });
            this.emit(':responseReady');
        },

추가 출력을 형성하는 getSSMLResponse 함수를 확인합니다.

response.js
function getSSMLResponse(message) {
    if (message == null) { // jshint ignore:line
        return null;
    } else {
        return {
            type: 'SSML',
            speech: `<speak> ${message} </speak>`
        };
    }
}

즉, this.emit의 인수에 지정한 단어는
SSML 형식으로 완전히 로 둘러싸고 출력하고 있는 것을 알았습니다.

여기까지 알면 단순히 emit로 지정하는 단어에 태그를 끼워 넣을 뿐인가! 라는 것을 알 수 있습니다.

sample.js
let speechOut = '音楽はこのように鳴らします。'; //なんか喋りたい文字
speechOut += "<break time ='1s' />"; //1秒休止
speechOut += "<audio src='https://xxx.mp3' />"; //音楽ファイルをはめこむ
speechOut += "<break time ='1s' />"; //1秒休止
speechOut += 'ね、簡単でしょ?'; //なんか喋りたい文字

this.emit(':tell', speechOut);

그건 그렇고, ReadMe에 따르면,
this.emit(':tell', speechOut);

this.response.speak(speechOut);
this.emit(':responseReady');
의 2개라도 쓸 수 있는 것 같습니다.
(자신도 별로 자세히 조사하지 않았지만, SDK 안을 보면 대체로 같은 일을 하고 있다고 생각한다.)

mp3 소개



Amazon에서 지정한 형식에 맞춰야 합니다.
공식 레퍼런스에 기재되어 있습니다만, 여기에도 써 둡니다.

필요한 경우 변환 소프트웨어를 사용하여 MP3 파일을 필요한 코덱 버전(MPEG 버전 2) 및 비트 전송률(48kbps)로 변환합니다.

Audacity와 ffmpeg를 사용하여 변환하면 낙승이군요.

오디오를 제공하는 데 사용하는 MP3 파일은 HTTPS를 사용하는 엔드포인트에서 호스팅되어야 합니다. 이 엔드포인트에서는 Amazon 인증 인증 기관이 서명한 SSL 인증서를 제공해야 합니다.

특별히 고집하지 않으면 S3에 up하면 문제 없을 것입니다.

또, 음성 파일을 준비하는 것이 어색하다··라고 하는 사람은, Alexa Skills Kit Sound Library (을)를 사용하면 간단하게 시험할 수 있습니다.

결론



Alexa-sdk에서 음악 파일을 울리는 방법을 작성해 보았습니다.
누군가의 도움이 되시면 다행입니다.
필자도 꽤 초보자이므로 잘못된 점 등이 있으면 알려주십시오.

좋은 웹페이지 즐겨찾기