微信小程序录音与语音转文字实现指南
在微信小程序开发中,录音和语音转文字功能是许多场景(如语音笔记、客服对话、语音搜索等)的核心需求。本文将从基础录音功能实现到语音转文字的完整方案,逐步解析技术实现细节,并提供可复用的代码示例。
一、录音功能基础实现
1. 配置录音权限
在微信小程序中,录音功能需要用户授权。首先需在app.json中声明权限:
{"permission": {"scope.record": {"desc": "需要您的录音权限以实现语音功能"}}}
用户首次访问时,需通过wx.authorize主动触发授权:
wx.authorize({scope: 'scope.record',success() {console.log('授权成功');},fail() {wx.showModal({title: '提示',content: '需要录音权限才能使用该功能',success(res) {if (res.confirm) {wx.openSetting(); // 跳转设置页}}});}});
2. 录音API调用
微信小程序提供wx.startRecord(旧版)和wx.getRecorderManager(新版)两种录音方式。推荐使用新版API,其支持更多格式和采样率配置:
const recorderManager = wx.getRecorderManager();// 录音配置const options = {duration: 60000, // 最大录音时长(ms)sampleRate: 44100, // 采样率numberOfChannels: 1, // 单声道encodeBitRate: 192000, // 编码码率format: 'mp3', // 格式(支持aac/mp3/wav)frameSize: 50 // 指定帧大小(单位KB)};// 开始录音recorderManager.start(options);// 监听录音事件recorderManager.onStart(() => {console.log('录音开始');});recorderManager.onStop((res) => {console.log('录音停止', res.tempFilePath);const tempFilePath = res.tempFilePath; // 临时文件路径});// 停止录音function stopRecord() {recorderManager.stop();}
3. 录音文件处理
录音完成后,临时文件需在24小时内使用或上传至服务器。若需持久化存储,需调用wx.saveFile:
wx.saveFile({tempFilePath: tempFilePath,success(res) {const savedFilePath = res.savedFilePath;console.log('文件保存成功', savedFilePath);}});
二、语音转文字实现方案
1. 微信原生API方案
微信提供wx.getBackgroundAudioManager和wx.onVoiceRecallEnd等API,但原生语音转文字功能有限。更推荐使用以下两种方案:
方案一:微信云开发AI能力
若使用微信云开发,可通过wx-server-sdk调用云函数实现语音转文字:
// 云函数代码(Node.js)const cloud = require('wx-server-sdk');cloud.init();exports.main = async (event, context) => {try {const result = await cloud.openapi.voiceToText({audioUrl: event.audioUrl, // 需为公开可访问的URLlang: 'zh_CN' // 语言类型});return result;} catch (err) {return err;}};
小程序端调用:
wx.cloud.callFunction({name: 'voiceToText',data: {audioUrl: 'https://example.com/audio.mp3'},success(res) {console.log('转文字结果', res.result);}});
方案二:第三方语音识别服务
对于高精度需求,可集成第三方服务(如腾讯云、阿里云等)。以下以腾讯云为例:
- 在腾讯云控制台开通语音识别服务。
- 获取API密钥(SecretId/SecretKey)。
- 通过HTTPS请求调用识别接口:
// 示例:使用wx.request调用腾讯云APIfunction requestASR(fileData) {const url = 'https://asr.tencentcloudapi.com/?Action=CreateRecTask&...'; // 完整URL需替换wx.request({url: url,method: 'POST',header: {'Authorization': 'TC3-HMAC-SHA256 Credential=...', // 需按腾讯云文档生成'Content-Type': 'application/json'},data: {EngineModelType: '16k_zh',ChannelNum: 1,ResTextFormat: 0,Data: fileData // 需将音频文件转为Base64},success(res) {console.log('识别结果', res.data);}});}
2. 实时语音转文字优化
对于实时场景(如即时通讯),需结合WebSocket实现流式识别:
- 将音频分片(如每500ms)上传至服务器。
- 服务器使用流式API(如腾讯云StreamASR)处理并返回增量结果。
- 小程序端拼接结果并显示。
三、性能优化与注意事项
-
录音质量:
- 采样率建议16kHz(语音识别通用标准)或44.1kHz(高保真场景)。
- 格式选择mp3(兼容性好)或wav(无损,但文件大)。
-
网络优化:
- 大文件上传前压缩(如使用
lamejs库)。 - 断点续传:记录已上传分片,失败时重传。
- 大文件上传前压缩(如使用
-
错误处理:
- 录音失败时检查麦克风权限。
- 网络请求失败时重试或提示用户。
-
隐私合规:
- 明确告知用户录音用途。
- 敏感场景(如医疗)需脱敏处理。
四、完整代码示例
以下是一个集成录音与语音转文字的完整示例:
// pages/voice/voice.jsPage({data: {isRecording: false,textResult: ''},onLoad() {this.recorderManager = wx.getRecorderManager();this.initRecorder();},initRecorder() {this.recorderManager.onStart(() => {this.setData({ isRecording: true });});this.recorderManager.onStop((res) => {this.setData({ isRecording: false });this.uploadAndRecognize(res.tempFilePath);});},startRecord() {this.recorderManager.start({format: 'mp3',duration: 60000});},stopRecord() {this.recorderManager.stop();},async uploadAndRecognize(tempPath) {try {// 模拟上传(实际需替换为真实API)const res = await this.mockUpload(tempPath);const text = await this.mockRecognize(res.fileId);this.setData({ textResult: text });} catch (err) {wx.showToast({ title: '处理失败', icon: 'none' });}},mockUpload(tempPath) {return new Promise((resolve) => {setTimeout(() => {resolve({ fileId: 'temp_123' });}, 1000);});},mockRecognize(fileId) {return new Promise((resolve) => {setTimeout(() => {resolve('这是识别出的文字内容');}, 1500);});}});
五、总结与扩展
微信小程序的录音与语音转文字功能可通过原生API或第三方服务实现。对于简单场景,云开发方案可快速集成;对于高精度或实时需求,建议使用专业语音识别服务。未来,随着端侧AI模型的发展,轻量级本地识别可能成为新趋势。开发者需根据业务场景权衡精度、延迟与成本,选择最适合的方案。