安卓Android科大讯飞语音识别代码使用详解

科大讯飞的语音识别功能用在安卓代码中,我把语音识别写成了Service,然后在Fragment直接调用service服务。科大讯飞语音识别用的是带对话框的那个,直接调用科大讯飞的语音接口,代码采用链表结果集的方式获取数据。 
这个语音识别需要在官网申请APPID

本博来自:http://blog.csdn.net/zhaocundang 小波LinuxQQ463431476

测试:

安卓Android科大讯飞语音识别代码使用详解

安卓Android科大讯飞语音识别代码使用详解

自己项目采用了科大讯飞语音识别服务,报告中是这样解释的:

语音Service服务代码设计

(1)要想写好Service代码,必须了解Service的生命周期.

(2)首先启动Service服务的方法是: 
getActivity().startService(new Intent(getActivity(),VoiceService.class)); 
停止Service服务: 
getActivity().stopService(new Intent(getActivity(),VoiceService.class)); 
(3)将类继承与Service: 
public class VoiceService extends Service{ 
} 
自动重载OnBind()函数,通过OnBind()的返回值,将Service的实例返回调用者。 
(3) 调用科大讯飞语音API接口代码 
先调用手机麦克风录音: 
rd.setSampleRate(RATE.rate16k); 
调用语音API包中的语音识别对话框,将录音发送到服务器,并接受服务器返回的结果,将数据以链表数据结构的形式传过来,获取结果: 
final StringBuilder sb = new StringBuilder(); 
rd.setListener(new RecognizerDialogListener() { 
public void onResults(ArrayList result, boolean isLast) { 
for (RecognizerResult recognizerResult : result) { 
sb.append(recognizerResult.text); 
} 
} 
public void onEnd(SpeechError error) { 
} 
}); 
(4)文本语音朗读的调用: 
先是声明播放对象: 
private static SynthesizerPlayer player ; 
这里我直接封装一个朗读函数,appid是申请的应用授权id,代码如下: 
public void speak(String words){ 
player = SynthesizerPlayer.createSynthesizerPlayer(getActivity(),”appid=57527406”); 
player.playText(words, null,null); //播放文本 
}

主要的代码:

开启和关闭服务:


public void onClick(View v) {
        // TODO Auto-generated method stub
       switch(v.getId()){
            case R.id.button1:
       getActivity().startService(new Intent(getActivity(),VoiceService.class));     
                break;
            case R.id.button2:
       getActivity().stopService(new Intent(getActivity(),VoiceService.class)); 
                break;
        }
    }  

服务中:

package zcd.voice;

import java.util.ArrayList;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.view.WindowManager;
import android.widget.Toast;

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

public class VoiceService extends Service{
    private RecognizerDialog rd;
    private   String text;
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
      @Override
        public void onCreate() {
            // TODO Auto-generated method stub
            super.onCreate();

          // Toast.makeText(this, "Service onCreated", Toast.LENGTH_LONG).show();
           rd = new RecognizerDialog(this ,"appid=57627d9c");

        }

      public void onStart(Intent intent, int startId) {

         //  Toast.makeText(this, " Service onStart", Toast.LENGTH_LONG).show();
           showReconigizerDialog();

        }

      private void showReconigizerDialog() {
             //sms 简单语音识别文本
             rd.setEngine("sms", null, null);
             //设置麦克风采样频率
            rd.setSampleRate(RATE.rate16k);
             final StringBuilder re = new StringBuilder();
            //设置识别后的回调结果
            rd.setListener(new RecognizerDialogListener() {
                @Override
                public void onResults(ArrayList<RecognizerResult> result, boolean isLast) {
                    for (RecognizerResult recognizerResult : result) {
                        re.append(recognizerResult.text);
                    }
                }
                @Override
                public void onEnd(SpeechError error) {
                    //识别完成 
                    //R.id.txt_result.setText(sb.toString()); 
                     text = re.toString();
                     Toast.makeText(VoiceService.this,re.toString(), Toast.LENGTH_LONG).show();
                     sendmsg();
                }

            });

            //txt_result.setText(""); //先设置为空,等识别完成后设置内容
            rd.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); // service 中getwindowmanager 设置优先级显示对话框
            rd.show();
        }


        public  void sendmsg()
     {
          //broadcast 
            // service 通过广播来发送识别结果到Voice Fragment
            Intent intent=new Intent();
            intent.putExtra("message",text);
            intent.setAction("zcd.voice");
            sendBroadcast(intent);
     }


}

Service中是无法显示对话框的,显示对话框的方式就是使用getwindow的方法,设置窗口最高优先级即可了!

上一篇:Confluence 6 配置边栏链接


下一篇:C语言及程序设计初步例程-38 用break和continue改变流程