日曜プログラマーのための「Clovaスキルつくり隊!」 第6回
21の問題と7つの正解を持つ音を使ったゲーム作り
鳴った音の音階を当てる「絶対音感ゲーム」スキルをつくってみよう
2019年10月03日 13時00分更新
スキルづくりのワンポイントテク
3つのオクターブを1つの正解として扱う
出題時には、ドレミファソラシの各音階毎に用意された3オクターブ分、全部で21個のmp3ファイルを用意し、そのうちの1つをランダムで決定して再生しています。1つのmp3のファイルは1秒程度の長さにしています。
それが、回答時には、オクターブが違っていても、ドの音の答えは「ド」になりますから、21の設問に対して、答えは7つの音のどれか、という仕組みになっているのが、今回のスキル作成のポイントです。
①音階ファイル用意して配列に入れる
各音階毎に3オクターブ分mp3ファイルで用意します。3つのオクターブの同じ音が同じ音階として格納されているのがポイントです。
const scaleList = [
{
noteName:'ド',
file:[
'/PATH/TO/C3.mp3',
'/PATH/TO/C4.mp3',
'/PATH/TO/C5.mp3',
]
},
②音階をランダムで取得する
const random_note = Math.floor(Math.random() * Object.keys(scaleList).length);
③オクターブのファイルをランダムで取得する
②で決まった音階からオクターブのファイルをランダムで決めます。
const random_file = Math.floor(Math.random() * Object.keys(scaleList[random_note]['file']).length);
④セッション情報の保存
セッション情報に正解の音ファイル名を登録します。
responseHelper.setSessionAttributes({note:random_note, file:random_file});
⑤音を再生する
今回はmp3ファイルそのまま再生するためAudioPlayerは使わず、音のファイルを返して再生します。
lang: '',
type: 'URL',
value: scaleList[random_note]['file'][random_file]
});
break;
⑥スロットの値とセッションの値がすべて一致していたら正解
if (scaleSlot === noteName) {
responseHelper.setSimpleSpeech({
lang: 'ja',
type: 'PlainText',
value: '正解です。',
});
} else {
responseHelper.setSpeechList([
{
lang: 'ja',
type: 'PlainText',
value: '不正解です。',
},
{
lang: 'ja',
type: 'PlainText',
value: '正解は、' + noteName + '、です。',
},
{
lang: 'ja',
type: 'PlainText',
value: '次のゲームをするには、再生、または、スタート、と言ってください。もう一度聞きたい場合は、もう一度、または、リピート、と言ってみてください。',
},
]);
}
今回のスキルの作成で苦労した点は、Clovaは言葉ではない、発話は認識されにくいという点でしょうか。企画当初は、「ドレミ」など、3つの音を鳴らして、すべてを当てる仕様にしようと考えていたのですが、3つの連続した音を発話すると、似た音の別の単語として認識されてしまい、回答通りの発話として認識されくく、結局、1つの音を当てる仕様に変更することになりました。
こういった仕様上の変更は、試してみなければ分からないというプログラミングの苦労するところでもあり、楽しいところでもありますね。
みんなもぜひ面白いスキルの作成に挑戦してみてくださいね!
この連載の記事
-
第5回
デジタル
読み手をClovaにやってもらう「江戸いろはかるた」スキルをつくってみよう -
第4回
デジタル
子供も一緒に楽しめるゲーム「椅子取りゲーム」スキルをスマートスピーカー用につくってみよう -
第3回
デジタル
パーティーゲームの定番「ビンゴ」スキルをスマートスピーカー用につくってみよう -
第2回
デジタル
1日が楽しくなる「おみくじ」スキルをスマートスピーカー用につくってみよう -
第1回
デジタル
むかしの時刻を返す、スマートスピーカー用スキルをつくってみよう - この連載の一覧へ