原文来自于: http://www.52wulian.org/android_voice/

最近项目需要用到android语音识别,立马就想到科大讯飞,结合官方实例及阅读API文档,初步的完成了Android语音识别,下面是实现过程实录。

一、准备工作

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

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

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

4、android手机

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

当然SDK和API有多个版本可选,按照你的需要下载,其次,下载需要填写资料申请注册,申请通过或可获得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、读取语言识别语法

通过abnf文件并读取该文件,实现指定的语言识别语法,比如为了识别并计算国内两个城市之间的距离,abnf文件的内容可以是如下

 
 
 
 

Java

 
1
2
3
4
5
6
7
"#ABNF 1.0 gb2312;
language zh-CN;
mode voice;
root $main;
$main = $place1 到$place2 ;
$place1 = 北京 | 武汉 | 南京 | 天津 | 天京 | 东京;
$place2 = 上海 | 合肥;"

Abnf文件的读取参考后面的具体开发实例

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、布局

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

 
 
 
 

XHTML

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@drawable/color"
    tools:context=".MainActivity" >
    <ImageView
      android:id="@+id/voice"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_marginTop="100dp"
      android:src="@drawable/voice"/>
    
     <TextView
        android:id="@+id/result"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:layout_gravity="center_vertical"
        android:layout_width="fill_parent"
        android:text="提示:请说出你所在的城市"/>
    
</LinearLayout>

3、识别语法文件

这里只是简答的识别所说的城市名,其中指定了“北京”、“上海”、“广州”、“深圳”、“厦门”

 
 
 
 

Java

 
1
2
3
4
5
6
7
#ABNF 1.0 gb2312;
language zh-CN;
mode voice;
 
root $main;
$main = $where ;
$where = 北京 | 上海 | 广州 | 深圳 | 厦门;

4、MainActivity程序

代码如下,请参考上面的语言识别流程

 
 
 
 

Java

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.example.androidclient;
 
import java.io.InputStream;
import java.util.ArrayList;
 
import com.iflytek.speech.RecognizerResult;
import com.iflytek.speech.SpeechError;
import com.iflytek.speech.SpeechListener;
import com.iflytek.speech.SpeechUser;
import com.iflytek.ui.RecognizerDialog;
import com.iflytek.ui.RecognizerDialogListener;
 
import android.os.Bundle;
import android.app.Activity;
import android.content.SharedPreferences;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
 
public class MainActivity extends Activity{
    //组件
    private ImageView voice = null;
    private TextView result = null;
    private Toast mToast = null;
    
    //语音识别
    private final String APP_ID = "514fb8d7";
    private final static String KEY_GRAMMAR_ID = "grammar_id";
    private RecognizerDialog recognizerDialog = null;
    private String grammarText = null;
    private String grammarID = null;
    
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.activity_main);
        
        this.voice = (ImageView)super.findViewById(R.id.voice);
        this.result = (TextView)super.findViewById(R.id.result);
        
        //初始化识别
        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);
        
        // 读取保存的语法ID
        SharedPreferences preference = this.getSharedPreferences("abnf",MODE_PRIVATE);
        grammarID =preference.getString(KEY_GRAMMAR_ID, null);
        grammarText = readAbnfFile();
        
        
        this.voice.setOnClickListener(new Voice());
        
    }
 
    
    private class Voice 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 onEnd(SpeechError error) {
            if(error != null)
            {
                mToast.setText("登录失败");
                mToast.show();
            }
            else
            {
                mToast.setText("登录成功");
                mToast.show();
            }
        }
 
        @Override
        public void onEvent(int arg0, Bundle arg1) {
        }        
    };
    
    //读取语音识别语法
    private String readAbnfFile()
    {
        int len = 0;
        byte []buf = null;
        String grammar = "";
        try {
            InputStream in = getAssets().open("gm_continuous_digit.abnf");            
            len  = in.available();
            buf = new byte[len];
            in.read(buf, 0, len);
            grammar = new String(buf,"gb2312");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return grammar;
 
    }
    //识别结果回调
    private RecognizerDialogListener mRecoListener = new RecognizerDialogListener()
    {
        @Override
        public void onResults(ArrayList<RecognizerResult> results,boolean isLast) {
            String text = "";
            text = results.get(0).text;
            mToast.setText("识别结果为:"+text);
            mToast.show();
            result.setText("识别结果为:"+text);
        }
 
        @Override
        public void onEnd(SpeechError error) {
            MainActivity.this.voice.setImageResource(R.drawable.voice);
        }
        
    };
}

