You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js开发Alexa Skill:如何获取并调整设备音量?

解决方案:在自定义Alexa Skill中获取和控制设备音量

要实现你的需求,确实需要用到Alexa Speaker Interface,以下是具体实现步骤和代码示例:

前提配置

先在Alexa开发者控制台的Skill设置中开启对应权限:

  • 进入「Permissions」页面
  • 勾选Alexa Speaker - Volume Read和Alexa Speaker - Volume Write权限
  • 保存后,用户启用Skill时需要授予这些权限

1. 获取触发设备的当前音量

用户触发Skill时,请求包的Context部分会包含设备的Speaker状态(前提是用户已授权),通过以下代码获取当前音量:

const deviceContext = handlerInput.requestEnvelope.context.system.device;
const speakerInterface = deviceContext.supportedInterfaces.AlexaSpeaker;
const currentVolume = speakerInterface ? speakerInterface.volume : null;

如果speakerInterface为undefined,说明用户未授权或设备不支持该接口,需提示用户完成权限授予。


2. 设置触发设备的音量

使用responseBuilder.addDirective()发送SetVolume指令即可调整音量,指令格式需遵循Alexa Speaker Interface规范:

handlerInput.responseBuilder.addDirective({
    type: 'Alexa.Speaker.SetVolume',
    payload: {
        volume: 10 // 音量范围为0-100
    }
});

完整代码示例

const RingEchoDevicesHandler = {
    canHandle(handlerInput) {
        return Alexa.getRequestType(handlerInput.requestEnvelope) === 'IntentRequest'
            && Alexa.getIntentName(handlerInput.requestEnvelope) === 'RingEchoDevices';
    },
    handle(handlerInput) {
        // 获取当前音量
        const deviceContext = handlerInput.requestEnvelope.context.system.device;
        const speakerInterface = deviceContext.supportedInterfaces.AlexaSpeaker;
        let currentVolume = null;
        
        if (speakerInterface) {
            currentVolume = speakerInterface.volume;
        } else {
            return handlerInput.responseBuilder
                .speak('请先授予我访问设备音量的权限')
                .getResponse();
        }

        // 设置音量为10
        handlerInput.responseBuilder.addDirective({
            type: 'Alexa.Speaker.SetVolume',
            payload: {
                volume: 10
            }
        });

        // 播放通知(可替换为AudioPlayer播放自定义音频)
        const speakOutput = '这是一条通知';

        // 恢复初始音量注意:直接在当前响应中添加会打断通知播放,建议用异步方式
        // 例如通过Alexa Proactive Events在播放完成后发送恢复指令,或监听AudioPlayer播放完成事件
        // handlerInput.responseBuilder.addDirective({
        //     type: 'Alexa.Speaker.SetVolume',
        //     payload: {
        //         volume: currentVolume
        //     }
        // });

        return handlerInput.responseBuilder
            .speak(speakOutput)
            .getResponse();
    }
};

恢复初始音量的说明

直接在当前响应中添加恢复音量的指令会打断通知播放,推荐两种实现方式:

  • 使用Alexa Proactive Events:在通知播放完成后异步发送恢复音量的指令
  • 监听AudioPlayer.PlaybackFinished事件,在回调中触发恢复操作

内容的提问来源于stack exchange,提问作者John Duskin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:42:47