步骤1:在科大讯飞开发者平台官网注册账号,并创建应用

步骤2:选中在线语音合成和语音听写,点击sdk下载


步骤3:解压下载包,将下载的sdk里的jar包资源等对应导入Android Studio中


      你需要在Android Studio中手动创建一个jniLibs文件夹       ;复制assets文件夹到项目中

                                                    

步骤5:代码部分

        1、权限

<!--连接网络权限,用于执行云端语音能力 -->
<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"/>

   2、功能代码

 //新闻文本
    private  String mNewsText ="";

    private Gson mGson;
    private EditText et_tet;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_tet= (EditText) findViewById(R.id.et_tet);
        SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID +"=5b0f6b12");
        mGson = new Gson();
    }
    public void onRecognise(View view) {
        //⑧申请录制音频的动态权限
        if(ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO)
                != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this,new String[]{
                    android.Manifest.permission.RECORD_AUDIO},1);
        }else {
//            startRecord();
            RecognizerDialog mDialog = new RecognizerDialog(this, null);
            //2.设置accent、 language等参数
            mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//简体中文:zh_cn(默认);美式英文:en_us:poi;音乐:music
            mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//方言普通话:mandarin(默认);粤 语:cantonese四川话:lmz;河南话:henanese
            mDialog.setParameter(SpeechConstant.ASR_AUDIO_PATH, "./tts_test.pcm");    //识别完成后在本地保存一个音频文件
            //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解
            //结果
            // mDialog.setParameter("asr_sch", "1");
            // mDialog.setParameter("nlp_version", "2.0");
            //3.设置回调接口
            mDialog.setListener(mRecognizerDialogListener);
            //4.显示dialog,接收语音输入
            mDialog.show();
        }
        //1.创建RecognizerDialog对象

    }

    private RecognizerDialogListener mRecognizerDialogListener =  new RecognizerDialogListener() {

        /**
         *
         * @param recognizerResult 语音识别结果
         * @param b true表示是标点符号
         */
        @Override
        public void onResult(RecognizerResult recognizerResult, boolean b) {
            // Toast.makeText(MainActivity.this, recognizerResult.getResultString(), Toast.LENGTH_LONG).show();
            if (b) {
                return;
            }
            ResultBean resultBean = mGson.fromJson(recognizerResult.getResultString(), ResultBean.class);
            List<ResultBean.WsBean> ws = resultBean.getWs();
            String w = "";
            for (int i = 0; i < ws.size(); i++) {
                List<ResultBean.WsBean.CwBean> cw = ws.get(i).getCw();
                for (int j = 0; j < cw.size(); j++) {
                    w += cw.get(j).getW();
                }
            }
            et_tet.setText(w);
//            Toast.makeText(MainActivity.this, w, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(SpeechError speechError) {

        }
    };

    public void onSynthesize(View view) {
        //1.创建 SpeechSynthesizer 对象, 第二个参数: 本地合成时传 InitListener
        mNewsText=et_tet.getText().toString();
        SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(MainActivity.this, null);
        //2.合成参数设置,详见《 MSC Reference Manual》 SpeechSynthesizer 类
        //设置发音人(更多在线发音人,用户可参见 附录13.2
        mTts.setParameter(SpeechConstant.VOICE_NAME, "vixk"); //设置发音人
        mTts.setParameter(SpeechConstant.SPEED, "40");//设置语速
        mTts.setParameter(SpeechConstant.VOLUME, "80");//设置音量,范围 0~100
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //设置云端
        //设置合成音频保存位置(可自定义保存位置),保存在“./sdcard/iflytek.pcm”
        //保存在 SD 卡需要在 AndroidManifest.xml 添加写 SD 卡权限
        //仅支持保存为 pcm 和 wav 格式, 如果不需要保存合成音频,注释该行代码
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
        //3.开始合成
        mTts.startSpeaking(mNewsText, null);
    }
    /**
     * ⑨重写onRequestPermissionsResult方法
     * 获取动态权限请求的结果,再开启录制音频
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if(requestCode==1&&grantResults[0]== PackageManager.PERMISSION_GRANTED){
            RecognizerDialog mDialog = new RecognizerDialog(this, null);
            //2.设置accent、 language等参数
            mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
            //若要将UI控件用于语义理解,必须添加以下参数设置,设置之后onResult回调返回将是语义理解
            //结果
            // mDialog.setParameter("asr_sch", "1");
            // mDialog.setParameter("nlp_version", "2.0");
            //3.设置回调接口
            mDialog.setListener(mRecognizerDialogListener);
            //4.显示dialog,接收语音输入
            mDialog.show();
        }else {
            Toast.makeText(this,"用户拒绝了权限",Toast.LENGTH_SHORT).show();
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
 
ResultBean 

public class ResultBean {
    public static final String TAG = "ResultBean";


    /**
     * sn : 1
     * ls : true
     * bg : 0
     * ed : 0
     * ws : [{"bg":0,"cw":[{"w":"今天","sc":0}]},{"bg":0,"cw":[{"w":"的","sc":0}]},{"bg":0,"cw":[{"w":"天气","sc":0}]},{"bg":0,"cw":[{"w":"怎么样","sc":0}]},{"bg":0,"cw":[{"w":"。 ","sc":0}]}]
     */

    private int sn;
    private boolean ls;
    private int bg;
    private int ed;
    /**
     * bg : 0
     * cw : [{"w":"今天","sc":0}]
     */

    private List<WsBean> ws;

    public int getSn() {
        return sn;
    }

    public void setSn(int sn) {
        this.sn = sn;
    }

    public boolean isLs() {
        return ls;
    }

    public void setLs(boolean ls) {
        this.ls = ls;
    }

    public int getBg() {
        return bg;
    }

    public void setBg(int bg) {
        this.bg = bg;
    }

    public int getEd() {
        return ed;
    }

    public void setEd(int ed) {
        this.ed = ed;
    }

    public List<WsBean> getWs() {
        return ws;
    }

    public void setWs(List<WsBean> ws) {
        this.ws = ws;
    }

    public static class WsBean {
        private int bg;
        /**
         * w : 今天
         * sc : 0
         */

        private List<CwBean> cw;

        public int getBg() {
            return bg;
        }

        public void setBg(int bg) {
            this.bg = bg;
        }

        public List<CwBean> getCw() {
            return cw;
        }

        public void setCw(List<CwBean> cw) {
            this.cw = cw;
        }

        public static class CwBean {
            private String w;
            private int sc;

            public String getW() {
                return w;
            }

            public void setW(String w) {
                this.w = w;
            }

            public int getSc() {
                return sc;
            }

            public void setSc(int sc) {
                this.sc = sc;
            }
        }
    }
RecognizerDialog报空指针

下面的两句话不添加(看了一个博客说空指针问题是少加这个,就没在意这两句话,最后发现去掉这两句话好了

/*  ndk {
      //选择要添加的对应cpu类型的.so库。
      abiFilters 'x86', 'armeabi', 'armeabi-v7a', 'armeabi-v8a'
  }*/


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