安卓SDK——语音识别

 


语音识别

平台使用

科大讯飞开放平台:https://www.xfyun.cn/

SDK下载:https://www.xfyun.cn/sdk/dispatcher

创建应用

添加AI能力(主要应该就是语音听写)

生成相关SDK,下载解压


集成开发

开发文档:https://doc.xfyun.cn/msc_android/index.html

导入

可以参考:https://doc.xfyun.cn/msc_android/%E9%A2%84%E5%A4%87%E5%B7%A5%E4%BD%9C.html

和以前一样,在src/main下创建jniLibs,并把下载解压后得到的相关so文件复制进去

还有一个jar包,也需要导入libs目录,并add

权限

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

初始化

也和之前一样,专门建一个application,并在配置清单中注册

package com.example.a5_23speech_recognition;

import android.app.Application;

import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechUtility;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
        // 请勿在“=”与appid之间添加任何空字符或者转义符
        //我这里已经换了...
        SpeechUtility.createUtility(this, SpeechConstant.APPID +"=5ce61df0");
    }
}

语音听写

布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="语音输入"
        android:onClick="startSpeechClick"
        app:layout_constraintBottom_toBottomOf="parent"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="No data!"
        android:textSize="55sp"
        android:id="@+id/textView_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

初步完成

代码参考:https://doc.xfyun.cn/msc_android/%E8%AF%AD%E9%9F%B3%E5%90%AC%E5%86%99.html

需要配置NDK

public class MainActivity extends AppCompatActivity {
    private TextView tv_content;
    private HashMap<String, String> nIatResults = new LinkedHashMap<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_content = findViewById(R.id.textView_content);
    }

    public void startSpeechClick(View v) {
        //初始化识别无UI识别对象
        //使用SpeechRecognizer对象,可根据回调消息自定义界面;
        SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null);

        //设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。
        mIat.setParameter(SpeechConstant.DOMAIN, "iat");//应用领域
        //设置语音输入语言,zh_cn为简体中文
        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");
        //设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理
        //取值范围{1000~10000}
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
        //设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入,
        //自动停止录音,范围{0~10000}
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
        //设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
        mIat.setParameter(SpeechConstant.ASR_PTT, "1");
        //设置听写的动态修正
        mIat.setParameter(SpeechConstant.ASR_DWA, "0");

        //开始识别,并设置监听器
        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());
        }

        @Override
        public void onError(SpeechError speechError) {

        }

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

        }
    };

如上代码基本上可以运行了,效果会在控制台输出对应识别的内容

注意,似乎SDK提供的so文件并不全,可能并不支持大部分模拟器,如出现安装失败,建议换真机进行调试

完整

完整实现需要将识别的文本进行解析并显示在textView

需要一个解析器类,可以在Demo里找到

package com.example.a5_23speech_recognition;

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

import android.util.Log;

/**
 * Json结果解析类
 */
public class JsonParser {

	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"));
//				如果需要多候选结果,解析数组其他字段
//				for(int j = 0; j < items.length(); j++)
//				{
//					JSONObject obj = items.getJSONObject(j);
//					ret.append(obj.getString("w"));
//				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return ret.toString();
	}
	
	public static String parseGrammarResult(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");
				for(int j = 0; j < items.length(); j++)
				{
					JSONObject obj = items.getJSONObject(j);
					if(obj.getString("w").contains("nomatch"))
					{
						ret.append("没有匹配结果.");
						return ret.toString();
					}
					ret.append("【结果】" + obj.getString("w"));
					ret.append("【置信度】" + obj.getInt("sc"));
					ret.append("\n");
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			ret.append("没有匹配结果.");
		} 
		return ret.toString();
	}
	
	public static String parseLocalGrammarResult(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");
				for(int j = 0; j < items.length(); j++)
				{
					JSONObject obj = items.getJSONObject(j);
					if(obj.getString("w").contains("nomatch"))
					{
						ret.append("没有匹配结果.");
						return ret.toString();
					}
					ret.append("【结果】" + obj.getString("w"));
					ret.append("\n");
				}
			}
			ret.append("【置信度】" + joResult.optInt("sc"));

		} catch (Exception e) {
			e.printStackTrace();
			ret.append("没有匹配结果.");
		} 
		return ret.toString();
	}

	public static String parseTransResult(String json,String key) {
		StringBuffer ret = new StringBuffer();
		try {
			JSONTokener tokener = new JSONTokener(json);
			JSONObject joResult = new JSONObject(tokener);
			String errorCode = joResult.optString("ret");
			if(!errorCode.equals("0")) {
				return joResult.optString("errmsg");
			}
			JSONObject transResult = joResult.optJSONObject("trans_result");
			ret.append(transResult.optString(key));
			/*JSONArray words = joResult.getJSONArray("results");
			for (int i = 0; i < words.length(); i++) {
				JSONObject obj = words.getJSONObject(i);
				ret.append(obj.getString(key));
			}*/
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret.toString();
	}
}

并修改代码

package com.example.a5_23speech_recognition;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.LinkedHashMap;

