文章首发于个人公众号:「阿拉平平」
随着人工智能的兴起,相信大家对智能助理不会感到陌生,比如苹果的 Siri,微软的 Cortana。这些智能助理与我们形影不离,却又触不可及。那么,有没有可以由我们自己定制功能的私人助理呢?
今天和大家分享一个开源的私人助理:Leon。本文演示环境为 Windows x64。
Leon 简介
Leon 是一个开源的私人助理项目。部署后,我们可以通过文本或者语音的方式和它进行互动。
环境准备
- Node.js >= 10
Leon 的核心功能由 Node.js 开发,本文 Node.js 版本为 v12.16.1。
- npm >= 5
Node.js 包管理工具,本文 npm 版本为 6.13.4。
- Python >= 3
Leon 的模块由 Python 编写,本文 Python 版本为 3.6.5。
- Pipenv
Leon 的模块会在虚拟环境中运行。建议安装的 Python 版本在 3.5 以上。
下载安装
下载 develop
分支的代码:
git clone https://github.com/leon-ai/leon.git leon
执行以下命令安装,整个过程会花费一些时间:
# 进入项目目录
cd leon
# 安装
npm install
运行检查命令确保整个安装过程无误:
npm run check
由于还未配置 Leon,所以结果中会提示 warnings
,可以不用理会。
运行启动
安装正常就可以启动了:
# 构建
npm run build
# 启动
npm start
在浏览器中输入 http://localhost:1337
进行访问:
Leon 实践
接下来,我将对 Leon 进行扩展,增加一个获取诗词的功能。
需要说明的是:
- Leon 的全局配置文件为
.env
,示例中未做修改,详情可以查阅官方文档。- Leon 是支持多语言的,但是目前全局配置中仅支持
en
和fr
。所以示例中 answers 和 expressions 的数据文件均以en.json
命名。
包
包是一个目录,可以包含多个模块,位于 leon/packages
下。先新建一个 poem 包,目录结构如下:
poem
|-- __init__.py
|-- config
| `-- config.json
|-- data
| |-- answers
| | `-- en.json
| `-- expressions
| `-- en.json
|-- getpeom.py
`-- version.txt
说明:
poem:包名。
config.json:配置文件。
answers:应答。
expressions:表达式。
getpoem.py:模块。
version.txt:版本号。
配置
模块的配置项可以加到配置文件 config/config.json
里。示例中的接口地址和方法即配置项:
{
"getpoem": {
"url": "https://v1.jinrishici.com/all",
"method": "GET",
"options": {}
}
}
模块
Leon 的功能是通过模块实现的,模块中可以包含多个动作。编辑 getpoem.py,代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import json
import utils
def run(string, entities):
"""Leon peom action"""
r = utils.http(utils.config('method'), utils.config('url'))
res = json.loads(r.text)
content = res['content']
origin = res['origin']
author = res['author']
return utils.output('end', 'getpoem', utils.translate('listpoem', {
'content': content,
'origin': origin,
'author': author
}
)
)
说明:
- 模块中的函数 run 表示一个动作,与表达式对应。
- utils 位于
leon/bridges/python/
,具体用法可以查看源码,这里不做赘述。
表达式
表达式是用来训练 Leon 理解力的数据,位于 data/expressions
下。编辑 en.json,内容如下:
{
"getpoem": {
"run": {
"expressions": [
"give me poem."
]
}
}
}
说明:
- getpoem 是模块名。
- run 是模块中定义的行为。
- expressions 是一个列表,每条表达式都有自己的置信度,表达式内容越多,前端输入可以越模糊。
应答
应答是 Leon 用于提供模块输出的数据,位于 data/answers
下,在 1.0.0-beta.2
版本已支持 HTML 格式。编辑 en.json,内容如下:
{
"getpoem": {
"listpoem": [
"%content%<br><br><div style='text-align:right'>——《%origin%》 %author%</div>"
]
}
}
说明:
- 当调用
utils.translate()
时,会解析应答数据。- 模块传递的变量可通过
%%
进行渲染。
效果演示
运行以下命令进行检查:
npm run train expressions en
没报错的话,重新构建并启动。输入 give me poem
后可以看到:
写在最后
相信能看到这里的小伙伴一定是真爱了,非常感谢你的阅读。最后我会以 Q & A 的形式对文章进行补充以及分享一下踩坑的经历,希望大家在使用 Leon 的过程中可以少踩点坑。
Q: Leon 的交互可以通过文本和语音,但是文章中为什么没有介绍语音的部分?
A:Leon 的语音功能分为 在线 和 离线 两种模式。在线模式需要三方服务的支持,如 Google Cloud 或者 Watson。而离线模式无法在 Windows 平台使用。
Q:能否在虚拟机上体验到 Leon 的离线语音功能?
A:我在 VMware 上测试的结果是:TTS 可以,STT 失败,即能够听到 Leon 应答的声音,但是无法对 Leon 说话。测试环境为 Ubuntu 16.04,且确保麦克风已和虚拟机连接。
Q:运行 npm run check
时提示 ModuleNotFoundError: No module named 'tinydb'
,要怎么解决?
A:运行 npm run postinstall
。
Q:运行 npm run check
时提示 The exported locale is "C.UTF-8" but it is not supported
。
A:系统没有 C.UTF-8
字符集,修改 .env
文件中 LC_ALL
和 LANG
即可。
References
[1] GitHub: https://github.com/leon-ai/leon
[2] 官方文档:https://docs.getleon.ai/#demo