1.首先在讯飞开放平台注册账号
http://www.xfyun.cn/?ch=bdtg
2.在控制台添加应用 获得APPID
在项目build.gradle文件的android{}内,配置下面一段代码,同步一下gradle文件
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
在项目build.gradle文件的android{}内,配置下面一段代码,同步一下gradle文件
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
权限
<!--连接网络权限,用于执行云端语音能力 --> <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.CAMERA" />public class App extends Application { @Override public void onCreate() { super.onCreate(); // 将“12345678”替换成您申请的APPID,申请地址:http://open.voicecloud.cn SpeechUtility.createUtility(this, SpeechConstant.APPID +"=59f853e3"); } }public class MainActivity extends AppCompatActivity { //全局变量 private StringBuilder mStringBuilder; private EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //找控件 edit = (EditText) findViewById(R.id.edit); } //语音听写 public void discern(View view){ btnVoice(); } //TODO 开始说话: private void btnVoice() { RecognizerDialog dialog = new RecognizerDialog(this,null); dialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); dialog.setParameter(SpeechConstant.ACCENT, "mandarin"); dialog.setListener(new RecognizerDialogListener() { @Override public void onResult(RecognizerResult recognizerResult, boolean b) { printResult(recognizerResult); } @Override public void onError(SpeechError speechError) { } }); dialog.show(); Toast.makeText(this, "请开始说话", Toast.LENGTH_SHORT).show(); } //回调结果: private void printResult(RecognizerResult results) { String text = parseIatResult(results.getResultString()); // 自动填写地址 edit.append(text); } public static String parseIatResult(String json) { StringBuffer ret = new StringBuffer(); try { JSONTokener tokener = new JSONTokener(json); JSONObject joResult = new JSONObject(tokener); JSONArray words = joResult.getJSONArray("ws"); for (int i = 0; i < words.length(); i++) { // 转写结果词,默认使用第一个结果 JSONArray items = words.getJSONObject(i).getJSONArray("cw"); JSONObject obj = items.getJSONObject(0); ret.append(obj.getString("w")); } } catch (Exception e) { e.printStackTrace(); } return ret.toString(); } //语音合成 public void compound(View view){ String s = edit.getText().toString(); show(s); } public void show(String result) { //1.创建 SpeechSynthesizer 对象, 第二个参数:本地合成时传 InitListener SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, null); //2.合成参数设置,详见《MSC Reference Manual》SpeechSynthesizer 类 // 设置发音人(更多在线发音人,用户可参见 附录13.2 mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); //设置发音人 mTts.setParameter(SpeechConstant.SPEED, "50");//设置语速 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.开始合成,第一个参数就是转换成声音的文字,自定义,第二个参数就是合成监听器对象,我们不需要对声音有什么特殊处理,就传null mTts.startSpeaking(result, null); } private String parseData(String resultString) { //创建gson对象.记得要关联一下gson.jar包,方可以使用 Gson gson = new Gson(); //参数1 String类型的json数据 参数2.存放json数据对应的bean类 XFBean xfBean = gson.fromJson(resultString,XFBean.class); //创建集合,用来存放bean类里的对象 ArrayList<XFBean.WS> ws = xfBean.ws; //创建一个容器,用来存放从每个集合里拿到的数据,使用StringBUndle效率高 StringBuilder stringBuilder = new StringBuilder(); for (XFBean.WS w : ws) { String text = w.cw.get(0).w; stringBuilder.append(text); } //把容器内的数据转换为字符串返回出去 return stringBuilder.toString(); } }public class XFBean { public ArrayList<WS> ws; public class WS{ public ArrayList<CW> cw; } public class CW{ public String w; } }<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="discern" android:text="语音识别"/> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="compound" android:text="语音合成"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edit"/>