从零构建微信语音助手小程序:架构与踩坑实录
5 分钟阅读
本文记录我用微信云开发构建「语音助手」小程序的完整过程,涵盖技术选型、架构设计与踩坑复盘。
背景
想做一款”说话就能完成操作”的语音助手:你说一句自然语言,它帮你查天气、导航、看股票。技术栈很快定下来:
- 微信小程序 + 云开发:免运维,云函数天然适合做 API 聚合层
- 腾讯云 ASR / TTS:语音识别与合成
- 混元大模型:意图理解与对话生成
- 和风天气 / 高德地图 / 东方财富:能力供给方
整体架构
用户语音
│ recorderManager 录音
▼
小程序端 ── 上传音频 ──► 云函数 A:语音识别(ASR)
│ 文本
▼
云函数 B:意图理解(混元)
│ JSON 指令
┌────────────┬───┴───┬────────────┐
▼ ▼ ▼ ▼
天气云函数 地图云函数 股票云函数 TTS 合成
└────────────┴───┬───┴────────────┘
▼
回复文本 ──► 云函数 C:语音合成(TTS)
│ 音频
▼
小程序播放
踩坑记录
1. 录音格式与时长限制
微信 RecorderManager 默认输出 mp3,但 ASR 接口对采样率有要求。踩坑点:
// 建议统一配置
recorderManager.start({
duration: 60000, // 最多 60s
sampleRate: 16000, // 16k 与 ASR 推荐值一致
encodeBitRate: 48000,
format: 'mp3',
});
2. 云函数的签名实现
腾讯云的语音接口需要 TC3-HMAC-SHA256 签名。网上不少示例把签名写错(尤其 Date 头与 Host 的顺序),排查半天后发现是请求头必须包含 Host 且参与签名:
const headers = {
'Content-Type': 'application/json',
Host: 'asr.tencentcloudapi.com',
'X-TC-Action': 'SentenceRecognition',
'X-TC-Timestamp': String(Math.floor(Date.now() / 1000)),
'X-TC-Version': '2019-06-14',
'X-TC-Region': 'ap-guangzhou',
};
3. 混元的意图解析
直接让大模型输出自由文本再正则匹配,极易出错。可靠做法是约束输出 JSON Schema:
{
"intent": "query_weather | query_navigation | query_stock | chat",
"params": {
"city": "深圳",
"keyword": "腾讯",
"code": "00700"
}
}
小结
整体链路跑通后,语音从按下到回复大约 2-3 秒,体验可接受。下一阶段计划加入多轮对话与本地缓存优化。
如果你也在做类似项目,欢迎在评论区交流。