Android 学习——语音识别

    xiaoxiao2022-06-28  231

    语音识别

    科大讯飞开放平台

    官网:http://www.xfyun.cn/

    开发文档:https://doc.xfyun.cn/msc_android/index.html

    创建应用

    下载SDK,选择需要的功能

    导入SDK

    添加权限

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

    初始化

    // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn // 请勿在“=”与appid之间添加任何空字符或者转义符 SpeechUtility.createUtility(context, SpeechConstant.APPID +"=12345678");

    语音听写

    package com.example.yuyin; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import com.iflytek.cloud.RecognizerListener; 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 org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.LinkedHashMap; public class MainActivity extends AppCompatActivity { private TextView tv_content; private HashMap<String,String> nIatResults=new LinkedHashMap<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn // 请勿在“=”与appid之间添加任何空字符或者转义符 SpeechUtility.createUtility(this, SpeechConstant.APPID +"=5ce4a75c"); tv_content=findViewById(R.id.info); } //语音听写 public void startSpeachClick(View view){ //初始化识别无UI识别对象 //使用SpeechRecognizer对象,可根据回调消息自定义界面; SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null); //设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。 mIat.setParameter( SpeechConstant.DOMAIN, "iat" );//应用领域 //设置语音输入语言,zh_cn为简体中文 mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); //设置结果返回语言,普通话 mIat.setParameter(SpeechConstant.ACCENT, "mandarin"); mIat.setParameter(SpeechConstant.ENGINE_TYPE,SpeechConstant.TYPE_CLOUD); //设置返回结果格式 mIat.setParameter(SpeechConstant.RESULT_TYPE,"json"); //设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理 //取值范围{1000~10000} mIat.setParameter(SpeechConstant.VAD_BOS, "4000"); //设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入, //自动停止录音,范围{0~10000} mIat.setParameter(SpeechConstant.VAD_EOS, "1000"); //设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 mIat.setParameter(SpeechConstant.ASR_PTT,"1"); //设置听写的动态修正 mIat.setParameter(SpeechConstant.ASR_DWA,"0"); //开始识别,并设置监听器 mIat.startListening(mRecogListener); } private RecognizerListener mRecogListener = new RecognizerListener() { //0-30音量调节 @Override public void onVolumeChanged(int i, byte[] bytes) { } //开始录音 @Override public void onBeginOfSpeech() { } //停止录音 @Override public void onEndOfSpeech(){ } @Override public void onError(SpeechError speechError) { } //返回结果 @Override public void onResult(RecognizerResult recognizerResult, boolean b) { Log.i("tag",recognizerResult.getResultString()); printResult(recognizerResult); } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { } }; private void printResult(RecognizerResult results){ String text=JsonParser.parseGrammarResult(results.getResultString()); String sn=null; //读取json结果中的sn字段 try { JSONObject resultJson=new JSONObject(results.getResultString()); sn=resultJson.optString("sn"); } catch (JSONException e) { e.printStackTrace(); } nIatResults.put(sn,text); StringBuffer resultBuffer=new StringBuffer(); for (String key:nIatResults.keySet()){ resultBuffer.append(nIatResults.get(key)); } tv_content.setText(resultBuffer.toString()); } }

    语音合成

    package com.example.yuyin; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechSynthesizer; import com.iflytek.cloud.SpeechUtility; import com.iflytek.cloud.SynthesizerListener; public class Main2Activity extends AppCompatActivity { private EditText editText_content; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); SpeechUtility.createUtility(this, SpeechConstant.APPID +"=5ce4a75c"); editText_content=findViewById(R.id.wenzi); } public void startClick(View view){ //创建SpeechSynthesizer SpeechSynthesizer mTts=SpeechSynthesizer.createSynthesizer(this,null); //合成参数 mTts.setParameter(SpeechConstant.VOICE_NAME,"xiaoyan"); mTts.setParameter(SpeechConstant.SPEED,"50");//语速 mTts.setParameter( SpeechConstant.VOLUME, "80");//音量 mTts.setParameter( SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD ); //保存路径 // mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflutek.pcm"); //合成 String content=editText_content.getText().toString(); mTts.startSpeaking(content,mSynListener); } //合成监听器 private SynthesizerListener mSynListener=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) { } }; }

     


    最新回复(0)