如何在Alexa自定义技能的JSON响应中添加自定义字段以操控WPF应用?
解决AVS Lambda响应添加自定义字段操控WPF应用的方案
嘿,我之前也碰到过类似的需求,给你几个可行的方案,亲测能实现通过Lambda返回自定义数据来操控你的WPF应用:
1. 使用Session Attributes(最推荐,原生支持)
Alexa Skills Kit(ASK)的响应格式本身支持sessionAttributes字段,你可以在这里存储任意自定义键值对,WPF端在接收AVS响应时可以直接提取这部分数据。
Lambda代码示例(Node.js):
exports.handler = async (event) => { // 处理用户请求逻辑... // 定义自定义会话属性 const sessionAttributes = { wpfAction: "openUserProfile", targetUserId: "12345", theme: "light" }; // 构造符合ASK规范的响应 const response = { version: "1.0", sessionAttributes: sessionAttributes, // 这里放入自定义数据 response: { outputSpeech: { type: "PlainText", text: "已为你打开用户资料页面" }, shouldEndSession: false } }; return response; };
WPF端解析示例(C#):
在你的AVS客户端接收响应后,解析JSON并提取sessionAttributes:
// 假设responseJson是从AVS获取的响应JSON字符串 var alexaResponse = JsonConvert.DeserializeObject<AlexaResponse>(responseJson); var customData = alexaResponse.SessionAttributes; // 根据自定义字段执行WPF操作 if (customData["wpfAction"].ToString() == "openUserProfile") { // 打开用户资料页面的WPF逻辑 var profileWindow = new UserProfileWindow(); profileWindow.Show(); }
2. 在SSML中嵌入自定义标记
如果需要和语音播报内容关联的自定义数据,可以在输出语音的SSML里嵌入自定义XML标记,WPF端解析SSML时提取这些标记内容。
Lambda代码示例:
const response = { version: "1.0", response: { outputSpeech: { type: "SSML", ssml: '<speak>已为你调整音量<customData action="adjustVolume" value="70"/></speak>' }, shouldEndSession: true } };
WPF端解析SSML:
// 解析SSML字符串,提取customData标签 var ssmlDocument = new XmlDocument(); ssmlDocument.LoadXml(alexaResponse.Response.OutputSpeech.Ssml); var customNodes = ssmlDocument.GetElementsByTagName("customData"); if (customNodes.Count > 0) { var action = customNodes[0].Attributes["action"].Value; var value = customNodes[0].Attributes["value"].Value; if (action == "adjustVolume") { // 调整WPF应用音量的逻辑 Application.Current.MainWindow.Volume = int.Parse(value); } }
3. 使用APL自定义数据源(适合带UI交互的场景)
如果你的WPF应用支持Alexa Presentation Language(APL),可以在APL响应的datasources里添加自定义数据,WPF端解析APL文档时获取这些数据。
Lambda代码示例:
const response = { version: "1.0", response: { outputSpeech: { type: "PlainText", text: "已为你展示推荐内容" }, directives: [ { type: "Alexa.Presentation.APL.RenderDocument", document: { /* APL文档内容 */ }, datasources: { customWpfData: { action: "showRecommendations", items: ["item1", "item2", "item3"] } } } ], shouldEndSession: false } };
注意事项
- 无论用哪种方案,都不要破坏ASK响应的核心结构(比如
version、response字段),否则Alexa会拒绝处理你的响应。 - 如果是Session Attributes,数据会在会话存续期间保留,适合跨请求的状态传递;如果是单次请求的操控指令,用SSML标记或APL数据源更合适。
内容的提问来源于stack exchange,提问作者Suman Kumar
相关产品推荐
相关产品推荐

