讯飞语音识别

来源:互联网 发布:陕西大数据集团笔试题 编辑:程序博客网 时间:2024/04/27 14:18

1.到http://www.xfyun.cn/?token=838b6419-6f9c-4644-a636-56785e709db8&account_id=3588587452   讯飞官网注册然后创建应用

得到appid






2.下载第一个语音识别的SDK    然后解压





3.解压出来之后把assets和libs里面的都复制到你的项目中






4.然后在导入一个json解析类到时候得到字符串用到解析        链接:https://pan.baidu.com/s/1geDouS7 密码:tlbf


 




5.当然还要在清单文件里面配置一哈           添加权限

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




6.在项目的build.gradle里面配置

sourceSets{        main{            jniLibs.srcDirs=['libs']        }    }





7.然后在主函数里面写代码

import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;import com.iflytek.cloud.ErrorCode;import com.iflytek.cloud.InitListener;import com.iflytek.cloud.RecognizerResult;import com.iflytek.cloud.SpeechConstant;import com.iflytek.cloud.SpeechError;import com.iflytek.cloud.SpeechRecognizer;import com.iflytek.cloud.SpeechUtility;import com.iflytek.cloud.ui.RecognizerDialog;import com.iflytek.cloud.ui.RecognizerDialogListener;import org.json.JSONException;import org.json.JSONObject;import java.util.HashMap;import java.util.LinkedHashMap;public class MainActivity extends AppCompatActivity {     private TextView tv1;     private SpeechRecognizer speechRecognizer;     private RecognizerDialog recognizerDialog;     private HashMap<String, String> hashMap= new LinkedHashMap<String, String>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv1=findViewById(R.id.tv1);       // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn        // 请勿在“=”与appid之间添加任何空字符或者转义符        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=这里写你的APPID   等于号别删除");        // 初始化识别对象        speechRecognizer = SpeechRecognizer.createRecognizer(this,ini);         //创建语言识别对话框        recognizerDialog = new RecognizerDialog(this, ini);        // 缓存       getSharedPreferences(getPackageName(),MODE_PRIVATE);    }      private InitListener ini=new InitListener(){        @Override        public void onInit(int i) {            if(i!= ErrorCode.SUCCESS){                Toast.makeText(MainActivity.this, "初始化失败", Toast.LENGTH_SHORT).show();            }        }    };    public void cc(View view){        switch (view.getId()) {            case R.id.but1:                // 清空参数                speechRecognizer.setParameter(SpeechConstant.PARAMS, null);                // 设置听写引擎,在线引擎.                speechRecognizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);                // 设置返回结果格式                speechRecognizer.setParameter(SpeechConstant.RESULT_TYPE, "json");                // 设置语言                speechRecognizer.setParameter(SpeechConstant.LANGUAGE, "zh_cn");                // 设置语言区域                speechRecognizer.setParameter(SpeechConstant.ACCENT, "mandarin");                // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理                speechRecognizer.setParameter(SpeechConstant.VAD_BOS, "4000");                // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音                speechRecognizer.setParameter(SpeechConstant.VAD_EOS, "1000");                // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点                speechRecognizer.setParameter(SpeechConstant.ASR_PTT,  "1");//                //设置云端识别使用的语法id//                String grammarId = mSharedPreferences.getString("grammar_abnf_id", null);//                speechRecognizer.setParameter(SpeechConstant.CLOUD_GRAMMAR, grammarId);                // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限                // 注:AUDIO_FORMAT参数语记需要更新版本才能生效                speechRecognizer.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");                speechRecognizer.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/asr.wav");                tv1.setText("");                recognizerDialog.setListener(new RecognizerDialogListener() {                    //识别成功的时候回调                    @Override                    public void onResult(RecognizerResult recognizerResult, boolean b) {                         printResult(recognizerResult);                    }                    //识别错误的时候回调                    @Override                    public void onError(SpeechError speechError) {                        Toast.makeText(MainActivity.this, "识别失败", Toast.LENGTH_SHORT).show();                    }                });                recognizerDialog.show();//这个别忘记了     不然录音对话框出不来//                 //识别监听器//                speechRecognizer.startListening(new RecognizerListener() {//                    @Override//                    public void onVolumeChanged(int i, byte[] bytes) {//                        Toast.makeText(MainActivity.this, "正在说话中,音量大小:"+i, Toast.LENGTH_SHORT).show();//                    }////                    @Override//                    public void onBeginOfSpeech() {//                        Toast.makeText(MainActivity.this, "开始说话", Toast.LENGTH_SHORT).show();////                    }////                    @Override//                    public void onEndOfSpeech() {//                        Toast.makeText(MainActivity.this, "说话结束", Toast.LENGTH_SHORT).show();//                    }////                    @Override//                    public void onResult(RecognizerResult recognizerResult, boolean b) {////                    }////                    @Override//                    public void onError(SpeechError speechError) {////                    }////                    @Override//                    public void onEvent(int i, int i1, int i2, Bundle bundle) {////                    }//                });                break;            case R.id.but2:                break;        }    }    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();        }        hashMap.put(sn, text);        StringBuffer resultBuffer = new StringBuffer();        for (String key : hashMap.keySet()) {            resultBuffer.append(mIatResults.get(key));        }        tv1.setText(resultBuffer.toString());    }}





8.主布局

<LinearLayout    android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="comqq.example.hasee.myapplication.MainActivity">    <TextView        android:id="@+id/tv1"        android:layout_width="match_parent"        android:layout_height="400dp" />    <Button        android:id="@+id/but1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="cc"/>    <Button        android:id="@+id/but2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="cc"/></LinearLayout>




9.要是还想在写文字转语言的话    只要在第二个buttton点击事件里面写下面代码

case R.id.but2:                //实例化文字转语言对象                SpeechSynthesizer syn = SpeechSynthesizer.createSynthesizer(this, ini);                // 清空参数                syn.setParameter(SpeechConstant.PARAMS,null);                // 根据合成引擎设置相应参数                if(SpeechConstant.TYPE_CLOUD.equals(SpeechConstant.TYPE_CLOUD)){                    syn.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);                    //设置合成语速                    syn.setParameter(SpeechConstant.SPEED, "50");                    //设置合成音调                    syn.setParameter(SpeechConstant.PITCH, "50");                    //设置合成音量                    syn.setParameter(SpeechConstant.VOLUME, "50");                }else {                    syn.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);                    // 设置本地合成发音人 voicer为空,默认通过语记界面指定发音人。                    syn.setParameter(SpeechConstant.VOICE_NAME, "");                    /**                     * TODO 本地合成不设置语速、音调、音量,默认使用语记设置                     * 开发者如需自定义参数,请参考在线合成参数设置                     */                }                //设置播放器音频流类型                syn.setParameter(SpeechConstant.STREAM_TYPE, "3");                // 设置播放合成音频打断音乐播放,默认为true                syn.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");                // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限                // 注:AUDIO_FORMAT参数语记需要更新版本才能生效                syn.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");                syn.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");                //这个就是获取到tv1控件上面的文字然后转成语言                syn.startSpeaking(tv1.getText().toString(), new SynthesizerListener() {                    @Override                    public void onSpeakBegin() {                    }                    @Override                    public void onBufferProgress(int i, int i1, int i2, String s) {                    }                    @Override                    public void onSpeakPaused() {                    }                    @Override                    public void onSpeakResumed() {                    }                    @Override                    public void onSpeakProgress(int i, int i1, int i2) {                    }                    @Override                    public void onCompleted(SpeechError speechError) {                    }                    @Override                    public void onEvent(int i, int i1, int i2, Bundle bundle) {                    }                });                break;







原创粉丝点击