## 开发 语音小助手
让我们用不到50行代码来开发一个跨平台语音生活助手(可运行于iPhone和Android),它会回答以下类似问题:
1. “讲个笑话”,
2. “什么是月季”,
3. “今天北京到上海的火车”,
4. “明天农历”,
5. “天为什么是蓝色的”
6. ......
### 现在体验
下载[客户端](https://github.com/javalovercn/client),点击“演示帐号”按钮,登录后,点击“语音”输入语音指令即可。
如果安卓版没有语音应答,可能是没有支持中文的TTS,下载安装中文TTS到手机。
具体开发过程如下。
### 开通图录机器人开发帐号
图灵机器人开发帐号,[tuling123.com](http://www.tuling123.com)。
注意:选择接入场景为【自定义】,不要选择【微信机器人】,【QQ机器人】,【智能车载】,【智能家居】。
### 编写代码
打开HomeCenter设计器(本文结尾附安装说明),设计器缺省打开"MyFirst"工程,
点击左侧"My Project/Events/SYS_PROJ_STARTUP",
将下列代码粘贴到编辑区,注意:请将图灵机器人key改为相应注册值
```ruby
#encoding:utf-8
import Java::hc.server.util.Assistant
import Java::hc.server.ui.ProjectContext
import Java::hc.server.util.json.JSONObject
myAssistant = Class.new(Assistant) {
def onVoice(cmd)
json = JSONObject.new()
json.put("key", "1234567890")#注意:请改为你的图灵机器人key
json.put("info", cmd.getText())
#为获取手机GPS位置,需开启工程权限[Location of mobile],详见文档API。将鼠标移至方法上即可获得文档。
#cmd.getLocationLatitude()#纬度
#cmd.getLocationLongitude()#经度
ctx = ProjectContext::getProjectContext()
#json.put("userid", ctx.getLoginID())#可能多个家庭成员共用
json.put("userid", ctx.getMobileSoftUID())#手机重装客户端后,会重新分配SoftUID,但不会出现家庭成员共用
json = json.request("http://www.tuling123.com/openapi/api")
if json.nil?
ctx.sendMovingMsg("网络故障:" + cmd.getText())
ctx.error("网络故障:http://www.tuling123.com/openapi/api")
else
ctx.log("语音命令:[" + cmd.getText() + "],回应:" + json.toString())
#正常回应示例 :{"text":"亲,已帮你找到信息","code":200000,"url":"http://homecenter.mobi/abc"}
if json.has("code") && (json.getInt("code") == 100000 || json.getInt("code") == 200000)
if json.has("text")
ctx.sendVoice(json.getString("text"))
end
if json.has("url")
ctx.goExternalURLWhenInSession(json.getString("url"))
end
return true
end
end
return false
end
}.new
ctx = ProjectContext::getProjectContext()
ctx.registerAssistant(myAssistant)
```
### 添加权限
由于访问云端,需要网络权限,点击[My Project]/[Permission]打开权限面板,可选择下列任一方法:
1. 取消[limit socket/connect]勾选,以允许全部网络连接。
2. 点击“+”图标,添加"tuling123.com"到[host/IPv4/IPv6]。
### 应用工程
点击“Activate”按钮以应用本工程,
### 运行
启动手机端并登录,(此处为服务器帐号,而非演示帐号)
点击手机端首页菜单中的“语音”,输入如下:
1. “讲个笑话”,
2. “什么是月季”,
3. “今天北京到上海的火车”,
4. “明天农历”,
5. “天为什么是蓝色的”
6. ......
## 开发 语音计数器。
将上例的代码全部删除,更改如下:
```ruby
#encoding:utf-8
import java.lang.Integer
import Java::hc.server.util.Assistant
import Java::hc.server.ui.ProjectContext
import Java::hc.server.util.JavaString
myAssistant = Class.new(Assistant) {
def onVoice(cmd)
if cmd.startsWithText("加")
num = Integer.parseInt(cmd.substringText(1))
total = cmd.getClientSession().getAttribute("total")
if total.nil?
cmd.getClientSession().setAttribute("total", JavaString.valueOf(num))
else
num_total = Integer.parseInt(total)
cmd.getClientSession().setAttribute("total", JavaString.valueOf(num_total + num))
end
return true
elsif cmd.startsWithText("减")
num = Integer.parseInt(cmd.substringText(1))
total = cmd.getClientSession().getAttribute("total")
if total.nil?
cmd.getClientSession().setAttribute("total", JavaString.valueOf(num))
else
num_total = Integer.parseInt(total)
cmd.getClientSession().setAttribute("total", JavaString.valueOf(num_total - num))
end
return true
elsif cmd.startsWithText("合计")
total = cmd.getClientSession().getAttribute("total")
if total.nil?
getProjectContext().sendMovingMsg("合计为空")
else
getProjectContext().sendMovingMsg("合计:" + total)
cmd.getClientSession().clearAttribute("total")
end
return true
end
return false
end
}.new
ctx = ProjectContext::getProjectContext()
ctx.registerAssistant(myAssistant)
```
点击“Activate”按钮以应用本工程,
启动手机端并登录,
点击手机端首页菜单中的“语音”按钮,语音输入“加22”、“减16”......(注意:不要输入单数,如'减6',因为语音输入会实际输入'减六',而导致无法计算)。
语音输入“合计”,此时手机便会报出合计,并清空。
## 安装开发环境
有关安装和打开设计器过程,请参阅[用J2SE+CSS开发跨手机平台的云应用--附录-安装开发环境](https://gitee.com/javalovercn/homecenter/blob/master/samples/用J2SE+CSS开发跨手机平台的云应用.md)
了解更多API细节,请参阅[onVoice方法](http://homecenter.mobi/download/javadoc/hc/server/util/Assistant.html#onVoice(hc.server.util.VoiceCommand));或在设计器中,将鼠标移至onVoice上,即可显示文档。
## 版权许可
本文采用「保持署名—非商用」创意共享 4.0 许可证。
只要保持原作者署名和非商用,您可以自由地阅读、分享、修改本书。
详细的法律条文请参见[创意共享](http://creativecommons.org/licenses/by-nc/4.0/)网站。
一键复制
编辑
Web IDE
原始数据
按行查看
历史