先看效果:
代码实现:
1.先下载sdk,然后进行解压,放到对应的文件夹中,
2.写一个语音工具类:
AudioUtils:
package com.example.administrator.liujie; import android.content.Context; import android.os.Bundle; import android.util.Log; import com.iflytek.cloud.InitListener; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechSynthesizer; import com.iflytek.cloud.SynthesizerListener; /** * Created by Administrator on 2017/12/1. */ public class AudioUtils { private static AudioUtils audioUtils; private SpeechSynthesizer mySynthesizer; private AudioUtils() { } /** * 描述:单例 */ public static AudioUtils getInstance() { if (audioUtils == null) { synchronized (AudioUtils.class) { if (audioUtils == null) { audioUtils = new AudioUtils(); } } } return audioUtils; } private InitListener myInitListener = new InitListener() { @Override public void onInit(int code) { Log.d("mySynthesiezer:", "InitListener init() code = " + code); } }; /** * 描述:初始化语音配置 */ public void init(Context context) { //处理语音合成关键类 mySynthesizer = SpeechSynthesizer.createSynthesizer(context, myInitListener); //设置发音人 mySynthesizer.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); //设置音调 mySynthesizer.setParameter(SpeechConstant.PITCH, "50"); //设置音量 mySynthesizer.setParameter(SpeechConstant.VOLUME, "50"); } /** * 描述:根据传入的文本转换音频并播放 */ public void speakText(final String content) { int code = mySynthesizer.startSpeaking(content, 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) { } }); } }3.MainActivity:
package com.example.administrator.liujie; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import com.iflytek.cloud.RecognizerResult; import com.iflytek.cloud.SpeechConstant; import com.iflytek.cloud.SpeechError; import com.iflytek.cloud.SpeechUtility; import com.iflytek.cloud.ui.RecognizerDialog; import com.iflytek.cloud.ui.RecognizerDialogListener; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONTokener; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button btn_click; private Button btn_open; private EditText mResultText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_click = (Button) findViewById(R.id.btn_click); btn_open = (Button) findViewById(R.id.btn_open); mResultText = ((EditText) findViewById(R.id.result)); SpeechUtility.createUtility(this, SpeechConstant.APPID + "= 5a20e5b4"); btn_click.setOnClickListener(this); btn_open.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_click: btnVoice(); break; case R.id.btn_open: AudioUtils.getInstance().init(MainActivity.this); //初始化语音对象 String s = mResultText.getText().toString(); AudioUtils.getInstance().speakText(s); //播放语音 break; } } //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()); // 自动填写地址 mResultText.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(); } }4.activity_main:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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="com.example.administrator.liujie.MainActivity"> <Button android:id="@+id/btn_click" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="点击打开语音识别" /> <EditText android:id="@+id/result" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/btn_click" android:hint="此处显示你所录下的内容" /> <Button android:id="@+id/btn_open" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/result" android:text="播放语音" /> </RelativeLayout>5.权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <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.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" />6.效果就实现了。本人写了好几次才写对。