智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想!

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 17137|回复: 63
打印 上一主题 下一主题

《android入门教程四》语音控制之自动应答模式

  [复制链接]

6

主题

25

帖子

129

积分

版主

Rank: 7Rank: 7Rank: 7

积分
129
跳转到指定楼层
楼主
发表于 2015-10-14 20:23:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 feiju 于 2015-10-14 21:03 编辑

    开源是一种精神,开源是一种境界。在上一个教程中,我们已经一起学习了如何让app说话,根据自己的语音命令执行一个自定义的操作事件,如果你还没有看以上教程,并且之前没弄过安卓app的话,请查看以上教程,不然你会看不懂的哦!
    成功弄出语音的创友们,这时会发现,语音命令用的太费劲了,每次说语音命令,都要手动按一下开始按钮,这样的使用体验显然不是我们想要的。如何在开启语音模式后就不需要再按了,直接对着app说语音命令,听完一句就自动执行去,这样多方便呢?是的,我也是这样想的,所以,这次的教程,我们就去改造它,让它开启自动语音模式。
   首先,我们先了解一下语音命令的执行周期是怎么样的,简单点说,就是语音命令从什么地方开始的,又在什么地方结束的,机器人给出回应后怎么继续听接下来的语音命令。
我们打开IatDemo.java文件,如下图
打开后我们找到如下图的代码位置
大家可以看到,里面有完整的“开始”按钮,“停止”按钮和“取消”按钮的点击事件,现在是不是找到语音是从哪开始的了吧!我们细看一下,里面么有个recognizerListener如图:
这个是干什么的呢?别着急,我们将鼠标移到上面后,摁住Ctrl键鼠标左击后就自动跳到定义这个东西的地方了,定下心来看看中文注释,是不是有点懂了呢?
注意红色的箭头,“开始说话”代表语音识别开启,“结束说话”代表语音识别结束,onError表示语音识别存在错误,一般情况下就是开启语音识别,你没说话会导致这个问题,记住它哦,一会我们会用到它。onResult顾名思义,就是得到语音识别结果,怎么去处理它,是不是在里面看到你熟悉的字眼了啊?
赶紧鼠标移过去,摁住Ctrl然后左击它,这就来到我们上一篇讲解的位置了。至此,我们对语音命令的流程,大致有了一个了解,概括起来就是,打开语音识别->获取到你说的语音后上传到服务器->返回语音识别出来的文字->根据识别出来的文字,判断执行语音命令。
    其次,了解了语音识别的流程后,我们先来想一下,怎么去实现自动语音。我的思路是这样的,给app一个开启的关键字符,让它知道你是在叫它,然后打开语音处理开关,听你说了些什么,然后根据你说了什么去执行相关命令,并在最后告诉你:“好的!”“OK!”“卧室灯已关闭!”等等,然后关闭语音处理开关,等待下次你叫它!思路有千变万化,如果你有不同的想法,那最好了,设计属于自己的app是我们共同的目标!在这里我就介绍一下如何实现我的思路吧,如果大家有更好的方案,请在下面留言,我们一起交流学习,大神勿喷!
    最后,我们一起去实现它吧!第一步,我们在initLayout()的上面粘贴上以下代码
[Java] 纯文本查看 复制代码
private void ListenAgain(){
setParam();
boolean isShowDialog = mSharedPreferences.getBoolean(getString(R.string.pref_key_iat_show), true);
if (isShowDialog) {
// 显示听写对话框
mResultText.setText(null);
iatDialog.setListener(recognizerDialogListener);
iatDialog.show();
showTip(getString(R.string.text_begin));
} else {
// 不显示听写对话框
ret = mIat.startListening(recognizerListener);
if(ret != ErrorCode.SUCCESS){
showTip("听写失败,错误码:" + ret);
}else {
showTip(getString(R.string.text_begin));
}
}
}
效果如下图,
这个主要是为了让语言识别在结束后再次启动用的,在什么情况下会用到这个呢?首先,如果开启语音识别,一段时间没有说话,就会关闭识别了,这个时候,我们不能让它关闭,要让它继续识别;其次,如果我们说话了,app处理了我们的命令,并且告诉你:“好的!”“OK!”“卧室灯已关闭!”等等后,再启动重新听,为什么要在结束后开启呢?因为如果不这样,app会把它自己说的话当成语音命令上传,导致卡顿,甚至会出现复读机模式。好了,说了这么多,我们就一步步开始吧!
第一步:在上面的recognizerListener里的onError里添加"ListenAgain();",如下图,这是为了在你开启语音模式后,你没说话的情况下能接着听。

第二步:在ListenAgain上面添加如下代码:
[Java] 纯文本查看 复制代码
@SuppressWarnings("deprecation")
private TextToSpeech.OnUtteranceCompletedListener ttsOnUtteranceCompletedListener = new TextToSpeech.OnUtteranceCompletedListener() { 

public void onUtteranceCompleted(String utteranceId) { 
ListenAgain();
} 
}; 

