第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 安卓Android科大讯飞语音识别代码使用详解

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

时间:2023-02-09 22:33:45

相关推荐

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

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

这个语音识别需要在官网申请APPID

本博来自:/zhaocundang小波LinuxQQ463431476

测试:

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

语音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 stubswitch(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的方法,设置窗口最高优先级即可了!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。