美文网首页
Android讯飞语音听写

Android讯飞语音听写

作者: 图之 | 来源:发表于2018-10-26 09:19 被阅读0次

    讯飞准备工作

    想要接入讯飞语音听写功能,需要在讯飞开放平台注册应用https://www.xfyun.cn/,并且开通语音听写服务

    image.png
    添加libs文件
    将在官网下载的Android SDK 压缩包中libs目录下所有子文件拷贝至Android工程的libs目录下
    下载地址:https://www.xfyun.cn/sdk/dispatcher
    更多关于SDK文档:https://doc.xfyun.cn/msc_android/index.html

    清单文件中添加权限

    <!--连接网络权限,用于执行云端语音能力 -->
    <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.CHANGE_NETWORK_STATE"/>
    <!--读取手机信息权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!--读取联系人权限,上传联系人需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <!--外存储写权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--外存储读权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <!--配置权限,用来记录应用配置信息 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
    <!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <!--如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
    <uses-permission android:name="android.permission.CAMERA" />
    

    语音识别 基础的 Activity

     public static final String PRIVATE_SETTING="com.iflytek.setting";           //缓存数据的名称
        private static final String TAG = "BasicIatActivity";
        private EditText mContent;                          //显示内容
        // 语音听写对象
        private SpeechRecognizer mIat;
        // 语音听写UI
        private RecognizerDialog mIatDialog;
        // 用HashMap存储听写结果
        private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
        private SharedPreferences mSharedPreferences;
        private Toast mToast;
        // 引擎类型
        private String mEngineType = SpeechConstant.TYPE_CLOUD;
        int ret = 0; // 函数调用返回值
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            //XXXXXX:你的appid
            SpeechUtility.createUtility(this, SpeechConstant.APPID + "=XXXXXX");
            Log.d(TAG, "onCreate--->");
            initIat();
            //初始化组件   后期修改为,程序一进入的时候进行初始化
            mToast = Toast.makeText(IatBasicActivity.this,"",Toast.LENGTH_SHORT);
        }
        /**
         * 显示toast
         * @param content  待显示的内容
         */
        public void showTip(String content){
            mToast.setText(content);
            mToast.show();
        }
        /**
         * 初始化 EditText 在需要调用语音接口中的类的初始化方法中调用该方法
         *
         * @param mContent
         */
        public void initIatData(EditText mContent) {
            this.mContent = mContent;
        }
        /**
         * 初始化语音识别中的对象
         */
        private void initIat() {
            // 使用SpeechRecognizer对象,可根据回调消息自定义界面;
            mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
            // 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer
            // 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源
            mIatDialog = new RecognizerDialog(this, mInitListener);
            mSharedPreferences = getSharedPreferences(PRIVATE_SETTING,
                    Activity.MODE_PRIVATE);
        }
        /**
         * 初始化监听器
         */
        private InitListener mInitListener = new InitListener() {
            @Override
            public void onInit(int code) {
                Log.d(TAG, "SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    showTip("初始化失败,错误码:" + code);
                }
            }
        };
        /**
         * 听写UI监听器
         */
        private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
            public void onResult(RecognizerResult results, boolean isLast) {
                Log.d(TAG, results.getResultString());
                printResult(results, mContent);
                Log.d(TAG, results.getResultString());
            }
            /**
             * 识别回调错误.
             */
            public void onError(SpeechError error) {
                showTip(error.getPlainDescription(true));
            }
        };
        /**
         * 听写监听器。
         */
        private RecognizerListener mRecognizerListener = new RecognizerListener() {
            @Override
            public void onBeginOfSpeech() {
                // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
                showTip("开始说话");
            }
            @Override
            public void onError(SpeechError error) {
                // Tips:
                // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
                // 如果使用本地功能(语记)需要提示用户开启语记的录音权限。
                showTip(error.getPlainDescription(true));
            }
            @Override
            public void onEndOfSpeech() {
                // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
                showTip("结束说话");
            }
            @Override
            public void onResult(RecognizerResult results, boolean isLast) {
                Log.d(TAG, results.getResultString());
                printResult(results, mContent);
                Log.d(TAG, results.getResultString());
                if (isLast) {
                    // TODO 最后的结果
                }
            }
            @Override
            public void onVolumeChanged(int volume, byte[] data) {
                showTip("当前正在说话,音量大小:" + volume);
                Log.d(TAG, "返回音频数据:" + data.length);
            }
            @Override
            public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
                // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
                // 若使用本地能力,会话id为null
                //  if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                //      String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
                //      Log.d(TAG, "session id =" + sid);
                //  }
            }
        };
        /**
         * 参数设置
         *
         * @param
         * @return
         */
        public void setParam() {
            // 清空参数
            mIat.setParameter(SpeechConstant.PARAMS, null);
            // 设置听写引擎
            mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
            // 设置返回结果格式
            mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
            String lag = mSharedPreferences.getString("iat_language_preference",
                    "mandarin");
            if (lag.equals("en_us")) {
                // 设置语言
                mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
            } else {
                // 设置语言
                mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
                // 设置语言区域
                mIat.setParameter(SpeechConstant.ACCENT, lag);
            }
            // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
            mIat.setParameter(SpeechConstant.VAD_BOS, mSharedPreferences.getString("iat_vadbos_preference", "4000"));
    
            // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
            mIat.setParameter(SpeechConstant.VAD_EOS, mSharedPreferences.getString("iat_vadeos_preference", "1000"));
    
            // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
            mIat.setParameter(SpeechConstant.ASR_PTT, mSharedPreferences.getString("iat_punc_preference", "1"));
    
            // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
            // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
            mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
            mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");
        }
    
    
        /**
         * 触发点击事件时的方法
         */
        public void clickMethod() {
            mContent.setText(null);// 清空显示内容
            mIatResults.clear();
            // 设置参数
            setParam();
            boolean isShowDialog = mSharedPreferences.getBoolean(getString(R.string.pref_key_iat_show), true);
            if (isShowDialog) {
                // 显示听写对话框
                mIatDialog.setListener(mRecognizerDialogListener);
                mIatDialog.show();
                showTip(getString(R.string.text_begin));
            } else {
                // 不显示听写对话框
                ret = mIat.startListening(mRecognizerListener);
                if (ret != ErrorCode.SUCCESS) {
                    Log.d(TAG, "听写失败,错误码:" + ret);
                } else {
                    showTip(getString(R.string.text_begin));
                }
            }
        }
    
        /**
         * 显示结果,并赋值到EditText文本框中
         *
         * @param results
         * @param editText
         */
        private void printResult(RecognizerResult results, EditText editText) {
            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));
            }
            String content = resultBuffer.toString();
            Log.d(TAG, content);
            content = content.replace("。", "".trim());           //去掉最后面的 。
            editText.setText(content);
            editText.setSelection(content.length());
        }
    
            @Override
            public void onStart() {
                super.onStart();
            }
    
            @Override
            public void onStop() {
                super.onStop();
            }
    

    MainActivity

    
    public class MainActivity  extends IatBasicActivity implements View.OnClickListener {
    
        private EditText mContent;
        private Button mBtnVoice;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
    
        }
    
        /**
         * 初始化视图
         */
        private void initView(){
            mContent = findViewById(R.id.et_content);
            mBtnVoice =findViewById(R.id.btn_voice);
            mBtnVoice.setOnClickListener(this);
            //调用父类方法
            initIatData(mContent);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_voice:
                    requestPower();
                    break;
            }
    public void requestPower(){
            //判断是否已经赋予权限
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED){
    //            //如果应用之前请求过此权限,但是用户拒绝了请求,此方法放回true
    //            if (ActivityCompat.shouldShowRequestPermissionRationale(this,
    //                    Manifest.permission.RECORD_AUDIO)){
    //                //写对话框,为什么申请权限,并在对话框的确认键后续再次申请权限
    //                Toast.makeText(this, "申请权限", Toast.LENGTH_SHORT).show();
    //            }else {
                    //申请权限,字符串数组内是一个或多个要申请的权限,
                    // 1是申请权限结果的返回参数,在onRequestPermissionsResult可以得知申请结果
                    ActivityCompat.requestPermissions(this,
                            new String[]{Manifest.permission.RECORD_AUDIO,}, 1);
    //            }
            }else {
                clickMethod();
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode ==1){
                for (int i = 0; i < permissions.length; i++) {
                    if (grantResults[i]==PERMISSION_GRANTED) {
                        clickMethod();
                    }else {
                        Toast.makeText(this, "权限"+permissions[i]+"申请失败", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        }
     }
    
    

    相关文章

      网友评论

          本文标题:Android讯飞语音听写

          本文链接:https://www.haomeiwen.com/subject/xnohtqtx.html