public class MainActivity extends AppCompatActivity {
    private TextView tv_content;
    private HashMap<String, String> nIatResults = new LinkedHashMap<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_content = findViewById(R.id.textView_content);
    }

    public void startSpeechClick(View v) {
        //初始化识别无UI识别对象
        //使用SpeechRecognizer对象,可根据回调消息自定义界面;
        SpeechRecognizer mIat = SpeechRecognizer.createRecognizer(this, null);

        //设置语法ID和 SUBJECT 为空,以免因之前有语法调用而设置了此参数;或直接清空所有参数,具体可参考 DEMO 的示例。
        mIat.setParameter(SpeechConstant.DOMAIN, "iat");//应用领域
        //设置语音输入语言,zh_cn为简体中文
        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");
        //设置语音前端点:静音超时时间,单位ms,即用户多长时间不说话则当做超时处理
        //取值范围{1000~10000}
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
        //设置语音后端点:后端点静音检测时间,单位ms,即用户停止说话多长时间内即认为不再输入,
        //自动停止录音,范围{0~10000}
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
        //设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
        mIat.setParameter(SpeechConstant.ASR_PTT, "1");
        //设置听写的动态修正
        mIat.setParameter(SpeechConstant.ASR_DWA, "0");

        //开始识别,并设置监听器
        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.parseGrammarResult(results.getResultString());
        String sn = null;
        //读取json结果中的sn字段
        try {
            JSONObject resultJson = new JSONObject(results.getResultString());
            sn = resultJson.optString("sn");
        } catch (JSONException e) {
            e.printStackTrace();
        }

        nIatResults.put(sn, text);

        StringBuffer resultBuffer = new StringBuffer();
        for (String key : nIatResults.keySet()) {
            resultBuffer.append(nIatResults.get(key));
        }
        tv_content.setText(resultBuffer.toString());
    }

}

测试结果

如果觉得太丑了...或者某些东西没必要

可以对参数进行修改,比如把标点设置不显示,修改解析器,把置信度之类的去掉..

大概这样 语音合成等下补..

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Microsoft Speech SDK11语音识别例子是一种基于微软语音技术的软件开发工具包,它提供了一系列语音识别示例,为开发者在应用程序中快速实现语音识别功能提供了易用、高效的开发方案。 通过使用Microsoft Speech SDK11语音识别例子,开发者可以通过API调用实现语音输入文字的功能,例如,在Microsoft Visual Studio中创建Windows应用程序,通过调用语音识别API实现语音命令控制功能。开发者可以定制识别的语法,指定具体的命令,来实现特定的应用程序功能。 另外,Microsoft Speech SDK11语音识别例子还提供了多语言、多种声音的语音识别支持,并且支持实时录制、识别、翻译和文本转换等功能。它还支持对不同声音和背景噪声的识别,并支持自定义语音识别模型,以提高识别准确率。 此外,Microsoft Speech SDK11语音识别例子还可以支持与其他技术集成,如机器翻译、自然语言处理等,以实现更为复杂的应用程序。 总的来说,Microsoft Speech SDK11语音识别例子提供了快速、便捷实现语音识别功能的解决方案,有助于开发者在应用程序中加入语音交互的功能,提高应用程序的用户体验。 ### 回答2: Microsoft Speech SDK11是一种先进的语音技术,它能够将语音转化为文本,帮助人们更方便地进行电脑操作。 举个例子,如果你正在开发一个语音控制家电设备的应用,那么使用Microsoft Speech SDK11就能够实现语音识别并控制设备的功能。例如,你可以通过对SDK的调用来实现“打开电视”、“调整音量”等听命于口令的指令,从而使家庭控制更加智能便捷。 此外,Microsoft Speech SDK11还可以应用于其他方面,比如语音翻译、文字转语音、语音命令控制等等。例如,你可以通过连通SDK的API接口,实现对应用程序的语音交互和操作。随着科技的发展,像Microsoft Speech SDK11这样的语音技术将会更加普遍地存在于我们和我们的设备之间,在互联网、智能家居、医疗健康等方面发挥更大的作用和贡献。 ### 回答3: Microsoft Speech SDK11是一款由微软公司开发的语音识别软件,其具有高效精准识别的特点,并且支持多个语言的识别功能。 这款软件可以应用于许多领域,例如语音助手、智能家居、语音控制等。下面我们以语音助手为例来简单介绍一下Microsoft Speech SDK11的使用。 语音助手是一款具有语音识别和语音合成功能的应用程序,用户可以通过语音命令让助手完成一些操作。首先,需要添加SDK库文件到我们的项目中,以便使用SDK提供的功能。 接下来,我们需要设置语音输入设备和输出设备,我们可以使用SpeechRecognitionEngine类和SpeechSynthesizer类来完成设备的设置。通过SpeechRecognitionEngine类,我们可以实现对语音输入的监听和处理,而通过SpeechSynthesizer类,就可以实现语音合成的功能。 完成设备设置后,我们就可以开始实现语音识别和语音合成的功能了。比如,当用户说出“打开微信”,语音助手就可以通过语音识别识别用户的指令,并调用微信应用程序打开微信;而当用户说出“今天天气怎么样”,语音助手就可以通过调用天气预报API获取天气信息,并通过语音合成的方式将结果读出。 总的来说,Microsoft Speech SDK11是一款高效精准的语音识别软件,可以应用于许多领域。通过各种实际的操作,我们可以更好地了解SDK的功能和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云无心鸟知还

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值