微信小程序语音交互全攻略:从转文字到合成语音的实现

一、功能概述与开发准备

微信小程序语音交互功能包含两大核心场景:语音转文字(ASR)文字转语音(TTS)。前者将用户语音实时转换为文本,适用于语音输入、会议记录等场景;后者将文本合成为语音输出,常见于语音导航、有声阅读等应用。两者结合可构建完整的语音交互闭环。

1.1 开发前准备

  1. 权限配置
    app.json中声明所需权限:

    1. {
    2. "permission": {
    3. "scope.record": {
    4. "desc": "需要录音权限以实现语音转文字功能"
    5. },
    6. "scope.writePhotosAlbum": {
    7. "desc": "需要存储权限保存语音文件"
    8. }
    9. }
    10. }
  2. API能力支持
    微信小程序提供以下关键API:

    • wx.startRecord:开始录音(旧版API,兼容性较好)
    • wx.getRecorderManager:新版录音管理器(推荐)
    • wx.uploadFile:将录音文件上传至服务器进行ASR处理
    • wx.downloadFile + wx.playVoice:下载TTS音频并播放
  3. 服务端选择
    由于小程序原生不支持高级语音处理,通常需要:

    • 方案一:使用微信官方插件(如语音识别插件
    • 方案二:自建服务端通过WebSocket/HTTP接口处理(需后端支持)
    • 方案三:调用第三方云服务API(需注意合规性)

二、语音转文字(ASR)实现详解

2.1 录音与文件上传

  1. // 初始化录音管理器
  2. const recorderManager = wx.getRecorderManager();
  3. const options = {
  4. format: 'mp3', // 推荐格式
  5. sampleRate: 16000, // 采样率
  6. numberOfChannels: 1, // 单声道
  7. encodeBitRate: 96000, // 码率
  8. frameSize: 50 // 帧大小(ms)
  9. };
  10. // 开始录音
  11. recorderManager.start(options);
  12. // 录音结束回调
  13. recorderManager.onStop((res) => {
  14. const tempFilePath = res.tempFilePath;
  15. // 上传至服务端
  16. wx.uploadFile({
  17. url: 'https://your-server.com/asr',
  18. filePath: tempFilePath,
  19. name: 'audio',
  20. formData: {
  21. 'appid': 'your_appid',
  22. 'timestamp': Date.now()
  23. },
  24. success(res) {
  25. const data = JSON.parse(res.data);
  26. console.log('识别结果:', data.result);
  27. }
  28. });
  29. });

2.2 服务端ASR处理(示例)

若选择自建服务端,可使用开源引擎如KaldiMozilla DeepSpeech。典型处理流程:

  1. 接收音频文件并校验格式
  2. 调用ASR引擎进行识别
  3. 返回JSON格式结果:
    1. {
    2. "code": 0,
    3. "result": "今天天气真好",
    4. "confidence": 0.95
    5. }

2.3 错误处理与优化

  • 超时处理:设置30秒录音上限,通过recorderManager.onError捕获错误
  • 网络优化:分片上传大文件,使用wx.compressVoice压缩音频
  • 降噪处理:服务端预处理去除背景噪音

三、文字转语音(TTS)实现方案

3.1 小程序原生方案(有限支持)

微信提供wx.createInnerAudioContext播放音频,但需预先准备语音文件:

  1. const innerAudioContext = wx.createInnerAudioContext();
  2. innerAudioContext.src = 'https://your-server.com/tts?text=你好';
  3. innerAudioContext.play();

3.2 动态合成方案(推荐)

  1. 服务端合成:使用Microsoft Speech SDKGoogle TTS或开源库如espeak生成音频
  2. 接口设计

    1. POST /tts
    2. Content-Type: application/json
    3. {
    4. "text": "欢迎使用微信小程序",
    5. "voice": "female", // 音色
    6. "speed": 1.0 // 语速
    7. }
  3. 小程序端播放

    1. function textToSpeech(text) {
    2. wx.request({
    3. url: 'https://your-server.com/tts',
    4. method: 'POST',
    5. data: { text },
    6. success(res) {
    7. const audioUrl = res.data.audio_url;
    8. const player = wx.createInnerAudioContext();
    9. player.src = audioUrl;
    10. player.play();
    11. }
    12. });
    13. }

3.3 性能优化技巧

  • 缓存策略:对常用文本预合成并缓存音频
  • 流式播放:服务端支持分块传输,实现边合成边播放
  • 多音色选择:提供男女声、儿童声等选项

四、完整案例:语音笔记小程序

4.1 功能设计

  1. 按住按钮录音并实时转文字
  2. 编辑文本后合成语音播放
  3. 保存语音/文本到本地

4.2 核心代码实现

  1. // 录音页面
  2. Page({
  3. data: {
  4. isRecording: false,
  5. transcript: '',
  6. audioUrl: ''
  7. },
  8. startRecord() {
  9. this.setData({ isRecording: true });
  10. this.recorderManager.start({ format: 'mp3' });
  11. },
  12. stopRecord() {
  13. this.recorderManager.stop();
  14. this.setData({ isRecording: false });
  15. },
  16. onLoad() {
  17. this.recorderManager = wx.getRecorderManager();
  18. this.recorderManager.onStop((res) => {
  19. this.uploadAndRecognize(res.tempFilePath);
  20. });
  21. },
  22. uploadAndRecognize(filePath) {
  23. wx.uploadFile({
  24. url: 'https://your-server.com/asr',
  25. filePath,
  26. success: (res) => {
  27. const data = JSON.parse(res.data);
  28. this.setData({ transcript: data.result });
  29. }
  30. });
  31. },
  32. playText() {
  33. const text = this.data.transcript;
  34. if (!text) return;
  35. wx.request({
  36. url: 'https://your-server.com/tts',
  37. method: 'POST',
  38. data: { text },
  39. success: (res) => {
  40. const player = wx.createInnerAudioContext();
  41. player.src = res.data.audio_url;
  42. player.play();
  43. this.setData({ audioUrl: res.data.audio_url });
  44. }
  45. });
  46. }
  47. });

4.3 部署注意事项

  1. 域名配置:在微信公众平台配置合法域名
  2. HTTPS要求:所有接口必须使用HTTPS
  3. 性能监控:记录ASR/TTS请求耗时,优化服务端响应

五、常见问题解决方案

  1. 录音权限被拒:引导用户到设置中开启权限
  2. 识别准确率低
    • 使用16kHz采样率
    • 限制录音环境噪音
    • 添加标点符号预测
  3. TTS延迟高
    • 预加载常用语音
    • 使用Websocket保持长连接
  4. 跨平台兼容:测试iOS/Android设备差异,特别是音频格式支持

六、进阶优化方向

  1. 实时ASR:通过WebSocket实现边录音边识别
  2. 情感合成:在TTS请求中添加情感参数(高兴、悲伤等)
  3. 多语言支持:扩展服务端支持中英文混合识别
  4. 离线方案:使用WebAssembly打包轻量级ASR模型

通过以上方案,开发者可快速在微信小程序中实现完整的语音交互功能。实际开发中需根据业务需求平衡实时性、准确率和成本,建议从简单方案起步,逐步迭代优化。