更新记录

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

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
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>

总结下用户遇到的问题: 1.我忙,不经常看平台信息,可以加我微信 。 2.用我的插件要自定义基座,更新基座,更新基座! 3.看 demo 里面的文件,别看文档,上面平台的文档仅仅参考。平台文档的代码 md 解析不全。4.onStop 返回的不是临时音频地址而是音频数据流,因为uniapp在前端生成音频文件负担很大(发热,卡机),然后临时路径二次打开会乱。这是uniapp在原生的集成上没优化好,没办法

最重要的,现有的功能是已经可以稳定运行的,没时间,也不会再做拓展的修改!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

安卓注意在配置中申请录音权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问