更新记录
1.0.0(2023-07-14)
兼容ios和安卓端 注意这个是采样率8000的,单独对这个采样率做修复处理的 采样率16000的用这个链接的:https://ext.dcloud.net.cn/plugin?id=9538
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:6.0 - 12.0 | armeabi-v7a:未测试,arm64-v8a:未测试,x86:未测试 | 适用版本区间:9 - 16 |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
逐帧会传 ArrayBuffer 数据格式回来,已经做好封装让接口跟微信小程序端代码保存一致了。
主要分为两个对象,一个是腾讯云asr对象TengxunAsr用于解析语音返回语音文字;一个是录音对象 recorderManager。都兼容安卓/ios/微信小程序三端
<template>
<view>
<page-head title="view"></page-head>
<view style="font-size: 28px; text-align: center" @tap="getRecordAuth">录音(麦克风)授权</view>
<view style="font-size: 28px; text-align: center" @tap="content = ''">清除内容</view>
<view style="font-size: 28px; text-align: center" @tap="start">开始录音</view>
<view style="font-size: 28px; text-align: center" @tap="stop">结束录音</view>
<view>
{{ content + addContent }}
</view>
</view>
</template>
// 引入录音对象
/* #ifdef APP-PLUS */
import Record from './record.js';
/* #endif */
const { authForApp } = require('./appPermission.js');
// 腾讯云asr识别对象
import TengxunAsr from './TengxunAsr';
let recorderManager = null;
let asr = null;
export default {
// 组件名称
name: '',
// 局部注册的组件
components: {},
// 组件参数 接收来自父组件的数据
props: {},
// 组件状态值
data() {
return {
content: '',
addContent: ''
};
},
// 计算属性
computed: {},
// 侦听器
watch: {},
mounted() {
// 这里是使用腾讯云sdk即时识别语音的,不使用的话就直接注释这个asrinit就不会了。
// 如果你是使用腾讯云sdk即时识别语音的,自己补充new TengxunAsr的四个入参
this.asrInit();
this.recorderInit();
},
destroyed() {
recorderManager.destroyed();
asr?.close();
},
// 组件方法
methods: {
asrInit() {
// 初始化腾讯云asr,输入必要的参数
asr = new TengxunAsr({
secretKey: '',
secretId: '',
appId: '',
url: 'asr.cloud.tencent.com/asr/v2/'
});
// asr,有open和close两个主要方法
asr.init({
onOpen: res => {},
onMessage: res => {
const { voice_text_str = '' } = res.result || {};
console.log('%c Line:59 🍺 voice_text_str', 'color:#42b983', voice_text_str);
this.addContent = voice_text_str;
},
onClose: res => {}
});
},
recorderInit() {
/* #ifdef MP-WEIXIN */
recorderManager = uni.getRecorderManager();
/* #endif */
/* #ifdef APP-PLUS */
recorderManager = new Record();
/* #endif */
recorderManager.onStart(() => {
console.log('recorder start');
});
recorderManager.onStop(res => {
console.log('录音停止---------------');
});
recorderManager.onFrameRecorded(res => {
// console.log('持续录音中,持续返回每帧的录音数据,以ArrayBuffer格式,基本常规解析语音的都是这个格式');
const { frameBuffer } = res;
console.log('%c 🍿 frameBuffer: ', 'font-size:20px;background-color: #7F2B82;color:#fff;', frameBuffer);
//我的业务是通过websocket来发送解析语音的,具体看你的业务,发送录音数据的逻辑你根据你的业务去写
asr?.send({
data: frameBuffer,
success: e => {
console.log('发送socket成功', e);
},
fail: err => {
console.log('发送socket失败', err);
},
complete: res => {}
});
}); // 播放监听避免重复绑定
},
// 录音授权
async getRecordAuth() {
/* #ifdef MP-WEIXIN */
await this.wxCheckRecordAuth(); // 检测微信小程序是否获取麦克风权限
/* #endif */
await authForApp('麦克风权限');
},
async start() {
// 开始录音前链接asr,超过15秒没发音频数据会自动断开
asr?.open();
// 等一秒初始化时间,可以在这个业务逻辑上添加ui 的loading
await new Promise(resolve => setTimeout(resolve, 500));
// 'frameSize':int,//帧大小(必须,单位:字节)
// 'sampleRate':int,//采样率(采样率插件写死)8000采样率插件的要写死8000
// 'duration':number // 默认录音时间
// 生成的录音格式一律是pcm,这种格式基本兼容所有市场的asr第三方
// app端录音需要这是四个参数,其他参数内置好了默认值。不建议修改,因为这种配置比较稳定
// 微信小程序端可以根据微信小程序文档自行写入参
const options = {
frameSize: 1024 * 5,
duration:30 * 60 * 1000,
sampleRate: ,
format:'pcm'
};
recorderManager.start(options);
},
stop: function () {
console.log('停止开始', new Date());
recorderManager.stop();
asr?.close();
this.recording = false;
this.content = this.content + this.addContent;
this.addContent = '';
},
// 检测微信是否有麦克风权限
// 微信小程序麦克风权限常见问题:
//{ "errMsg": "A:fail api scope is not declared in the privacy agreement",“errno": 112 } 使用到了 A隐私接口,但是开发者未在[mp后台-设置-服务内容声明-用户隐私保护指引]中声明收集 A接口对应的隐私类型。补充的隐私类型声明,将在5分钟后生效,
wxCheckRecordAuth() {
return new Promise((reslove, reject) => {
uni.getSetting({
success: res => {
if (!res.authSetting['scope.record']) {
console.log(123);
uni.authorize({
scope: 'scope.record',
success: () => {
// 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
reslove(true);
},
fail: () => {
uni.showModal({
content: '检测到您没有打开麦克风权限,是否去设置打开?',
cancelColor: '#',
cancelText: '取消',
confirmText: '确认',
confirmColor: '#006DE7',
success(res) {
if (res.confirm) {
uni.openSetting({
success: res => {
reslove(true);
}
});
} else if (res.cancel) {
reject(false);
}
}
});
}
});
} else {
reslove(true);
}
}
});
});
}
}
};
</script>