前提
ClovaはSSMLをサポートしていない。(2018/11現在)
やったこと
他のスマートスピーカーで作ったスキルを移植したい時に不便なので、SSMLをパースしてClovaで使えるようにした。 (特にnpmとかにはしてない)
https://github.com/Arahabica/ClovaSSML
ただし、対応したのはbreak
,audio
,p
タグだけで、他のタグは無視して、タグの中身だけを使うようにしました。
解説
ということで、SSMLをむりやりClovaのOutputSpeech
っていうオブジェクトに変換する奴を作りました。
OutputSpeech
はここのresponse.outputSpeech
などに入れるオブジェクトです。
使い方がちょっとだけややこしいので、解説します。
なぜ、ややこしいのかというと、break
タグを実現するのに、無音のMP3を使っているからです。
1. 無音MP3をダウンロード
ここから無音MP3をダウンロード。
2. 無音MP3をどこかにアップロード
落とした無音MP3をパブリックアクセスできるようにどこかのサーバにおいてください。
3. 無音MP3のURLの情報をセット
const silentAudios = [];
for(let time=100; time<=5000; time+= 100) {
silentAudios.push({time, url: `YOUR_AUDIO_BASE_URL/silence${time}.mp3`});
}
4. SSMLをOutputSpeechに変換
let ssml = "はじめまして<break time='1.2s' /> 私のスキルにようこそ";
ssml += "<audio src='https://sample.com/nice_intro.mp3' /> 何とかかんとか";
let clovaSSML = new ClovaSSML({silentAudios});
let outputSpeech = clovaSSML.convert(ssml);
結果、outputSpeechは次のようになります。
{
"type": "SpeechList",
"values": [
{
"type": "PlainText",
"lang": "ja",
"value": "はじめまして"
},
{
"type": "URL",
"lang": "",
"value": "https://sample.com/silence1000.mp3"
},
{
"type": "PlainText",
"lang": "ja",
"value": "私のスキルにようこそ"
},
{
"type": "URL",
"lang": "",
"value": "https://sample.com/nice_intro.mp3"
},
{
"type": "PlainText",
"lang": "ja",
"value": "何とかかんとか"
}
]
}
全コード
const ClovaSSML = require('./ClovaSSML'); // ClovaSSML.jsのあるディレクトリで
const silentAudios = [];
for(let time=100; time<=5000; time+= 100) {
silentAudios.push({time, url: `YOUR_AUDIO_BASE_URL/silence${time}.mp3`});
}
let ssml = "はじめまして<break time='1.2s' /> 私のスキルにようこそ";
ssml += "<audio src='https://sample.com/nice_intro.mp3' /> 何とかかんとか";
let clovaSSML = new ClovaSSML({silentAudios});
let outputSpeech = clovaSSML.convert(ssml);
雑感
書いてて思ったけど、やっぱ初期化がややこしいですね。
無音MP3のURLをハードコーディングしちゃった方が良かったかしら。