一、功能概述与开发准备
微信小程序语音交互功能包含两大核心场景:语音转文字(ASR)和文字转语音(TTS)。前者将用户语音实时转换为文本,适用于语音输入、会议记录等场景;后者将文本合成为语音输出,常见于语音导航、有声阅读等应用。两者结合可构建完整的语音交互闭环。
1.1 开发前准备
-
权限配置
在app.json中声明所需权限:{"permission": {"scope.record": {"desc": "需要录音权限以实现语音转文字功能"},"scope.writePhotosAlbum": {"desc": "需要存储权限保存语音文件"}}}
-
API能力支持
微信小程序提供以下关键API:wx.startRecord:开始录音(旧版API,兼容性较好)wx.getRecorderManager:新版录音管理器(推荐)wx.uploadFile:将录音文件上传至服务器进行ASR处理wx.downloadFile+wx.playVoice:下载TTS音频并播放
-
服务端选择
由于小程序原生不支持高级语音处理,通常需要:- 方案一:使用微信官方插件(如
语音识别插件) - 方案二:自建服务端通过WebSocket/HTTP接口处理(需后端支持)
- 方案三:调用第三方云服务API(需注意合规性)
- 方案一:使用微信官方插件(如
二、语音转文字(ASR)实现详解
2.1 录音与文件上传
// 初始化录音管理器const recorderManager = wx.getRecorderManager();const options = {format: 'mp3', // 推荐格式sampleRate: 16000, // 采样率numberOfChannels: 1, // 单声道encodeBitRate: 96000, // 码率frameSize: 50 // 帧大小(ms)};// 开始录音recorderManager.start(options);// 录音结束回调recorderManager.onStop((res) => {const tempFilePath = res.tempFilePath;// 上传至服务端wx.uploadFile({url: 'https://your-server.com/asr',filePath: tempFilePath,name: 'audio',formData: {'appid': 'your_appid','timestamp': Date.now()},success(res) {const data = JSON.parse(res.data);console.log('识别结果:', data.result);}});});
2.2 服务端ASR处理(示例)
若选择自建服务端,可使用开源引擎如Kaldi或Mozilla DeepSpeech。典型处理流程:
- 接收音频文件并校验格式
- 调用ASR引擎进行识别
- 返回JSON格式结果:
{"code": 0,"result": "今天天气真好","confidence": 0.95}
2.3 错误处理与优化
- 超时处理:设置30秒录音上限,通过
recorderManager.onError捕获错误 - 网络优化:分片上传大文件,使用
wx.compressVoice压缩音频 - 降噪处理:服务端预处理去除背景噪音
三、文字转语音(TTS)实现方案
3.1 小程序原生方案(有限支持)
微信提供wx.createInnerAudioContext播放音频,但需预先准备语音文件:
const innerAudioContext = wx.createInnerAudioContext();innerAudioContext.src = 'https://your-server.com/tts?text=你好';innerAudioContext.play();
3.2 动态合成方案(推荐)
- 服务端合成:使用
Microsoft Speech SDK、Google TTS或开源库如espeak生成音频 -
接口设计:
POST /ttsContent-Type: application/json{"text": "欢迎使用微信小程序","voice": "female", // 音色"speed": 1.0 // 语速}
-
小程序端播放:
function textToSpeech(text) {wx.request({url: 'https://your-server.com/tts',method: 'POST',data: { text },success(res) {const audioUrl = res.data.audio_url;const player = wx.createInnerAudioContext();player.src = audioUrl;player.play();}});}
3.3 性能优化技巧
- 缓存策略:对常用文本预合成并缓存音频
- 流式播放:服务端支持分块传输,实现边合成边播放
- 多音色选择:提供男女声、儿童声等选项
四、完整案例:语音笔记小程序
4.1 功能设计
- 按住按钮录音并实时转文字
- 编辑文本后合成语音播放
- 保存语音/文本到本地
4.2 核心代码实现
// 录音页面Page({data: {isRecording: false,transcript: '',audioUrl: ''},startRecord() {this.setData({ isRecording: true });this.recorderManager.start({ format: 'mp3' });},stopRecord() {this.recorderManager.stop();this.setData({ isRecording: false });},onLoad() {this.recorderManager = wx.getRecorderManager();this.recorderManager.onStop((res) => {this.uploadAndRecognize(res.tempFilePath);});},uploadAndRecognize(filePath) {wx.uploadFile({url: 'https://your-server.com/asr',filePath,success: (res) => {const data = JSON.parse(res.data);this.setData({ transcript: data.result });}});},playText() {const text = this.data.transcript;if (!text) return;wx.request({url: 'https://your-server.com/tts',method: 'POST',data: { text },success: (res) => {const player = wx.createInnerAudioContext();player.src = res.data.audio_url;player.play();this.setData({ audioUrl: res.data.audio_url });}});}});
4.3 部署注意事项
- 域名配置:在微信公众平台配置合法域名
- HTTPS要求:所有接口必须使用HTTPS
- 性能监控:记录ASR/TTS请求耗时,优化服务端响应
五、常见问题解决方案
- 录音权限被拒:引导用户到设置中开启权限
- 识别准确率低:
- 使用16kHz采样率
- 限制录音环境噪音
- 添加标点符号预测
- TTS延迟高:
- 预加载常用语音
- 使用Websocket保持长连接
- 跨平台兼容:测试iOS/Android设备差异,特别是音频格式支持
六、进阶优化方向
- 实时ASR:通过WebSocket实现边录音边识别
- 情感合成:在TTS请求中添加情感参数(高兴、悲伤等)
- 多语言支持:扩展服务端支持中英文混合识别
- 离线方案:使用WebAssembly打包轻量级ASR模型
通过以上方案,开发者可快速在微信小程序中实现完整的语音交互功能。实际开发中需根据业务需求平衡实时性、准确率和成本,建议从简单方案起步,逐步迭代优化。