关于Naoqi之家
欢迎访问Naoqi之家,一个提供Pepper/Nao机器人中文开发手册的站点。
http://www.naoqi.net
5.1 目标
我希望让机器人做翻译,但是Naoqi自身是没有翻译API的。
那么我可以调用百度翻译API来实现翻译功能。
5.2 原理
5.2.1 百度翻译API
从百度翻译官方手册,可以查到百度API的调用方式。
http://api.fanyi.baidu.com/api/trans/product/apidoc#languageList
百度API是RESTfulAPI,直接向百度API的URL发出请求,
返回值中就有翻译结果。
返回结果为
{
"from": "en",
"to": "zh",
"trans_result": [{
"src": "apple",
"dst": "苹果"
}]
}
我们在Choregraphe中创建一个Python指令盒子,来调用百度API即可。
5.2.2 举一反三
百度云/阿里云/科大讯飞还有其它很多人工智能API。
调用的原理都是类似的。
5.3 动手实践
5.3.1 申请百度开发者,获取百度翻译APPID和**。
打开http://api.fanyi.baidu.com/api/trans/product/desktop,注册百度开发者。
申请一个通用翻译权限。
5.3.2 在Choregraphe中做出如下指令盒
下面TextEdit盒子中是等待被翻译的英文,Translate是翻译Python指令盒。
Translate指令盒上有两个参数,一个是APPID一个是**。
把你的百度APPID和**填写到这两个参数中。
5.3.3 编写Python代码
在Translate指令盒子中填写以下代码。
代码在页面最后。
5.3.4 见证奇迹
我把翻译结果打印到了日志上。
本章代码
# -*- coding:utf-8 -*-
import httplib
import md5
import urllib
import random
import json
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
#put initialization code here
pass
def onUnload(self):
#put clean-up code here
pass
def onInput_onStart(self, text):
# 从指令盒面板获取appid和secretKey
appid = self.getParameter("appid")
secretKey = self.getParameter("password")
# 填写BAIDU翻译API的参数
httpClient = None
myurl = '/api/trans/vip/translate'
q = text
fromLang = 'en'
toLang = 'zh'
salt = random.randint(32768, 65536)
sign = appid+q+str(salt)+secretKey
m1 = md5.new()
m1.update(sign)
sign = m1.hexdigest()
myurl = myurl+'?appid='+appid+'&q='+urllib.quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign
try:
# 访问BAIDU翻译API的URL
httpClient = httplib.HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', myurl)
response = httpClient.getresponse()
# 从返回中获取翻译结果
translated = response.read()
obj = json.loads(translated)
results = obj.get('trans_result')
if results and len(results) > 0:
words = results[0].get('dst').encode("utf-8")
# 输出翻译结果
self.logger.info(words)
self.onStopped(words)
except Exception, e:
print e
finally:
if httpClient:
httpClient.close()
def onInput_onStop(self):
self.onUnload() #it is recommended to reuse the clean-up as the box is stopped
self.onStopped() #activate the output of the box