Android 集成科大讯飞语音并实现语音识别

前言:此博客内容有,集成讯飞语音sdk,实现了语音唤醒,在线语音识别,离线语音识别,更新本地离线语音词典

集成讯飞语音SDK

注册账号下载SDK

百度搜索科大讯飞,打开网站,没有账号的根据操作步骤注册账号,注册完成之后,根据个人需求下载sdk,因为咱们要实现的内容有离线语音识别,语音唤醒,以及更新本地离线语音字典,所以在下载SDK之前需要添加唤醒词,添加完之后再去下载SDK

导入demo

导入demo,有可能会报错,怕大家不知道怎么解决,这里我就给大家详细介绍一下,会遇到的一些问题都是怎么解决的;
先导入demo
!导入demo
导入demo后我的会报着个错误

ERROR: Plugin with id 'com.android.application' not found.
Open File

我们仔细观察会发现此项目结构中只有 Project 的build.grade 文件,没有Module 的 build.grade,所以我们在 Project 的build.gradle中添加如下代码,然后try again

buildscript {
   
    repositories {
   
        google()
        jcenter()

    }
    dependencies {
   
      //版本号请根据自己的gradle插件版本号自行更改
        classpath 'com.android.tools.build:gradle:3.2.0'

    }
}

在这里需要注意一下,buildscript 、 android 和 dependencies 他们三个是同级的关系,如下图
在这里插入图片描述
同步完之后我的又报如下错误

ERROR: The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.
Remove minSdkVersion and sync project
Affected Modules: mscV5PlusDemo


WARNING: The specified Android SDK Build Tools version (26.0.2) is ignored, as it is below the minimum supported version (28.0.2) for Android Gradle Plugin 3.2.0.
Android SDK Build Tools 28.0.2 will be used.
To suppress this warning, remove "buildToolsVersion '26.0.2'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.
Remove Build Tools version and sync project
Affected Modules: mscV5PlusDemo


WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html
Affected Modules: mscV5PlusDemo

第一个错误的意思是:minSdk版本不应该在android manifest文件中声明。您可以将版本从清单移动到构建中的defaultConfig。gradle文件。
那么我们就打开android manifest,找到minSdk,把他删除
在这里插入图片描述
第二个错误的意思是从构建版本中删除"buildToolsVersion ‘26.0.2’",那么就删除他
在这里插入图片描述
第三个错误的意思是配置’compile’已过时,已被’implementation’和’api’取代。
在这里插入图片描述
然后同步一下,运行程序,发现不能跑起来,在build下回找到,如下图一段代码,在这里插入图片描述
在build.gradle里面添加google(),如下图
在这里插入图片描述
同步一下,在运行,就可以装到手机上了,但是这里还有一点需要修改,就是把demo里面的APPID替换成自己注册的APPID,别忘了替换呀!!!

配置项目

讲demo中libs拷贝到自己的lib里
在这里插入图片描述
然后再将assets里面的文件全部导入到项目中
在这里插入图片描述

在线语音识别

首先添加权限

 <!-- 连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 读取网络信息状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取当前wifi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />

然后创建一个application,代码如下

public class SpeechApplication extends Application {

    @Override
    public void onCreate() {

        //   5ef048e1  为在开放平台注册的APPID  注意没有空格,直接替换即可
        SpeechUtility.createUtility(SpeechApplication.this, "appid=5ef048e1");

        super.onCreate();
    }
}

