zoukankan      html  css  js  c++  java
  • 安卓开发 科大中文语音识别

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

    晚上的时候,无意浏览到一个开发包,做的竟然比我的更高级,并且重要的是代码更少,然后结合自己的重新做了语音识别第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

    整体就是这样啦,加油

  • 相关阅读:
    redis运维手册
    grafana展示ES中的nginx日志-地图展示
    nginx针对yum安装nginx重编译
    K8S-yaml里初始化容器
    K8S-资源配置清单补充1
    K8S-资源配置清单详解
    Docker cp 提示“no space left on device”
    磁盘
    ansible 对文件内容的操作
    ansible 初始化系统分区格式化
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/5111426.html
Copyright © 2011-2022 走看看