如下图所示:
第三步:在该位置,
上一教程有提到哦,添加
[AppleScript] 纯文本查看 复制代码
m_speech.setOnUtteranceCompletedListener(ttsOnUtteranceCompletedListener);
如图:

这样,自动语音的运行回路就已经弄好了。
最后一步:我们设置一下那个让app认识的关键字,用来开启识别,怎么弄呢?接着往下。
设置一个全局的开关“boolean mIsAction = false;”,将yuyingtoapi(String yuyin)的东西全部删除,然后粘贴如下代码
[Java] 纯文本查看 复制代码
boolean mIsAction = false;
//分析语音批配文字,Post数据到云端服务器api
@SuppressWarnings({ "deprecation", "unchecked", "rawtypes" })
public void yuyingtoapi(String yuyin) { 

mIat.stopListening();

HashMap myHashAlarm = new HashMap();
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"end of wakeup message ID");

if(yuyin.equals("瓦力")){

m_speech.speak("什么事,请您吩咐", TextToSpeech.QUEUE_FLUSH, myHashAlarm);
mIsAction = true;
return;

}
if(mIsAction && !yuyin.equals("")){
mIsAction = false;

//里面可以添加你想要要添加的语音命令
} 

}

如图:
第一个if里面,你可以修改你喜欢的关键字,在第二个if里面,你就可以添加上一个教程里面的语音命令了,特别注意的是添加语音命令有些小变化,下面贴出命令示例
[Java] 纯文本查看 复制代码
if(yuyin.contains("你好") || yuyin.contains("哈喽") || yuyin.contains("hello")){

speakString = "你好!很高兴认识你!";

m_speech.speak(speakString, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
return;
}
如图,红色框内和上一个教程的变化,上一教程此位置是null,一定要注意修改哦!
    至此,我们的自动语音教程就圆满结束了哦,希望大家看了以后,多提宝贵意见,分享你的想法和经验,分享你我,分享快乐!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

3

主题

69

帖子

839

积分

版主

Rank: 7Rank: 7Rank: 7

积分
839
QQ
沙发
发表于 2015-10-14 20:26:14 | 只看该作者
哎呀我去 !这教程写的真板正!
回复 支持 反对

使用道具 举报

0

主题

22

帖子

77

积分

注册会员

Rank: 2

积分
77
板凳
发表于 2015-10-14 20:39:07 来自手机 | 只看该作者
学习了,开源是一种境界!
回复 支持 反对

使用道具 举报

110

主题

396

帖子

2329

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2329
QQ
地板
发表于 2015-10-14 21:27:52 | 只看该作者
哈哈,你都把我们安卓唤醒语音控制的视频给写出教程啦,我们原来用的是多拉A梦,就会自动应答。
回复 支持 反对

使用道具 举报

3

主题

69

帖子

839

积分

版主

Rank: 7Rank: 7Rank: 7

积分
839
QQ
5#
发表于 2015-10-14 21:33:53 | 只看该作者
但有个问题,这么会马上刷完每天100次限制的,迅飞语音有限制的。大家用自己申请的迅飞的sdk包,然后申请上线才能无限哦
回复 支持 反对

使用道具 举报

6

主题

25

帖子

129

积分

版主

Rank: 7Rank: 7Rank: 7

积分
129
6#
 楼主| 发表于 2015-10-15 08:33:33 | 只看该作者
创客帝国 发表于 2015-10-14 21:33
但有个问题,这么会马上刷完每天100次限制的,迅飞语音有限制的。大家用自己申请的迅飞的sdk包,然后申请上 ...

对,在教程里忘说了,不够用的创友们,自己可以去申请一下哦!
回复 支持 反对

使用道具 举报

6

主题

25

帖子

129

积分

版主

Rank: 7Rank: 7Rank: 7

积分
129
7#
 楼主| 发表于 2015-10-15 08:34:26 | 只看该作者
znck007 发表于 2015-10-14 21:27
哈哈,你都把我们安卓唤醒语音控制的视频给写出教程啦,我们原来用的是多拉A梦,就会自动应答。 ...

视频在哪啊?我去看看!
回复 支持 反对

使用道具 举报

6

主题

25

帖子

129

积分

版主

Rank: 7Rank: 7Rank: 7

积分
129
8#
 楼主| 发表于 2015-10-15 08:35:10 | 只看该作者
洋芋炒土豆 发表于 2015-10-14 20:39
学习了,开源是一种境界!

嗯嗯!
回复 支持 反对

使用道具 举报

0

主题

9

帖子

30

积分

新手上路

Rank: 1

积分
30
9#
发表于 2015-11-2 22:46:17 | 只看该作者
怎么申请讯飞?
回复 支持 反对

使用道具 举报

1

主题

11

帖子

73

积分

注册会员

Rank: 2

积分
73
10#
发表于 2015-11-11 22:04:21 | 只看该作者
加油楼主,继续!代码在哪下载啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|手机版|智能创客 ( 桂ICP备14000828号

GMT+8, 2024-11-27 04:41 , Processed in 0.097677 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表