安卓Android科大讯飞语音识别代码使用详解
科大讯飞的语音识别功能用在安卓代码中,我把语音识别写成了Service,然后在Fragment直接调用service服务。科大讯飞语音识别用的是带对话框的那个,直接调用科大讯飞的语音接口,代码采用链表结果集的方式获取数据。
这个语音识别需要在官网申请APPID
本博来自:http://blog.csdn.net/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 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的方法,设置窗口最高优先级即可了!
安卓Android科大讯飞语音识别代码使用详解的更多相关文章
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android Design Support Library使用详解
Android Design Support Library使用详解 Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的And ...
- Android 之窗口小部件详解--App Widget
Android 之窗口小部件详解--App Widget 版本号 说明 作者 日期 1.0 添加App Widge介绍和示例 Sky Wang 2013/06/27 1 App ...
- Android不规则点击区域详解
Android不规则点击区域详解 摘要 今天要和大家分享的是Android不规则点击区域,准确说是在视觉上不规则的图像点击响应区域分发. 其实这个问题比较简单,对于很多人来说根本不值得做为一篇博文写出 ...
- [Android新手区] SQLite 操作详解--SQL语法
该文章完全摘自转自:北大青鸟[Android新手区] SQLite 操作详解--SQL语法 :http://home.bdqn.cn/thread-49363-1-1.html SQLite库可以解 ...
- Android中Service的使用详解和注意点(LocalService)
Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...
- Android中SurfaceView的使用详解
Android中SurfaceView的使用详解 http://blog.csdn.net/listening_music/article/details/6860786 Android NDK开发 ...
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- Android特效 五种Toast详解
Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失.而且Toast主要用于向用户显示提示消 ...
随机推荐
- IOC框架
一. IOC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...
- Redis数据结构详解之Set(三)
序言 在Redis中,Set和list都是字符串序列,非常相似,不同之处在于Set是用哈希表来保持字符串的唯一性,没有先后顺序,不像list一样,可以在首尾增删数据.但是set也有自己的相应处理命令来 ...
- HTML基础
HTML指的是超文本标记语言 (Hyper Text Markup Language), HTML不是一种编程语言,而是一种标记语言 (markup language) ,HTML使用标记标签来描述网 ...
- Php基础知识测试题
一:选择题 1. LAMP具体结构不包含下面哪种(A ) A:Windows系统 如果是这个就是WMP B:Apache服务器 C:MySQL数据库 D:PHP语 ...
- 计算机网络学习笔记--网络层之IP地址与子网
IPv4地址: 我们知道在网络层(TCP/IP体系结构的网际互联层),最重要的一个协议就是IP协议,现在正处于IPv4和IPv6的过渡时期,但目前来说,IPv4仍为主流,所以主要讲Ipv4. IP地址 ...
- 现代3D图形编程学习-关于本书(译)
本书系列 现代3D图形编程学习 关于这本书 三维图像处理硬件很快成为了必不可少的组件.很多操作系统能够直接使用三维图像硬件,有些甚至要求需要有3D渲染能力的硬件.同时对于日益增加的手机系统,3D图像硬 ...
- ASP.NET Core 中文文档 第三章 原理(3)静态文件处理
原文:Working with Static Files 作者:Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay).孟帅洋(书缘) 静态文 ...
- 利用Python进行数据分析(11) pandas基础: 层次化索引
层次化索引 层次化索引指你能在一个数组上拥有多个索引,例如: 有点像Excel里的合并单元格对么? 根据索引选择数据子集 以外层索引的方式选择数据子集: 以内层索引的方式选择数据: 多重索引S ...
- SQL Server里在文件组间如何移动数据?
平常我不知道被问了几次这样的问题:“SQL Server里在文件组间如何移动数据?“你意识到这个问题:你只有一个主文件组的默认配置,后来围观了“SQL Server里的文件和文件组”后,你知道,有多 ...
- 【原创】Kafka Consumer多线程实例
Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala ...