AS中引入科大讯飞的语音转文字功能

申请

  1. 首先去讯飞开放平台申请一个账号(https://www.xfyun.cn/)
    AS中引入科大讯飞的语音转文字功能_第1张图片
  2. 然后进入控制台,创建应用
    AS中引入科大讯飞的语音转文字功能_第2张图片
  3. 点击侧栏里的 语音识别——>语音听写,可以免费申请(实名认证后使用时间会更长)
    AS中引入科大讯飞的语音转文字功能_第3张图片

下载

  1. SDK选择Android MSC,点击下载
    AS中引入科大讯飞的语音转文字功能_第4张图片
  2. 解压,可以看到目录结构如下
    AS中引入科大讯飞的语音转文字功能_第5张图片
    AS中引入科大讯飞的语音转文字功能_第6张图片

配置

  1. SDK中sample\speechDemo\libs目录下的所有文件及文件夹需要拷贝至项目libs下,其中msc.jar要右键添加Add As Library。
  2. 将assets文件夹拷贝到项目的main目录下
  3. 在项目的main目录下新建一个名为jniLibs的文件夹,将SDK中sample\speechDemo\libs目录下的两个文件夹拷贝jniLibs下
    AS中引入科大讯飞的语音转文字功能_第7张图片

注意!!!
这里有个很奇怪的地方,项目中的libs中必须要包含arm64-v8a和armeabi-v7两个文件夹,也必须创建jniLibs文件夹,但是jniLibs文件夹下的arm64-v8a和armeabi-v7不是必须的。还有就是模拟器上可能运行不了,所以需要安装到手机上

  1. 在项目app目录下的build.gradle中添加以下代码,位置如下:
sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

AS中引入科大讯飞的语音转文字功能_第8张图片
5. 在AndriodManifest.xml中添加以下权限


android:name="android.permission.INTERNET"/>

android:name="android.permission.RECORD_AUDIO"/>

android:name="android.permission.ACCESS_NETWORK_STATE"/>

android:name="android.permission.ACCESS_WIFI_STATE"/>

android:name="android.permission.CHANGE_NETWORK_STATE"/>

android:name="android.permission.READ_PHONE_STATE"/>

android:name="android.permission.READ_CONTACTS"/>

android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

android:name="android.permission.READ_EXTERNAL_STORAGE"/>

android:name="android.permission.ACCESS_FINE_LOCATION"/>

android:name="android.permission.CAMERA" />
  1. 将res\layout下的布局文件拷贝到项目的对应目录下

调用代码

  1. 布局文件activity_main.xml
"1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    
  1. 回调接口和工具类(需要改成自己的appid)
import com.iflytek.cloud.RecognizerResult;

public interface XunFeiCallbackListener {
    void onFinish(RecognizerResult results);
}
import android.content.Context;
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 XunFeiUtil {

    public static String appid = "这里填写自己的appid";

    public static void initXunFei(Context context){
        SpeechUtility.createUtility(context, SpeechConstant.APPID +"="+appid);
    }



    public static void startVoice(Context context, final XunFeiCallbackListener callbackListener) {
        RecognizerDialog dialog = new RecognizerDialog(context,null);
        dialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        dialog.setParameter(SpeechConstant.ACCENT, "mandarin");
        dialog.setParameter(SpeechConstant.ASR_PTT, "0");
        dialog.setListener(new RecognizerDialogListener() {
            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                callbackListener.onFinish(recognizerResult);
            }
            @Override
            public void onError(SpeechError speechError) {
            }
        });
        dialog.show();
        //Toast.makeText(this, "请开始说话", Toast.LENGTH_SHORT).show();
    }
    
    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();
    }
}
  1. MainActivity中的调用
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.iflytek.cloud.RecognizerResult;
import static net.guo.test.XunFeiUtil.parseIatResult;
import static net.guo.test.XunFeiUtil.*;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn_click;
    private EditText mResultText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initXunFei(this);
        btn_click = (Button) findViewById(R.id.btn_click);
        mResultText = ((EditText) findViewById(R.id.result));
        btn_click.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        startVoice(this, new XunFeiCallbackListener() {
            @Override
            public void onFinish(RecognizerResult results) {
                String text = parseIatResult(results.getResultString());
                // 自动填写地址
                mResultText.append(text);
            }
        });
    }

}

详细用法参见文档

运行结果

AS中引入科大讯飞的语音转文字功能_第9张图片
AS中引入科大讯飞的语音转文字功能_第10张图片

AS中引入科大讯飞的语音转文字功能_第11张图片

你可能感兴趣的:(android)