Android开发基于科大讯飞实现语音识别

简介

通过使用科大讯飞的API开发Android APP实现语音识别

下载相应SDK

访问https://www.xfyun.cn/?jump=login进行注册,然后创建一个应用并进行相应SDK下载
Android开发基于科大讯飞实现语音识别_第1张图片

添加相应的包

打开刚刚下载的SDK,找到libs,将两个jar包复制到Android工程里
Android开发基于科大讯飞实现语音识别_第2张图片
Android开发基于科大讯飞实现语音识别_第3张图片
右键libs进行添加
Android开发基于科大讯飞实现语音识别_第4张图片
在main下创建jinLibs
Android开发基于科大讯飞实现语音识别_第5张图片Android开发基于科大讯飞实现语音识别_第6张图片

将刚刚下载的SDK包libs里剩下的复制进去
Android开发基于科大讯飞实现语音识别_第7张图片Android开发基于科大讯飞实现语音识别_第8张图片
OK,环境配置完成,现在就可以开始写代码了

参考代码

实现通过按下一个按钮,进行语音输入,然后将语音转换成文本显示在TextView里

在AndroidManifest.xml添加相应权限

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

初始化

初始化即创建语音配置对象,只有初始化后才可以使用MSC的各项服务。建议将初始化放在程序入口处(如Application、Activity的onCreate方法),初始化代码如下:

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

Android开发基于科大讯飞实现语音识别_第9张图片将代码放在主Activity的 protected void onCreate(Bundle savedInstanceState)

主Activity代码

public class MainActivity extends AppCompatActivity {

    private TextView tv_content;
    
    // 用HashMap存储听写结果
    private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tv_content = (TextView) findViewById(R.id.textView_content);
        
        SpeechUtility.createUtility(this, SpeechConstant.APPID +"=111111");
    }

    public void startSpeechClick(View view) {
        //初始化识别无UI识别对象
        //使用SpeechRecognizer对象,可根据回调消息自定义界面;
        SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null);
        //设置参数
        mIat.setParameter(SpeechConstant.PARAMS, "iat");      //应用领域
        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");//返回结果格式
        // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
        // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
        mIat.setParameter(SpeechConstant.VAD_EOS,"1000");
        // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
        mIat.setParameter(SpeechConstant.ASR_PTT, "0");

        // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
       // mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
        //mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");

        //开始听写
        mIat.startListening(mRecoListener);
    }

        private RecognizerListener mRecoListener= new RecognizerListener() {

            //音量0-30
            @Override
            public void onVolumeChanged(int i, byte[] bytes) {

            }

            //开始录音
            @Override
            public void onBeginOfSpeech() {

            }

            //结束录音
            @Override
            public void onEndOfSpeech() {

            }

            //返回结果
            @Override
            public void onResult(RecognizerResult recognizerResult, boolean b) {
                System.out.println(recognizerResult.getResultString());
                printResult(recognizerResult);
            }

            @Override
            public void onError(SpeechError speechError) {

            }

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

            }
        };

    //输出结果
    private void printResult(RecognizerResult results) {
        String text = JsonParser.parseIatResult(results.getResultString());

        String sn = null;
        // 读取json结果中的sn字段
        try {
            JSONObject resultJson = new JSONObject(results.getResultString());
            sn = resultJson.optString("sn");
        } catch (JSONException e) {
            e.printStackTrace();
        }

        mIatResults.put(sn, text);

        StringBuffer resultBuffer = new StringBuffer();
        for (String key : mIatResults.keySet()) {
            resultBuffer.append(mIatResults.get(key));
        }

        
        tv_content.setText(resultBuffer.toString());
       
    }
}

添加json进行解析

将刚刚下载的SDK里的JsonParser.java添加到java里
Android开发基于科大讯飞实现语音识别_第10张图片
Android开发基于科大讯飞实现语音识别_第11张图片

activity_main.xml参考代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button_input"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="startSpeechClick"
        android:text="@string/button_input"
        android:layout_centerHorizontal="true"
        />

    <TextView
        android:id="@+id/textView_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Text"
        android:layout_below="@id/button_input"
        android:layout_centerHorizontal="true"
        />
</RelativeLayout>

现在可以将代码下载到手机里进行测试了
注: 1.需要用真机 2.需要联网

源码下载

你可能感兴趣的:(Android)