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
相关产品推荐
相关产品推荐

