共计 2089 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
将传统 Web 应用转化为语音交互 Skill 时,开发者常遇到以下典型问题:

-
会话保持困难:Web 应用通常基于 HTTP 无状态协议,而语音交互需要维护多轮对话上下文。例如用户询问 ” 北京的天气怎么样 ” 后接着说 ” 那上海呢 ”,系统需记住前文的地理实体。
-
平台差异显著:Alexa 的 Intent 与 Dialogflow 的 Entities 结构不同,相同查询 ” 订周五去纽约的机票 ” 在两大平台需分别处理日期和城市参数。
-
交互范式冲突:GUI 应用的富信息展示(如数据表格)需转换为符合 VUI 设计原则的渐进式语音反馈,强制要求信息分层输出。
技术选型
无服务化方案对比
| 指标 | AWS Lambda | Google Cloud Function |
|---|---|---|
| 冷启动延迟 | 300-800ms(Node.js 14.x) | 500-1200ms(Node.js 12.x) |
| 成本模型 | 按请求 + 执行时间计费 | 同左,但免费额度更高 |
| 本地测试 | SAM CLI 支持完整模拟 | Functions Framework 需手动配置 |
QPS<100 时的优化策略
- 预热处理:通过 CloudWatch 定时每 5 分钟触发空调用保持实例活跃
- 内存配置:Node.js 环境建议选择 1792MB(性能 / 成本最佳平衡点)
- 依赖优化:使用 Webpack 打包将 node_modules 体积压缩 60% 以上
核心实现
意图映射示例(Alexa SDK)
const {SkillBuilders} = require('ask-sdk-core');
const LaunchRequestHandler = {canHandle(handlerInput) {return handlerInput.requestEnvelope.request.type === 'LaunchRequest';},
handle(handlerInput) {
// 从持久化存储恢复会话(DynamoDB 示例)const attributes = await handlerInput.attributesManager
.getPersistentAttributes()
.catch(() => ({}));
return handlerInput.responseBuilder
.speak('欢迎使用航班查询')
.reprompt('您想查询哪个城市?')
.getResponse();}
};
// 错误处理必须显式捕获
const ErrorHandler = {canHandle() {return true;},
handle(handlerInput, error) {console.error(`Error handled: ${error.message}`);
return handlerInput.responseBuilder
.speak('服务暂时不可用')
.getResponse();}
};
exports.handler = SkillBuilders.custom()
.addRequestHandlers(LaunchRequestHandler)
.addErrorHandlers(ErrorHandler)
.withTableName('SessionAttributes') // DynamoDB 表名
.withAutoCreateTable(true)
.lambda();
对话上下文管理
避免使用全局变量的三种实践方法:
- 请求级存储:利用 handlerInput.attributesManager.setSessionAttributes()
- 外部缓存:对高频数据使用 ElastiCache Redis(TTL 设置 15 分钟)
- 加密令牌 :通过 responseBuilder.withApiToken() 传递安全参数
认证避坑
Google Action 常见拒绝原因
- SSML 格式错误:
- 错误示例:
<speak> 点击 <sub alias="订阅">sub</sub></speak> -
修正方案:改用
<say-as interpret-as="verbatim">subscribe</say-as> -
隐私政策缺失:
- 必须提供可公开访问的隐私条款页面
-
需明确声明语音数据使用范围
-
响应超时:
- 严格控制在 5 秒内返回最终响应
- 对长耗时操作使用异步通知 API
性能测试
压测数据(us-east- 1 区域)
| 并发数 | 平均延迟 | P99 延迟 | 冷启动率 |
|---|---|---|---|
| 10 | 142ms | 210ms | 0% |
| 50 | 237ms | 890ms | 12% |
扩容策略
- 预留并发:为生产环境设置最小 10 个预热实例
- 区域冗余:在 us-west- 2 部署灾备端点
- 回落机制:当 Lambda 超时触发 SQS 队列异步处理
部署模板
已开源包含以下功能的 Terraform 模板:
- 自动创建 DynamoDB 会话表
- 配置 API Gateway 的 CORS 策略
- 设置 CloudWatch 告警规则
GitHub 地址:skill-deployment-template(请替换为实际链接)
结语
在实际将机票预订系统转化为 Skill 的过程中,我们发现语音交互的容错率远低于 GUI。某次因未处理 ” 呃 … 等一下 ” 这样的犹豫词导致对话流程中断,最终通过增加 NLU 训练短语解决。建议开发时多进行真人测试,录音回放能暴露出代码层面难以发现的问题。
正文完
发表至: 技术开发
近一天内
