现在很多应用中都加入了语音功能,通常情况下我们都是接入第三方的API进行实现,用的比较多的主要就是科大讯飞和百度的语音。
具体的注册,申请为开发者,我就不多说了。
创建一个新的应用
控制台->创建新应用 创建成功后,点击我的应用->开通更多服务->选择我们要开通的服务,这里作为测试我只开通了语音听写和在线语音合成和在线命令词识别

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_科大讯飞语音

科大讯飞提供的功能类别如下:

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_Android 讯飞语音 语音播报_02

SDK的下载(具体操作很简单,不再赘述):

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_科大讯飞api_03

下载成功后,上面有pdf的文档教程或者简介以及一些实例代码和lib。具体我就不多说了,不过上面的教程还是基于eclipse平台下的,当然这不是问题。
具体使用步骤如下:

  1. 将开发工具包中libs目录下的Msc.jar和armeabi复制到Android工程的libs目录(如果工程无libs目录,请自行创建)中;选中对应的jar包右键As a library。
    目录结构:

build.gradle(Module:app)的依赖如下所示:

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_android_04

2.加入权限

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

如需在打包或者生成APK的时候进行混淆,请在proguard.cfg中添加如下代码
-keep class com.iflytek.*{;}

3.初始化工作:
在Application或者Activity的onCreate方法中初始化:
SpeechUtility.createUtility(context, SpeechConstant.APPID +”=12345678”);

4.语音听写的加入(将语音识别为文字)

//1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener    
    SpeechRecognizer mIat= SpeechRecognizer.createRecognizer(context, null);    
    //2.设置听写参数,详见《科大讯飞MSC API手册(Android)》SpeechConstant类    
    mIat.setParameter(SpeechConstant.DOMAIN, "iat");    
    mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");    
    mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");    
    //3.开始听写   mIat.startListening(mRecoListener);    
    //听写监听器    
    private RecognizerListener mRecoListener = new RecognizerListener(){    
    //听写结果回调接口(返回Json格式结果,用户可参见附录12.1);    
    //一般情况下会通过onResults接口多次返回结果,完整的识别内容是多次结果的累加;    
    //关于解析Json的代码可参见MscDemo中JsonParser类;    
    //isLast等于true时会话结束。    
    public void onResult(RecognizerResult results, boolean isLast) {    
                Log.d("Result:",results.getResultString ());}    
    //会话发生错误回调接口    
        public void onError(SpeechError error) {    
    error.getPlainDescription(true) //获取错误码描述}    
        //开始录音    
        public void onBeginOfSpeech() {}    
        //音量值0~30    
        public void onVolumeChanged(int volume){}    
        //结束录音    
        public void onEndOfSpeech() {}    
        //扩展用接口    
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {}    
    };

5. 默认交互动画的加入
将SDK资源包assets路径下的资源文件拷贝至Android工程asstes目录下
//1.创建SpeechRecognizer对象,第二个参数:本地听写时传InitListener
RecognizerDialog iatDialog = new RecognizerDialog(this,mInitListener);
//2.设置听写参数,同上节
//3.设置回调接口
iatDialog.setListener(recognizerDialogListener);
//4.开始听写
iatDialog.show();
6.语音合成功能的加入

//1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
        SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, null);
        //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
        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卡权限
        //如果不需要保存合成音频,注释该行代码
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
        //3.开始合成
        mTts.startSpeaking(mSynthesizerListener);

上面是基本的流程及代码。

需要注意的是,你在androidStudio中接入时,可能会出现错误码21001(组建未安装…)

主要原因是jni没有正确的导入,AndroidStudio需要在build.gradle(Module:app)中加入如下代码:

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_科大讯飞api_05

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

下面是实例代码的具体实现

  • gson导入

首先按照上面1、2步骤准备好准备工作,由于代码中需要对json数据进行解析,引出需要导入Gson的依赖

File->Project Structure->app->Dependencies->library dependency

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_android语音_06

找到gson后Ok,AS便会自动导入对应的依赖。

  • 初始化工作

在Application中做好初始化工作如下代码:

public class MyApplication extends Application {
    private final String APPID = "5******0";
    @Override
    public void onCreate() {
        super.onCreate();
        //讯飞语音初始化工作
        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=" + APPID);
    }
}

别忘了在配置文件中如下的配置

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_科大讯飞语音_07

  • 测试用例的布局文件
?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.administrator.iflytek.MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showDialogStyle0"
        android:text="启动语音对话框(自帶)" />
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showDialogStyle1"
        android:text="启动语音功能(自己)" />
    <TextView
        android:id="@+id/speechContent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="语音识别结果:"
        android:textSize="18sp"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="播放下面語音"
        android:onClick="startSpeech"/>
    <EditText
        android:id="@+id/speechText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="你好,我是科大讯飞语音。Hello world!"/>
</LinearLayout>
  • 资源文件的导入
    由于使用到讯飞自带的对话框,因此需要导入讯飞提供的资源文件:
    创建资源文件夹,然后将对于的资源粘贴进去,即可

其目录结构如下:

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_科大讯飞语音_08

  • 主要测试代码的编写
