音声応答を聞き取りやすくする
実際に抽選スキルを動かしてみると、Alexaの応答のテンポが良過ぎて、イベント会場などで使うには適さないように感じるかもしれません。そこで、このスキルをより使いやすく(応答を聞き取りやすく)するために、応答文の中に待ち時間を入れてみましょう。
コード例の一部を次のように書き換えます。
リスト16:getWinnersSpeech() 関数の一部を以下のように修正
01 | const winnersString = winners.join('<break time="1s"/>,'); |
02 | const winnersSpeechSingle = '当選者は、<break time="1s"/>' + winnersString + '<break time="1s"/>です。'; |
03 | return winnersSpeechSingle + '<break time="1s"/>繰り返します。' + winnersS//}peechSingle; |
06 | //list[list17][drawLots()関数の一部を以下のように修正]{ |
08 | '抽選しています。<break time="3s"/>' + |
09 | '抽選が終わりました。当選者を発表します。' + |
Lambda 関数を更新してもう一度実行してみます。今度は十分な間隔を空けて当選者が読み上げられるので、かなり聞き取りやすくなったことと思います。このように、応答メッセージの文字列の中に特別なタグを入れることで、メッセージの読み上げられ方を制御することができます。このタグは、音声合成マークアップ言語(Speech Synthesis Markup Language、SSML)と呼ばれる形式で記述します。SSMLで書かれた音声合成の例を示します。
リスト18:SSMLの例
2 | 応答メッセージです。3秒待ちます<break time="3s"/> |
3 | 一文字ごとに読み上げます <say-as interpret-as="spell-out">abc</say-as> |
「<speak></speak>」タグに挟まれた部分が音声メッセージとなりますが、これまで使用してきたAlexa Skills Kit SDKのspeak()関数やreprompt()関数などを使う際にはこのタグが自動的に付加されますので、応答メッセージを組み立てる際にはタグ内の本文のみを記述します。
SSMLを使うと、待ち時間を入れられるだけでなく、様々な効果を応答メッセージに追加できます。先ほどのgetWinnersSpeech()関数にもうひとつ修正を加えてみましょう。
リスト19:SSMLの使用例
1 | const winnersSpeechSingle = '<prosody volume="x-loud">当選者は、<break time="1s"/>' + winnersString + '<break time="1s"/>です。</prosody>'; |
当選者の読み上げ部分だけ、少し声を大きくすることができました。他にも、ささやき声にしたり、予め録音した音声を流すこともできます。音声合成マークアップ言語(SSML)のタグについては以下のページを参照してください。
音声合成マークアップ言語(SSML)のリファレンス
以上、抽選スキルを使ってステートフルなサービスの実現と、音声応答の制御方法を学びました。ここまでに解説した内容だけでも様々なことをAlexaで実現できるようになります。ぜひ活用してみてください。