文档章节

Android语音识别开发详解(基于讯飞语音SDK)

孟飞阳
 孟飞阳
发布于 2017/02/10 13:24
字数 851
阅读 47
收藏 1

一、准备工作

1、你需要android手机应用开发基础

2、科大讯飞语音识别SDK android版

3、科大讯飞语音识别开发API文档

4、android手机

关于科大讯飞SDK及API文档,请到科大语音官网下载:http://www.xfyun.cn/

当然SDK和API有多个版本可选,按照你的需要下载,其次,下载需要填写资料申请注册,申请通过或可获得Appid

如下图,申请一个APPID,就可以了。

二、语音识别流程

 

1、创建识别控件

函数原型

Public RecognizerDialog(Context context,String params)

其中Context表示当前上下文环境,传this即可

Params有参数详见API文档

 

2、用Appid登录到科大讯飞服务器(自动连接,需要联网)

主要用到SpeechUser(com.iflytek.speech包下)类下的getUser().login()函数

其中getUser()表示获取用户对象,可以实现用户登录,注销等操作

Login函数原型

Public boolean login(Context context,String usr,String pwd,String...

参数详见API文档

 

3、读取语言识别语法

详见API文档

 

4、设置识别参数及识别监听器

通过RecognizerDialog下的setEngine()方法设置参数

函数原型

public void setEngine(String engine,String params,String grammar)

详细的参数请参考API文档

5、识别结果回调

需要实现RecognizerDialogListener接口,其中有两个方法需要重写,分别是

1)public void onResults(ArrayList<RecognizerResult> results,boolean isLast)

其中result是RecognizerResult对象的集合,RecognizerResult的属性有

String text 识别文本

Int confidence 识别可信度

2)public void onEnd(SpeechError error)

 

6、识别结果处理(自行处理)

自己将文本进行处理。

三、详细开发过程

 

1、新建Android项目

和普通的android项目一样,只是需要加入科大讯飞语言SDK包,主要包括

Msc.jar及libmsc.so动态库文件,项目lib截图

2、布局

这里只进行简单的布局,只设置一个按钮作为语言识别按钮及一个文本组件用作显示识别结果,布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >


    <EditText
        android:id="@+id/editText"
        android:layout_width="fill_parent"
        android:layout_height="300dp"
        android:gravity="top"
        android:inputType="textMultiLine" >
        
        <requestFocus />
     </EditText>
     <Button
         android:id="@+id/button_start"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="点击开始说话" />         
</LinearLayout>

 

3、Main.java代码如下:

public class Main extends Activity {

    // 组件
    private Button button = null;
    private TextView result = null;
    private Toast mToast = null;

    // 语音识别
    private final String APP_ID = "这里改成自己的APP_ID";
    private RecognizerDialog recognizerDialog = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);

        button = (Button) super.findViewById(R.id.button_start);
        result = (TextView) super.findViewById(R.id.editText);

        // 初始化识别
        mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
        mToast.setMargin(0f, 0.2f);
        recognizerDialog = new RecognizerDialog(this, "appid=" + APP_ID);
        SpeechUser.getUser().login(this, null, null, "appid=" + APP_ID, loginListener);

        this.button.setOnClickListener(new Btn());

    }

    private class Btn implements OnClickListener {

        @Override
        public void onClick(View v) {

            //MainActivity.this.voice.setImageResource(R.drawable.voicelight);
            recognizerDialog.setListener(mRecoListener);
            recognizerDialog.setEngine(null, "grammar_type=abnf", grammarText);
            recognizerDialog.show();
        }
    }

    // 语音识别用户登录监听器
    private SpeechListener loginListener = new SpeechListener() {

        @Override
        public void onData(byte[] arg0) {
        }

        @Override
        public void onEvent(int arg0, Bundle arg1) {
        }

        @Override
        public void onEnd(SpeechError arg0) {
            // TODO Auto-generated method stub
            if (arg0 != null) {
                mToast.setText("登录失败");
                mToast.show();
            } else {
                mToast.setText("登录成功");
                mToast.show();
            }
        }
    };

    // 识别结果回调
    private RecognizerDialogListener mRecoListener = new RecognizerDialogListener() {

        @Override
        public void onEnd(SpeechError error) {
            //MainActivity.this.voice.setImageResource(R.drawable.voice);
        }

        @Override
        public void onResults(ArrayList<RecognizerResult> results, boolean isLast) {
            // TODO Auto-generated method stub
            String text = "";
            text = results.get(0).text;
            mToast.setText("识别结果为:" + text);
            mToast.show();
            result.setText("识别结果为:" + text);
        }

    };

}

4、需要的权限:

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <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"/>

 

5、结果截图:

本文转载自:https://my.oschina.net/yaowen424/blog/691188

共有 人打赏支持
孟飞阳
粉丝 205
博文 964
码字总数 543203
作品 5
朝阳
个人站长

暂无文章

【挑战剑指offer】系列03:逆序打印单链表

本系列的算法原题来自于“牛客网-剑指offer”,写这个板块,不仅仅是解决算法问题本身,更是手动提高难度、自行变式,思考更多的解决方案,以带给自己一些启发。 1. 【逆序打印单链表】原始题...

LinkedBear
52分钟前
2
0
Linux内存布局

今天这篇文章主要是我之前看Linux内核相关知识和博客Gustavo Duarte中。我主要是看了这篇博客,并且结合之前的知识,对内存管理的的理解又上升了一个档次。所以想通过这篇文章总结下。 我们先...

linuxprobe16
今天
1
0
day94-20180921-英语流利阅读-待学习

记录死亡还是消费死者?自杀报道的媒体偏见 雪梨 2018-09-21 1.今日导读 自杀事件报道一直是新闻报道的重要部分,具有骇人听闻、吸引眼球的特点。可是在报道这些事件的时候,除了客观陈述事实...

飞鱼说编程
今天
4
0
如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
今天
5
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部