安卓开发 科大中文语音识别

下午看了语音识别教程:科大讯飞的中文识别后,功能做出来了,详见开发文档。

晚上的时候,无意浏览到一个开发包,做的竟然比我的更高级,并且重要的是代码更少,然后结合自己的重新做了语音识别第3个版本。

spech1,spech2是一种开发方法,speech是另外一种方法。

该版本相对于前两种优点:

1.提供了录音界面,更加人性化。

2,不需要对json语句进行解析,该接口已经做完了。

步骤:

建立安卓工程,命名为speech3,包名为:com.swust.speech3

一、前台文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center_horizontal"
    >
    
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="350dp"
        
        >
        <EditText
            android:id="@+id/txt_result"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:textSize="20sp"
            android:paddingBottom="40dip"
            android:gravity="top|left"
            android:editable="true" />
        
    </RelativeLayout>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dip" >
        <Button
            android:id="@+id/btnStart"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginTop="10dip" 
            android:text="录制"
            >
        </Button>
        <Button
            android:id="@+id/btnClear"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginTop="10dip" 
            android:layout_marginLeft="10dip" 
            android:text="清空"
            />
        
    </LinearLayout>
</LinearLayout>
Activity.xml

效果:

二、后台文件:

整体上需要注意:

第一,从此类开发版本的libs中拷贝文件:armeabi文件夹和Msc.jar

第二,获取按键,文本框资源id,设置监听事件

第三,在对应的按键中,赋予相应功能

重点,是录制按钮,响应事件函数:

 //按钮监听:开始录制
            btnStart.setOnClickListener(new OnClickListener(){
                public void onClick(View v){
                    
                Toast.makeText(MainActivity.this,"...",0).show();
                showReconigizerDialog();
                }
                });

里面的函数:

 1  private void showReconigizerDialog() {
 2             //setEngine(String engine,String params,String grammar);
 3             /**
 4              * 识别引擎选择,目前支持以下五种
 5                 “sms”:普通文本转写
 6                 “poi”:地名搜索
 7                 “vsearch”:热词搜索
 8                 “vsearch”:热词搜索
 9                 “video”:视频音乐搜索
10                 “asr”:命令词识别
11                 
12                 params    引擎参数配置列表
13                 附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null
14              */
15             rd.setEngine("sms", null, null);
16             
17             //设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。
18             rd.setSampleRate(RATE.rate16k);
19             
20             final StringBuilder sb = new StringBuilder();
21             Log.i(TAG, "识别准备开始.............");
22             
23             //设置识别后的回调结果
24             rd.setListener(new RecognizerDialogListener() {
25                 @Override
26                 public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {
27                     for (RecognizerResult recognizerResult : result) {
28                         sb.append(recognizerResult.text);
29                         Log.i(TAG, "识别一条结果为::"+recognizerResult.text);
30                     }
31                 }
32                 @Override
33                 public void onEnd(SpeechError error) {
34                     Log.i(TAG, "识别完成.............");
35                     txt_result.append(sb.toString());//追加方式
36                     Log.i(TAG, "识别完成:"+txt_result.getText().toString());
37                 }
38             });
39             
40             //txt_result.setText(""); //先设置为空,等识别完成后设置内容
41             txt_result.append("
");
42             rd.show();
43         }

注意的是:

在从别处复制粘贴时,要特别注意同时也导入了别的工程的包,删除即可

该工程的资源对象均在工程前面全局初始化了

代码:

package com.swust.speech3;

import java.util.ArrayList;

import com.iflytek.speech.RecognizerResult;
import com.iflytek.speech.SpeechError;
import com.iflytek.speech.SpeechConfig.RATE;
import com.iflytek.ui.RecognizerDialog;
import com.iflytek.ui.RecognizerDialogListener;


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class MainActivity extends Activity {

    protected static final String TAG = "ThirdActivity";
    private EditText txt_result;
    private Button btnStart;
    private Button btnClc;  //开始录制及清空按钮
    private RecognizerDialog rd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        findView();
        //RecognizerDialog(Context context, String params); "appid=1234567,usr=test,pwd=12345"  usr、pwd不是必选的
        //创建语音识别dailog对象,appid到讯飞就注册获取
        rd = new RecognizerDialog(this ,"appid=50e1b967");
    }
        private void findView() {
             //获取对象资源ID
            btnStart =(Button) findViewById(R.id.btnStart);
            btnClc =(Button) findViewById(R.id.btnClear);
            txt_result = (EditText) findViewById(R.id.txt_result);
            //按钮监听:清除
            btnClc.setOnClickListener(new OnClickListener(){
                public void onClick(View v){
                    txt_result.setText("");
                    }
            });
            //按钮监听:开始录制
            btnStart.setOnClickListener(new OnClickListener(){
                public void onClick(View v){
                    
                Toast.makeText(MainActivity.this,"...",0).show();
                showReconigizerDialog();
                }
                });
        }
       
        
        private void showReconigizerDialog() {
            //setEngine(String engine,String params,String grammar);
            /**
             * 识别引擎选择,目前支持以下五种
                “sms”:普通文本转写
                “poi”:地名搜索
                “vsearch”:热词搜索
                “vsearch”:热词搜索
                “video”:视频音乐搜索
                “asr”:命令词识别
                
                params    引擎参数配置列表
                附加参数列表,每项中间以逗号分隔,如在地图搜索时可指定搜索区域:“area=安徽省合肥市”,无附加参数传null
             */
            rd.setEngine("sms", null, null);
            
            //设置采样频率,默认是16k,android手机一般只支持8k、16k.为了更好的识别,直接弄成16k即可。
            rd.setSampleRate(RATE.rate16k);
            
            final StringBuilder sb = new StringBuilder();
            Log.i(TAG, "识别准备开始.............");
            
            //设置识别后的回调结果
            rd.setListener(new RecognizerDialogListener() {
                @Override
                public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {
                    for (RecognizerResult recognizerResult : result) {
                        sb.append(recognizerResult.text);
                        Log.i(TAG, "识别一条结果为::"+recognizerResult.text);
                    }
                }
                @Override
                public void onEnd(SpeechError error) {
                    Log.i(TAG, "识别完成.............");
                    txt_result.append(sb.toString());//追加方式
                    Log.i(TAG, "识别完成:"+txt_result.getText().toString());
                }
            });
            
            //txt_result.setText(""); //先设置为空,等识别完成后设置内容
            txt_result.append("
");
            rd.show();
        }


   
}
ActivityView.java

三、权限文件

要注意对应的录音权限,上网权限等

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.swust.speech3"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
     <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" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
AndroidManifest.xml

整体就是这样啦,加油

原文地址:https://www.cnblogs.com/shuqingstudy/p/5111426.html