uniapp集成百度语音识别:Vue2跨平台开发实战指南
2025.09.23 13:14浏览量:0简介:本文详细介绍如何在uniapp(Vue2)项目中集成百度语音识别API,实现Android/iOS双端语音转文字功能。包含环境配置、权限申请、API调用及错误处理全流程,提供可复用的代码示例和优化建议。
一、技术选型与前期准备
1.1 百度语音识别API选择
百度AI开放平台提供两种语音识别方案:
对于移动端应用,短语音识别(speech_recognizer_short
)是更优选择,其优势在于:
- 响应速度快(<1秒)
- 流量消耗低(约1KB/秒)
- 集成复杂度低
1.2 uniapp环境要求
需确保项目满足:
- HBuilderX 3.2.0+版本
- Vue2语法规范
- 目标平台配置(Android/iOS)
1.3 百度账号注册
- 访问百度AI开放平台
- 创建应用并获取:
APP_ID
:应用唯一标识API_KEY
:接口调用凭证SECRET_KEY
:密钥(需保密)
二、核心实现步骤
2.1 权限配置
Android配置
在manifest.json
中添加:
"app-plus": {
"permissions": [
"<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\"/>"
]
}
iOS配置
在manifest.json
中添加:
"ios": {
"NSMicrophoneUsageDescription": "需要麦克风权限进行语音识别"
}
2.2 核心代码实现
2.2.1 工具类封装
创建baiduVoice.js
:
import { getAccessToken } from '@/api/baiduAuth'
export default {
async recognize(audioData) {
try {
const token = await getAccessToken()
const url = `https://vop.baidu.com/server_api?cuid=${deviceId}&token=${token}`
const formData = new FormData()
formData.append('audio', audioData, 'record.wav')
formData.append('format', 'wav')
formData.append('rate', 16000)
formData.append('channel', 1)
formData.append('token', token)
formData.append('cuid', deviceId)
formData.append('len', audioData.length)
const res = await uni.request({
url,
method: 'POST',
data: formData,
header: {
'Content-Type': 'multipart/form-data'
}
})
return res[1].data
} catch (e) {
console.error('语音识别失败:', e)
throw e
}
}
}
2.2.2 录音组件实现
<template>
<view>
<button @click="startRecord">开始录音</button>
<button @click="stopRecord" :disabled="!isRecording">停止录音</button>
<text v-if="result">识别结果:{{result}}</text>
</view>
</template>
<script>
import recorder from '@/utils/recorder'
import voiceApi from '@/utils/baiduVoice'
export default {
data() {
return {
isRecording: false,
audioPath: '',
result: ''
}
},
methods: {
async startRecord() {
try {
this.audioPath = await recorder.start({
format: 'wav',
sampleRate: 16000
})
this.isRecording = true
} catch (e) {
uni.showToast({ title: '录音失败', icon: 'none' })
}
},
async stopRecord() {
const filePath = await recorder.stop()
const audioData = await this.readFile(filePath)
try {
const res = await voiceApi.recognize(audioData)
this.result = res.result[0]
} catch (e) {
uni.showToast({ title: '识别失败', icon: 'none' })
} finally {
this.isRecording = false
}
},
readFile(path) {
return new Promise((resolve, reject) => {
plus.io.resolveLocalFileSystemURL(path, entry => {
entry.file(file => {
const reader = new plus.io.FileReader()
reader.onloadend = e => resolve(new Uint8Array(e.target.result))
reader.onerror = reject
reader.readAsArrayBuffer(file)
})
}, reject)
})
}
}
}
</script>
2.3 百度认证服务
创建baiduAuth.js
:
let token = ''
let expireTime = 0
export async function getAccessToken() {
if (Date.now() < expireTime && token) {
return token
}
const res = await uni.request({
url: 'https://aip.baidubce.com/oauth/2.0/token',
method: 'POST',
data: {
grant_type: 'client_credentials',
client_id: 'YOUR_API_KEY',
client_secret: 'YOUR_SECRET_KEY'
}
})
token = res[1].data.access_token
expireTime = Date.now() + res[1].data.expires_in * 1000 - 60000 // 提前1分钟刷新
return token
}
三、常见问题解决方案
3.1 录音权限被拒处理
// 在录音前检查权限
async checkPermission() {
const status = await uni.authorize({
scope: 'scope.record'
})
if (status !== 'authorized') {
uni.showModal({
title: '权限请求',
content: '需要麦克风权限进行语音识别',
success: async ({ confirm }) => {
if (confirm) {
await uni.openSetting()
}
}
})
}
}
3.2 音频格式要求
百度语音识别要求:
- 采样率:16000Hz(必须)
- 格式:wav/pcm/amr/speex
- 位深:16bit
- 声道:单声道
转换工具推荐:
// 使用ffmpeg.js进行格式转换(需引入webassembly版本)
async function convertAudio(inputPath) {
const { data } = await uni.getFileSystemManager().readFile({
filePath: inputPath
})
// 这里添加ffmpeg转换逻辑
return convertedData
}
3.3 错误码处理
错误码 | 含义 | 解决方案 |
---|---|---|
100 | 参数错误 | 检查format/rate参数 |
110 | 认证失败 | 检查token有效性 |
111 | 配额超限 | 升级服务等级 |
120 | 音频过长 | 控制录音时长<60秒 |
四、性能优化建议
- 预加载token:在App启动时获取token
- 本地缓存:对频繁识别的内容做本地缓存
- 分片上传:对于长音频采用分片上传策略
- 降噪处理:使用WebAudio API进行前端降噪
// 简单降噪示例
function applyNoiseSuppression(audioBuffer) {
const channelData = audioBuffer.getChannelData(0)
const threshold = 0.02
for (let i = 0; i < channelData.length; i++) {
if (Math.abs(channelData[i]) < threshold) {
channelData[i] = 0
}
}
return audioBuffer
}
五、部署注意事项
iOS配置:
- 在
Info.plist
中添加:<key>NSMicrophoneUsageDescription</key>
<string>需要麦克风权限进行语音输入</string>
- 确保Build Settings中
ENABLE_BITCODE
设为NO
- 在
Android配置:
- 在
AndroidManifest.xml
中添加:<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 在
真机调试:
- 必须使用真机测试,模拟器可能无法获取麦克风权限
- 首次使用需手动授权麦克风权限
六、扩展功能建议
多语言支持:
// 在请求中添加lang参数
formData.append('lan', 'zh') // 中文
// 可选值:zh, en, canto, etc.
实时显示识别结果:
// 使用WebSocket实现流式识别
async function startStreamRecognize() {
const ws = new WebSocket('wss://vop.baidu.com/stream_api_v1')
ws.onmessage = (e) => {
const data = JSON.parse(e.data)
if (data.result) {
this.partialResult = data.result[0]
}
}
// 发送音频分片...
}
语音指令控制:
// 结合NLP实现指令识别
async function recognizeCommand() {
const text = await this.recognize()
const commands = {
'打开设置': () => uni.switchTab({ url: '/pages/settings' }),
'返回主页': () => uni.switchTab({ url: '/pages/home' })
}
for (const [cmd, action] of Object.entries(commands)) {
if (text.includes(cmd)) {
action()
break
}
}
}
通过以上实现方案,开发者可以在uniapp(Vue2)项目中快速集成百度语音识别功能,实现高质量的语音转文字服务。实际开发中需注意权限管理、错误处理和性能优化等关键点,以确保应用的稳定性和用户体验。
发表评论
登录后可评论,请前往 登录 或 注册