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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 20933|回复: 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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

0

主题

25

帖子

68

积分

注册会员

Rank: 2

积分
68
63#
发表于 2016-10-19 19:25:58 | 只看该作者
佩服,佩服!












回复 支持 反对

使用道具 举报

4

主题

31

帖子

123

积分

禁止发言

积分
123
62#
发表于 2016-10-17 07:16:37 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

48

帖子

234

积分

中级会员

Rank: 3Rank: 3

积分
234
61#
发表于 2016-9-29 22:58:38 | 只看该作者
哈哈,有意思。












某宝购买 视频教程 素材 软件 xiao视频 等资源  百度网盘免费下载   hao.wpan123.com
回复 支持 反对

使用道具 举报

0

主题

12

帖子

149

积分

禁止发言

积分
149
60#
发表于 2016-9-13 19:11:23 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

0

主题

2

帖子

12

积分

新手上路

Rank: 1

积分
12
59#
发表于 2016-7-21 11:18:16 | 只看该作者
初来乍到,请多多关照。












您懂得 您懂得 别想歪了 百度网盘免费下载   hao.wpan123.com
回复 支持 反对

使用道具 举报

0

主题

40

帖子

124

积分

注册会员

Rank: 2

积分
124
58#
发表于 2016-6-26 09:02:25 | 只看该作者
朋友不错,谢谢您的努力,顶了












回复 支持 反对

使用道具 举报

0

主题

15

帖子

48

积分

新手上路

Rank: 1

积分
48
57#
发表于 2016-6-20 17:02:55 | 只看该作者
给力给力
回复

使用道具 举报

1

主题

38

帖子

97

积分

注册会员

Rank: 2

积分
97
56#
发表于 2016-6-16 21:28:42 | 只看该作者
有点难度,没有搞过,不知道能不能学会。
回复 支持 反对

使用道具 举报

0

主题

53

帖子

156

积分

注册会员

Rank: 2

积分
156
55#
发表于 2016-6-10 23:57:36 | 只看该作者
帮顶帮顶帮顶
回复 支持 反对

使用道具 举报

0

主题

36

帖子

104

积分

注册会员

Rank: 2

积分
104
54#
发表于 2016-6-7 07:42:57 | 只看该作者
呵呵,好帖一定要顶,支持












回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-23 15:51 , Processed in 0.168339 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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