在uniapp中使用百度语音识别技术创建简易录音器
2025.09.19 17:45浏览量:0简介:本文详细介绍了在uniapp框架中集成百度语音识别API,实现一个支持录音与语音转文字功能的简易录音器,涵盖环境准备、权限配置、录音实现、语音识别调用及完整代码示例。
一、引言
随着移动应用对语音交互需求的增长,语音识别技术已成为提升用户体验的关键功能。uniapp作为跨平台开发框架,结合百度语音识别API,可快速实现录音与语音转文字功能。本文将详细介绍如何在uniapp中集成百度语音识别技术,构建一个支持录音、播放及实时转文字的简易录音器。
二、技术准备
1. 百度语音识别API申请
首先需在百度智能云平台申请语音识别服务:
- 注册并登录百度智能云账号
- 进入「语音技术」-「语音识别」服务
- 创建应用获取API Key和Secret Key
- 记录「接口地址」(如
wss://vop.baidu.com/websocket_asr
)
2. uniapp项目配置
- 创建uniapp项目:通过HBuilderX新建uniapp项目,选择基础模板。
- 安装依赖:
npm install @dcloudio/uni-ui --save
npm install js-base64 --save # 用于Base64编码
- 配置manifest.json:
- 在「App权限配置」中添加录音权限:
"app-plus": {
"permissions": ["record"]
}
- iOS需在Xcode中配置
NSMicrophoneUsageDescription
权限描述。
- 在「App权限配置」中添加录音权限:
三、核心功能实现
1. 录音功能实现
uniapp通过plus.audio.getRecorder
API实现录音:
// 录音配置
const recorderOptions = {
filename: '_doc/audio/record.wav', // 录音文件路径
format: 'wav', // 格式支持wav/amr
samplerate: 16000 // 采样率(百度API要求16k或8k)
};
// 开始录音
function startRecord() {
return new Promise((resolve, reject) => {
const recorder = plus.audio.getRecorder();
recorder.record(recorderOptions,
() => resolve(recorder),
(error) => reject(error)
);
});
}
// 停止录音
function stopRecord(recorder) {
return new Promise((resolve) => {
recorder.stop(() => {
const filePath = recorderOptions.filename;
resolve(filePath);
});
});
}
2. 百度语音识别集成
2.1 WebSocket连接
百度语音识别通过WebSocket协议传输音频数据:
// 生成鉴权Token
async function getAccessToken(apiKey, secretKey) {
const res = await uni.request({
url: `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${apiKey}&client_secret=${secretKey}`
});
return res.data.access_token;
}
// 建立WebSocket连接
async function connectWebSocket(token) {
const socketUrl = `wss://vop.baidu.com/websocket_asr?token=${token}&cuid=${plus.device.uuid}&server=1`;
return new Promise((resolve) => {
const socketTask = uni.connectSocket({ url: socketUrl });
socketTask.onOpen(() => resolve(socketTask));
});
}
2.2 音频数据传输
需将录音文件转为Base64并分片发送:
// 读取音频文件并分片发送
async function sendAudioData(socketTask, filePath) {
const fileContent = await plus.io.readFile({ filePath });
const base64Data = uni.base64ToArrayBuffer(fileContent);
// 发送开始标记
socketTask.send({
data: JSON.stringify({
format: 'wav',
rate: 16000,
channel: 1,
cuid: plus.device.uuid,
token: await getAccessToken(API_KEY, SECRET_KEY)
})
});
// 分片发送音频数据(每1280字节)
const chunkSize = 1280;
for (let i = 0; i < base64Data.byteLength; i += chunkSize) {
const chunk = base64Data.slice(i, i + chunkSize);
socketTask.send({ data: chunk });
}
// 发送结束标记
socketTask.send({ data: JSON.stringify({ end: true }) });
}
3. 实时识别结果处理
通过WebSocket消息回调获取识别结果:
function setupWebSocketListeners(socketTask) {
let finalResult = '';
socketTask.onMessage((res) => {
const data = JSON.parse(res.data);
if (data.result) {
finalResult += data.result[0]; // 累加中间结果
}
if (data.result_type === 'final_result') {
console.log('最终结果:', finalResult);
// 更新UI显示
uni.showToast({ title: `识别完成: ${finalResult}` });
}
});
}
四、完整实现示例
export default {
data() {
return {
isRecording: false,
recognitionResult: '',
API_KEY: '你的API_KEY',
SECRET_KEY: '你的SECRET_KEY'
};
},
methods: {
async startRecording() {
try {
this.isRecording = true;
const recorder = await startRecord();
const token = await getAccessToken(this.API_KEY, this.SECRET_KEY);
const socketTask = await connectWebSocket(token);
setupWebSocketListeners(socketTask);
// 5秒后停止录音(示例)
setTimeout(async () => {
const filePath = await stopRecord(recorder);
sendAudioData(socketTask, filePath);
this.isRecording = false;
}, 5000);
} catch (error) {
console.error('录音失败:', error);
}
}
}
};
五、优化与注意事项
错误处理:
- 添加网络状态检测(
uni.getNetworkType
) - 处理WebSocket断开重连逻辑
- 添加网络状态检测(
性能优化:
- 使用
Worker
线程处理音频数据 - 实现音频压缩(如Opus编码)
- 使用
平台差异:
- Android需动态申请录音权限
- iOS需配置后台运行模式
安全建议:
- 不要在前端硬编码API密钥
- 通过后端服务中转鉴权请求
六、总结
通过uniapp结合百度语音识别API,开发者可快速实现跨平台语音交互功能。本文提供的实现方案覆盖了录音管理、WebSocket通信、实时结果处理等核心环节,实际开发中可根据需求扩展文件上传、多语言识别等高级功能。建议参考百度官方文档[1]和uniapp插件市场[2]中的相关组件,进一步提升开发效率。
[1] 百度语音识别API文档:https://cloud.baidu.com/doc/SPEECH/s/5k38y0wab
[2] uniapp插件市场:https://ext.dcloud.net.cn/
发表评论
登录后可评论,请前往 登录 或 注册