5、给程序相应的权限

 
 
 
 

XHTML

 
1
2
3
4
5
6
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<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"/>

由于本程序用到了网络、麦克风等,需要给定一下权限

6、结果截图

四、项目文件及android程序下载

项目源文件及android程序安装包

下载地址:http://pan.baidu.com/share/link?shareid=494903&uk=3087605183

本站统一解压密码:www.52wulian.org

转:基于科大讯飞语音API语音识别开发详解的更多相关文章

  1. 基于H5的微信支付开发详解

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  2. ****基于H5的微信支付开发详解[转]

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  3. ***PHP基于H5的微信支付开发详解(CI框架)

    这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...

  4. javaCV开发详解之5:录制音频(录制麦克风)到本地文件/流媒体服务器(基于javax.sound、javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  5. javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  6. javaCV开发详解之4:转流器实现(也可作为本地收流器、推流器,新增添加图片及文字水印,视频图像帧保存),实现rtsp/rtmp/本地文件转发到rtmp流媒体服务器(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  7. javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  8. javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  9. javacv开发详解之1:调用本机摄像头视频(建议使用javaCV1.3版本)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

随机推荐

  1. RHEL 6.4 安装svn和apache

    1.安装软件包(RHEL已经按默认设置安装完成) 需要安装的.rpm软件包: postgresql-libs perl-URI subversion mod_dav_svn 2.创建svn文件夹和版本 ...

  2. 如何评估oracle AWR 的在oracle 中的存储情况

    如何评估oracle AWR 的在oracle 中的存储情况 如果把awr保存时间从默认的7天修改为30天,采样时间从1小时修改到更短,修改之后如何预估空间占用? ------------------ ...

  3. Java学习的随笔(3)接口

    首先是一段<Java编程思想>中,对接口的解释:“interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现.它允许创建者确定方法名.参数列表.返回类型,但是没有任何 ...

  4. linux网络编程学习笔记之五 -----并发机制与线程�

    进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省 ...

  5. DBMS_RLS包实现数据库表中的行级安全控制

    DBMS_RLS 实现一个数据库表为行级安全控制,该套餐包括细粒度的访问控制管理界面,此接口是用来实现VPD(Virtual Private Database),虚拟专用数据库.DBMS_RLS仅仅能 ...

  6. Linux TCP队列相关参数的总结

    作者:阿里技术保障锋寒 原文:https://yq.aliyun.com/articles/4252 摘要: 本文尝试总结TCP队列缓冲相关的内核参数,从协议栈的角度梳理它们,希望可以更容易的理解和记 ...

  7. NSIndexPath初始化

    在UITableView中经常用到这个类,但一直不知道怎么初始化,网上抄录的代码如下,果然好用 NSIndexPath *index = [NSIndexPath indexPathForRow:0 ...

  8. PuTTY?Bash?Out了!!!终端应该这么玩~

    由于语言的障碍,国内一直存在一个问题,就是新技术引入太慢.比如PuTTY,其实已停止维护N久了,但大部分人却仍然在用(包括之前的我).比如Bash,明知有那么多的问题,却一直没有什么想法,似乎Linu ...

  9. Python开发【第八篇】:网络编程

    Python之路[第六篇]:socket   Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字&quo ...

  10. 如何学习H264协议

    如何学习h.264协议 首先,我假定你已经具有如下基础: 1 了解基本的视频知识,知道什么是YCbCr/YUV: 2 知道基本的视频压缩原理: 如果这两条还不具备,那么,停一下,补一下课.这方面的相关 ...