下面是MainActivity里面的代码


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
   

    private static final String TAG = "yaya";

    private SpeechRecognizer mIat;// 语音听写对象
    private RecognizerDialog mIatDialog;// 语音听写UI

    // 用HashMap存储听写结果
    private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();

    private SharedPreferences mSharedPreferences;//缓存

    private String mEngineType = SpeechConstant.TYPE_CLOUD;// 引擎类型
    private String language = "zh_cn";//识别语言

    private TextView tvResult;//识别结果
    private Button btnStart;//开始识别
    private String resultType = "json";//结果内容数据格式
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvResult = findViewById(R.id.tv_result);
        btnStart = findViewById(R.id.btn_start);
        btnStart.setOnClickListener(this);//实现点击监听
        initPermission();

        // 使用SpeechRecognizer对象,可根据回调消息自定义界面;
        mIat = SpeechRecognizer.createRecognizer(MainActivity.this, mInitListener);
        // 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源
        mIatDialog = new RecognizerDialog(MainActivity.this, mInitListener);
        mSharedPreferences = getSharedPreferences("ASR",
                Activity.MODE_PRIVATE);

    }

    @Override
    public void onClick(View v) {
   
        if (null == mIat) {
   
            // 创建单例失败,与 21001 错误为同样原因,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
            showMsg("创建对象失败,请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化");
            return;
        }

        mIatResults.clear();//清除数据
        setParam(); // 设置参数
        mIatDialog.setListener(mRecognizerDialogListener);//设置监听
        mIatDialog.show();// 显示对话框

    }

    /**
     * android 6.0 以上需要动态申请权限
     */
    private void initPermission() {
   
        String permissions[] = {
   Manifest.permission.RECORD_AUDIO,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.INTERNET,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        ArrayList<String> toApplyList = new ArrayList<String>();

        for (String perm : permissions) {
   
            if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
   
                toApplyList.add(perm);
            }
        }
        String tmpList[] = new String[toApplyList.size()];
        if (!toApplyList.isEmpty()) {
   
            ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
        }

    }

    /**
     * 权限申请回调,可以作进一步处理
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
   
        // 此处为android 6.0以上动态授权的回调,用户自行实现。
    }
    
    /**
     * 初始化监听器。
     */
    private InitListener mInitListener = new InitListener() {
   

        @Override
        public void onInit(int code) {
   
            Log.d(TAG, "SpeechRecognizer init() code = " + code);
            if (code != ErrorCode.SUCCESS) {
   
                showMsg("初始化失败,错误码:" + code + ",请点击网址https://www.xfyun.cn/document/error-code查询解决方案");
            }
        }
    };
    
    /**
     * 听写UI监听器
     */
    private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
   
        public void onResult(RecognizerResult results, boolean isLast) {
   

            printResult(results);//结果数据解析

        }

        /**
         * 识别回调错误.
         */
        public void onError(SpeechError error) {
   
            showMsg(error.getPlainDescription(true));
        }

    };

    /**
     * 提示消息
     *
     * @param msg
     */
    private void showMsg(String msg) {
   
        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
    }
    
    /**
     * 数据解析
     *
     * @param results
     */
    private void printResult(RecognizerResult results) {
   
        String text = JsonParser.parseIatResult(results.getResultString());

        String sn = null;
        // 读取json结果中的sn字段
        try {
   
            JSONObject resultJson = new JSONObject(results.getResultString());
            sn = resultJson.optString("sn");
        } catch (JSONException e) {
   
            e.printStackTrace();
        }

        mIatResults.put(sn, text);

        StringBuffer resultBuffer = new StringBuffer();
        for (String key : mIatResults.keySet()) {
   
            resultBuffer.append(mIatResults.get(key));
        }

        tvResult.setText(resultBuffer.toString());//听写结果显示

        if (resultBuffer.toString().equals("语音唤醒。")) {
   
            startActivity(new Intent(this, WeakUpActivity.class));
        } else if (resultBuffer.toString().equals("离线")) {
   
            startActivity(new Intent(this, OfflineActivity.class));
        }

    }

    /**
     * 参数设置
     *
     * @return
     */
    public void setParam() {
   
        // 清空参数
        mIat.setParameter(SpeechConstant.PARAMS, null);
        // 设置听写引擎
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
        // 设置返回结果格式
        mIat.setParameter(SpeechConstant.RESULT_TYPE, resultType);

        if (language.equals("zh_cn")) {
   
            String lag = mSharedPreferences.getString("iat_language_preference",
                    "mandarin");
            Log.e(TAG, "language:" + language);// 设置语言
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            // 设置语言区域
            mIat.setParameter(SpeechConstant.ACCENT, lag);
        } else {
   

            mIat.setParameter(SpeechConstant.LANGUAGE, language);
        }
        Log.e(TAG, "last language:" 
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
回答: 在Unity中使用科大讯飞语音的过程中,有一些常见问题需要注意。首先,关于路径的问题,需要确保ivw_res_path路径中不包含中文字符,否则会报错10102。此外,路径中的斜杠需要替换为反斜杠,否则也会报错10102。\[1\] 其次,关于QIVWAudioWrite接口需要调用两次的问题,这是因为在写入音频数据时,需要先调用一次MSP_AUDIO_SAMPLE_CONTINUE表示音频数据的中间部分,然后再调用一次MSP_AUDIO_SAMPLE_LAST表示音频数据的最后一部分。这样做是为了确保音频数据的完整性。\[2\] 最后,关于QIVWRegisterNotify接口后面需要使用Sleep的问题,这是因为在注册通知后,需要给科大讯飞语音一些时间来处理注册的操作。使用Sleep函数可以暂停程序的执行,让科大讯飞语音有足够的时间来完成注册。具体的等待时间可以根据实际情况进行调整。\[2\] 总结起来,在Unity中使用科大讯飞语音时,需要注意路径中不包含中文字符,斜杠需要替换为反斜杠;在写入音频数据时,需要调用两次接口来表示音频数据的中间部分和最后一部分;在注册通知后,需要使用Sleep函数给科大讯飞语音足够的时间来完成注册操作。 #### 引用[.reference_title] - *1* *2* [Unity 科大讯飞语音唤醒](https://blog.csdn.net/weixin_42208093/article/details/107364588)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值