简介:本文详细介绍如何在UniApp中实现微信小程序与H5的语音输入功能,涵盖录音权限管理、录音API调用、语音转文字处理及跨端兼容方案,帮助开发者快速构建跨平台语音交互能力。
随着移动端交互方式的升级,语音输入已成为提升用户体验的核心功能。在UniApp跨端开发场景中,微信小程序和H5的语音实现存在显著差异:微信小程序提供原生录音API,而H5需依赖浏览器WebRTC或第三方服务。开发者需解决权限管理、音频处理、跨端兼容三大核心问题。
// 动态申请录音权限uni.authorize({scope: 'scope.record',success() {console.log('授权成功');startRecord();},fail(err) {console.error('授权失败:', err);uni.showModal({title: '提示',content: '需要录音权限才能使用语音功能',showCancel: false});}});
let recorderManager = uni.getRecorderManager();// 配置录音参数const recordOptions = {format: 'mp3', // 微信小程序支持格式sampleRate: 16000,numberOfChannels: 1,encodeBitRate: 128000,frameSize: 50};// 开始录音function startRecord() {recorderManager.start(recordOptions);recorderManager.onStart(() => {console.log('录音开始');});recorderManager.onError((err) => {console.error('录音错误:', err);});}// 停止录音并处理function stopRecord() {recorderManager.stop();recorderManager.onStop((res) => {console.log('录音文件:', res.tempFilePath);// 此处可上传服务器或进行本地识别uploadAudio(res.tempFilePath);});}
推荐使用微信原生语音识别API或集成第三方服务:
// 使用微信语音识别(需配置合法域名)uni.uploadFile({url: 'https://api.weixin.qq.com/cgi-bin/media/audio/tovoice',filePath: tempFilePath,name: 'media',formData: {access_token: 'YOUR_ACCESS_TOKEN'},success(res) {const data = JSON.parse(res.data);console.log('识别结果:', data.result);}});
// 检查浏览器兼容性function checkBrowserSupport() {return navigator.mediaDevices &&navigator.mediaDevices.getUserMedia;}// 初始化录音async function initH5Recorder() {try {const stream = await navigator.mediaDevices.getUserMedia({audio: true,echoCancellation: true});const audioContext = new (window.AudioContext || window.webkitAudioContext)();const source = audioContext.createMediaStreamSource(stream);const processor = audioContext.createScriptProcessor(4096, 1, 1);source.connect(processor);processor.connect(audioContext.destination);processor.onaudioprocess = (e) => {const buffer = e.inputBuffer.getChannelData(0);// 处理音频数据或发送到WebWorker};} catch (err) {console.error('录音初始化失败:', err);}}
推荐使用以下成熟方案:
// 示例:调用腾讯云语音识别async function recognizeSpeech(audioData) {const formData = new FormData();formData.append('audio', new Blob([audioData]), 'record.wav');formData.append('engine_type', 'sms16k');formData.append('channel_num', 1);const response = await fetch('https://recognition.tencentcloudapi.com', {method: 'POST',headers: {'Authorization': 'Bearer YOUR_TOKEN'},body: formData});const result = await response.json();return result.data.result;}
// #ifdef MP-WEIXINconst recordApi = uni.getRecorderManager();// #endif// #ifdef H5let mediaRecorder;// #endifexport function startRecording() {// #ifdef MP-WEIXINrecordApi.start({format: 'mp3'});// #endif// #ifdef H5initH5Recorder();// #endif}
class VoiceRecorder {constructor() {this.platform = uni.getSystemInfoSync().platform;}async start() {if (this.platform === 'mp-weixin') {return this.startWeixinRecord();} else if (this.platform === 'h5') {return this.startH5Record();}}async startWeixinRecord() {// 微信小程序实现}async startH5Record() {// H5实现}}
function handleRecordError(err) {const errorMap = {'PERMISSION_DENIED': '用户拒绝录音权限','NOT_SUPPORTED': '浏览器不支持录音功能','NETWORK_ERROR': '网络请求失败'};const errorMsg = errorMap[err.code] || '未知错误';uni.showToast({title: errorMsg,icon: 'none'});// 错误上报trackError('RECORD_FAILURE', {code: err.code,message: err.message});}
// 示例:完整的录音管理器export default {state: {isRecording: false,tempFilePath: null},mutations: {SET_RECORDING(state, status) {state.isRecording = status;},SET_TEMP_FILE(state, path) {state.tempFilePath = path;}},actions: {async startRecord({ commit }) {// 实现跨端录音逻辑commit('SET_RECORDING', true);},stopRecord({ commit, state }) {// 停止录音并处理结果commit('SET_RECORDING', false);}}}
通过以上方案,开发者可以在UniApp中实现高效的跨端语音输入功能。实际开发中需根据具体业务需求调整参数配置,并充分测试不同平台下的表现。建议结合云服务实现更复杂的语音处理需求,同时注意用户隐私数据保护。