首页 > 解决方案 > Alexa Skill:如何循环播放一系列声音文件

问题描述

我有在亚马逊 Alexa 上播放动物声音的技能。

用户:狗的声音是什么样的?Alexa:(吠)用户:猫的声音是什么样的?亚历克萨:(喵)

等等……等等。

我正在尝试添加一个按顺序循环遍历数组并播放数组中可用的所有动物声音文件的意图:

var animalNoises = {

        'bear' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_bear_roar_small_01.mp3'/>"
        },

        'bird' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_bird_forest_01.mp3'/>"
        },

        'cat' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_cat_meow_1x_02.mp3'/>"
        },

        'cow' : {
            'noise' : "<audio src='https://s3.amazonaws.com/animalhouse-noises/animal+house+(cow-moo).mp3'/>"
        },

        'chicken' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_chicken_cluck_01.mp3'/>"
        },

        'dog' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_dog_med_bark_2x_02.mp3'/>"
        },

        'elephant' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_elephant_01.mp3'/>"
        },

        'horse' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_horse_whinny_01.mp3'/>"
        },

        'lion' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_lion_roar_02.mp3'/>"
        },

        'pig' : {
            'noise' : "<audio src='https://s3.amazonaws.com/animalhouse-noises/animal+house+(pig-snort).mp3'/>"
        },

        'monkey' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_monkey_chimp_01.mp3'/>"
        },

        'rat' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_rat_squeak_2x_01.mp3'/>"
        },

        'raven' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_raven_caw_2x_01.mp3'/>"
        },

        'rooster' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_rooster_crow_02.mp3'/>"
        },

        'sheep' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_sheep_bleat_02.mp3'/>"
        },

        'turkey' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_turkey_gobbling_01.mp3'/>"
        },

        'wolf' : {
            'noise' : "<audio src='https://s3.amazonaws.com/ask-soundlibrary/animals/amzn_sfx_wolf_howl_02.mp3'/>"
        }

        };

这是我的意图中的代码,但没有任何运气可以播放声音文件:

 'PlayAllAnimalsIntent' : function () {
    speechOutput = '';

    for (var i = 0; i < animalNoises.length; i++) {
        var animalSounds = animalNoises[animalNoises[i]]['noise'];
        speechOutput = animalSounds;
        this.emit(":tell", speechOutput);

    }
},

标签: arraysnode.jsloopsfor-loopalexa

解决方案


问题

animalNoises.lengthundefined因为animalNoises没有钥匙length。因此i < animalNoises.length成为i < undfeined。由于ifirst 得到 的值0,我们得到0 < undefined

由于 javascript 的类型强制噱头,0 < undefined评估为false并且循环内的代码块永远不会执行。

此外,var animalSounds = animalNoises[animalNoises[i]]['noise'];将导致 TypeError,因为animalNoises[animalNoises[i]]is undefined,但我们永远不会走那么远。

修复

要遍历对象,您需要对象的可迭代表示。Object.keys(object)将对象的所有键作为数组返回。

Object.keys(animalSounds).forEach(key => {
  const sound = animalSounds[key]['noise'];
  /* Append sound to speechOutput here */
})

this.emit(":tell", speechOutput);

推荐阅读