閱讀572 返回首頁    go 汽車大全


訊飛語音

、你需要android手機應用開發基礎

2、科大訊飛語音識別SDK android

3、科大訊飛語音識別開發API文檔

4android手機

關於科大訊飛SDKAPI文檔,請到科大語音官網下載:https://open.voicecloud.cn/

當然SDKAPI有多個版本可選,按照你的需要下載,其次,下載需要填寫資料申請注冊,申請通過或可獲得Appid

二、語音識別流程

1、創建識別控件

函數原型

Public RecognizerDialog(Context context,String params)

其中Context表示當前上下文環境,傳this即可

Params有參數詳見API文檔

2、用Appid登錄到科大訊飛服務器(自動連接,需要聯網)

主要用到SpeechUsercom.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)

其中resultRecognizerResult對象的集合,RecognizerResult的屬性有

String text 識別文本

Int confidence 識別可信度

2)public void onEnd(SpeechError error)

6、識別結果處理(自行處理)

自己將文本進行處理。

三、詳細開發過程

1、新建Android項目

和普通的android項目一樣,隻是需要加入科大訊飛語言SDK包,主要包括

Msc.jarlibmsc.so動態庫文件,項目lib截圖

android_voice1.jpg

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 = 北京 | 上海 | 廣州 | 深圳 | 廈門;

4MainActivity程序

代碼如下,請參考上麵的語言識別流程

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_voice2android_voice3

四、項目文件及android程序下載

項目源文件及android程序安裝包

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

本站統一解壓密碼:www.52wulian.org

最後更新:2017-04-03 20:19:25

  上一篇:go Oracle中的記錄(Record)
  下一篇:go JDBC PreparedStatement 批量查詢 in 的實現 方案