572
汽車大全
訊飛語音
、你需要android手機應用開發基礎2、科大訊飛語音識別SDK android版
3、科大訊飛語音識別開發API文檔
4、android手機
關於科大訊飛SDK及API文檔,請到科大語音官網下載:https://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文件的內容可以是如下
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、布局
這裏隻進行簡單的布局,隻設置一個按鈕作為語言識別按鈕及一個文本組件用作顯示識別結果,布局文件如下
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="https://schemas.android.com/apk/res/android"
xmlns:tools="https://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、識別語法文件
這裏隻是簡答的識別所說的城市名,其中指定了“北京”、“上海”、“廣州”、“深圳”、“廈門”
1
2
3
4
5
6
7
|
#ABNF
1.0 gb2312;
language zh-CN;
mode
voice;
root
$main;
$main
= $where
;
$where
= 北京
| 上海
| 廣州
| 深圳
| 廈門;
|
4、MainActivity程序
代碼如下,請參考上麵的語言識別流程
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,"appappabnf",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、給程序相應的權限
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程序安裝包
下載地址:https://pan.baidu.com/share/link?shareid=494903&uk=3087605183
本站統一解壓密碼:www.52wulian.org
最後更新:2017-04-03 20:19:25