Unity-AndroidStudio学习笔记-尝试在unity里打开安卓原生麦克风

本文档详细记录了如何在Unity项目中使用Android Studio通过原生API打开麦克风,并将录音转换为AMR和Opus格式,以直接对接图灵接口,避免了中间百度语音识别步骤。作者分享了动态权限申请、文件存储权限管理和关键代码实现过程。

Unity-AndroidStudio学习笔记


很久没写java,这次回来整这个是因为项目之前需要语音功能,公司对接的图灵只支持amr和opus的音频格式上传进行识别,但是unity自带的麦克风的功能目前据我所知只支持wav和mp3.所以之前的解决办法一直是先通过能识别wav格式的百度api去传音频数据解析返回语音的识别结果,然后把结果以文字的方式再回传给图灵的api接口,从而间接的实现语音对话的功能.但是显而易见这样做的弊端有很多,首先就是需要额外的工作量和精力去接入百度,其次就是一个语音功能需要两个不同平台的api去实现显然是不可取的,但迫于当时时间和个人能力的原因,只能以这种方式实现
现在在不断的学习和对代码逻辑思维的不断清晰下,加上之前使用百度的语音唤醒功能让我对安卓的代码有了更深的理解,所以想挑战通过安卓原生的麦克风去直接回传amr和opus格式的音频文件给图灵接口,这样就可以去掉通过百度识别语音的步骤了

尝试打开麦克风

首先是需要在as里新建一个项目,然后新建一个library
导入unity-classes.jar文件到libs里,然后引用一下
具体的麦克风打开的步骤可以参考下面的这个帖子,我基本就是照猫画虎

https://www.cnblogs.com/vir56k/archive/2012/11/29/2794226.html

这里需要注意一下
由于安卓的更新,在不同的移动端上,安卓的不同版本在授权上有不同的处理方式
安卓6.0以上的话需要动态的在程序运行的时候去申请权限
这里可以参考其他大佬动态申请权限的帖子,小弟因为隔了一天,突然找不到用的大佬的帖子的网址了
哦我想起来了,这个动态申请权限的方法是看之前使用百度语音唤醒时看的帖子里的,在那个大佬的代码里初始化语音唤醒和识别的时候就做了这个操作,然后我就发现了他在初始化动态申请权限的方法里形参里加了一个Context,对java不了解的我点进去看了一下,发现这个其实就是一个activity,然后就用了上面讲的思路,把unity这个activity传回给了aar包里的这个初始化打胎申请权限的方法
这里贴一下自己看了之后做了一些变动的逻辑
这里是java代码

public String startRecording() {
   
   

        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setOutputFile(newFileName());
        try {
   
   
            mediaRecorder.prepare();
        } catch (Exception e) {
   
   
            Log.e("test", e.getMessage());
        }
        mediaRecorder.start();
        return "finied";
    }
    public String newFileName() {
   
   
        //String mFileName = Environment.getExternalStorageDirectory() + File.separator + Environment.DIRECTORY_DCIM + File.separator;
        String mFileName = Environment.getExternalStorageDirectory()
                .getAbsolutePath();
        String s = new SimpleDateFormat("yyyy-MM-dd hhmmss")
                .format(new Date());
        mFileName += "/rcd_" + s + ".amr";
        Log.d("test", mFileName);
        return mFileName;
    }
	/**
     * android 6.0 以上需要动态申请权限
     */
    public void initPermission(Context context) {
   
   
        String permissions[] = {
   
   Manifest.permission.RECORD_AUDIO,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.INTERNET,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        PackageManager pm = getActivityByContext(context).getPackageManager();
        boolean permission_readStorage = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.RECORD_AUDIO", "com.cientx.tianguo"));
        boolean permission_network_state = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.ACCESS_NETWORK_STATE", "com.cientx.tianguo"));
        boolean permission_internet = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.INTERNET", "com.cientx.tianguo"));
        boolean permission_writeStorage = (PackageManager.PERMISSION_GRANTED ==
                pm.checkPermission("android.permission.WRITE_EXTERNAL_STORAGE", "com.cientx.tianguo"));

        if (!(permission_readStorage && permission_writeStorage && permission_network_state && permission_internet)) {
   
   
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   
   
                getActivityByContext(context)
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淳杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值