共计 2152 个字符,预计需要花费 6 分钟才能阅读完成。
技能化开发的市场背景
近年来,语音交互市场年增长率超过 40%,技能(Skill)开发已成为人机交互的新标准。陌讯 skill 通过标准化协议和可视化工具链,将传统 3 周以上的开发周期缩短至 72 小时,特别适合快速试错的新场景需求。

传统语音技能 vs 陌讯 skill
-
协议栈差异
传统方案依赖 ASR(Automatic Speech Recognition)+ NLU(Natural Language Understanding)两段式处理,而陌讯 skill 采用统一的 SkillML 协议,请求延迟降低 60% -
上下文管理
传统方案需要手动维护 session,陌讯 skill 提供自动化的对话上下文树(Dialog Context Tree),支持最长 15 轮对话记忆 -
多模态支持
除语音外,原生支持: - 富文本卡片(Rich Card)
- 动态表单(Dynamic Form)
- 3D 物体识别(3D Object Detection)「实验性功能」
环境配置与项目初始化
开发环境要求
node.js >= 16.13.0
@moxun/skill-cli 2.4.1
项目结构规范
my-skill/
├── manifests/ # 技能描述文件
├── intents/ # 意图定义
├── dialogs/ # 对话流程
└── resources/ # 多模态素材
manifest 关键字段
{
"skillId": "com.example.weather",
"apis": [
{
"type": "REST",
"endpoint": "https://api.weather.com"
}
],
"permissions": ["LOCATION"] // 需用户授权的权限
}
注意:skillId 需全局唯一,建议采用反向域名命名法
核心代码实现
意图识别处理
// 匹配 "查北京天气" 类请求
const weatherPattern = /^(查询 | 查看)(?<city>\S+)天气 $/;
class WeatherHandler {async execute(event) {const match = event.query.match(weatherPattern);
if (!match?.groups?.city) {throw new Error('MISSING_CITY'); // 统一错误码
}
return fetchWeather(match.groups.city);
}
}
对话状态机实现
enum States {
INIT,
CONFIRM_CITY,
SHOW_WEATHER
}
class DialogEngine {
private state: States = States.INIT;
async next(input: string) {
try {switch(this.state) {
case States.INIT:
this.city = await parseCity(input);
this.state = States.CONFIRM_CITY;
return ` 确认查询 ${this.city}天气吗?`;
// ... 其他状态处理
}
} catch (err) {
this.state = States.INIT; // 出错重置
return '抱歉,请重新说明需求';
}
}
}
多模态响应示例
{
"version": "1.0",
"output": {
"speech": "北京今天晴转多云,25 度",
"card": {
"type": "Standard",
"title": "天气信息",
"content": "...",
"image": {
"url": "https://.../sunny.png",
"accessibilityText": "晴天图标"
}
}
}
}
性能优化专项
-
冷启动优化
使用skill-cli test --cold-start测试,建议控制在 1200ms 内 -
上下文压缩
采用增量编码(Delta Encoding),存储体积减少 70%:function compressContext(prev: Context, curr: Context) {return Object.keys(curr).filter(k => prev[k] !== curr[k]); } -
服务调用超时
第三方 API 必须设置双超时:# skill.config.yaml timeouts: connect: 1500 read: 3000
安全规范
数据加密方案
import {SkillCrypto} from '@moxun/skill-sdk';
const encrypted = SkillCrypto.encrypt(
userData,
process.env.SKILL_SECRET
);
敏感词过滤
const bannedWords = ['赌博', '毒品'];
function safeResponse(text: string) {return bannedWords.some(w => text.includes(w))
? '内容包含违规词汇'
: text;
}
进阶方向建议
- 尝试与 IoT 设备联动,实现语音控制智能家居
- 接入知识图谱提升问答准确率
- 开发跨技能协作能力(Cross-Skill Collaboration)「实验性功能」
经过上述步骤,你应该已经完成了首个陌讯 skill 的开发。建议从简单的查询类技能入手,逐步尝试更复杂的对话场景。遇到问题时,官方文档的 故障排查 章节通常能提供解决方案。
正文完