public class MainActivity extends AppCompatActivity {

    private String TAG = "SpeechIflytek";
    private SpeechRecognizer mlat;
    private TextView tvContent;
    private StringBuilder sb = new StringBuilder();
    private EditText etText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvContent = (TextView)findViewById(R.id.speechContent);
        etText = (EditText)findViewById(R.id.speechText);
        //initSpeechRecognizer();

    }

    private void initSpeechRecognizer() {
        sb.delete(0,sb.length());
        mlat = SpeechRecognizer.createRecognizer(this, new InitListener() {
            @Override
            public void onInit(int code) {
                Log.d(TAG, "SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    System.out.println("初始化失败,错误码:" + code);
                }
            }
        });
        mlat.setParameter(SpeechConstant.DOMAIN, "iat");
        mlat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        mlat.setParameter(SpeechConstant.ACCENT, "mandarin");
        mlat.startListening(new RecognizerListener() {
            @Override
            public void onVolumeChanged(int i, byte[] bytes) {

            }

            @Override
            public void onBeginOfSpeech() {

            }

            @Override
            public void onEndOfSpeech() {

            }

            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                String content = recognizerResult.getResultString();
                System.out.println(content);
                Gson g = new Gson();
                RecognizerData data =  g.fromJson(content,RecognizerData.class);
                RecognizerData.Words words[] = data.getWs();
                for(RecognizerData.Words ws:words){
                    for(RecognizerData.Word word:ws.getCw()){
                        sb.append(word.getW());
                    }
                }
                tvContent.setText("语音识别结果(style1):"+sb.toString());
            }

            @Override
            public void onError(SpeechError speechError) {
                System.out.println(speechError.getErrorCode());
            }

            @Override
            public void onEvent(int i, int i1, int i2, Bundle bundle) {

            }
        });

    }
//利用科大讯飞自带界面
    private void initDialog() {
        sb.delete(0,sb.length());
        RecognizerDialog mDialog = new RecognizerDialog(this, new InitListener() {
            @Override
            public void onInit(int code) {
                Log.d(TAG, "SpeechRecognizer init() code = " + code);
                if (code != ErrorCode.SUCCESS) {
                    System.out.println("初始化失败,错误码:" + code);
                }
            }
        });
        mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
        mDialog.setListener(new RecognizerDialogListener() {
            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                String content = recognizerResult.getResultString();
                System.out.println(content);
                Gson g = new Gson();
                RecognizerData data =  g.fromJson(content,RecognizerData.class);
                RecognizerData.Words words[] = data.getWs();
                for(RecognizerData.Words ws:words){
                    for(RecognizerData.Word word:ws.getCw()){
                        sb.append(word.getW());
                    }
                }
                tvContent.setText("语音识别结果(style0):"+sb.toString());
            }

            @Override
            public void onError(SpeechError speechError) {

            }
        });
        mDialog.show();
    }

    public void showDialogStyle0(View view) {
        //initSpeechRecognizer();
        initDialog();
    }
    public void showDialogStyle1(View view) {
        tvContent.setText("请说话");
        initSpeechRecognizer();
        //initDialog();
    }
    /***********语音合成*************/
    public void initSpeechSynthesizer(String speechText) {
        //1.创建SpeechSynthesizer对象, 第二个参数:本地合成时传InitListener
        SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer(this, null);
        //2.合成参数设置,详见《科大讯飞MSC API手册(Android)》SpeechSynthesizer 类
        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卡权限
        //如果不需要保存合成音频,注释该行代码
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
        //3.开始合成
        mTts.startSpeaking(""+speechText, new com.iflytek.cloud.SynthesizerListener() {

            //开始播放
            @Override
            public void onSpeakBegin() {

            }

            //缓冲进度回调
            //percent为缓冲进度0~100,beginPos为缓冲音频在文本中开始位置,endPos表示缓冲音频在文本中结束位置,info为附加信息。
            @Override
            public void onBufferProgress(int i, int i1, int i2, String s) {
            }

            //暂停播放
            @Override
            public void onSpeakPaused() {
            }

            //恢复播放回调接口
            @Override
            public void onSpeakResumed() {
            }

            //播放进度回调
            //percent为播放进度0~100,beginPos为播放音频在文本中开始位置,endPos表示播放音频在文本中结束位置.
            @Override
            public void onSpeakProgress(int i, int i1, int i2) {
            }

            //会话结束回调接口,没有错误时,error为null
            @Override
            public void onCompleted(SpeechError speechError) {
            }

            //会话事件回调接口
            @Override
            public void onEvent(int i, int i1, int i2, Bundle bundle) {
            }
        });
    }
    public void startSpeech(View view){
      initSpeechSynthesizer(""+etText.getText().toString());
    }
}

上面代码基本实现了科大讯飞的语音识别模块(自动对话框和非对话框)和语音合成模块的测试。

动手试试吧。我用的是androidstudio2.2.2 测试成功。

运行效果图:

Android 讯飞语音 语音播报 讯飞语音助手怎么开启_Android 讯飞语音 语音播报_09

ok,希望上面的内容对您有所帮助。