-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
update notes
- 修改 edge-tts 的默认发音人为
zh-CN-XiaoxiaoNeural
(eba4ff7) (#250 )
- 增加VITS文本转语音的支持 (ca3566f) (#248 )
VITS是一个可以通过输入语音数据集训练以克隆声线的AI文本转语音模型(原始项目:https://github.com/jaywalnut310/vits),加入对VITS的支持能够让智能音箱以用户自己喜欢的角色的声线来说话,增添趣味性。
相关配置:
# 基于 VITS 的AI语音合成
VITS:
# 需要自行搭建vits-simple-api服务器:https://github.com/Artrajz/vits-simple-api
# server_url: 服务器url(格式为http://{IP地址}:{端口},不带最后的斜杠),如http://127.0.0.1:23456
# api_key: 若服务器配置了API Key,在此填入
# speaker_id: 说话人ID,由所使用的模型决定
# length: 调节语音长度,相当于调节语速,该数值越大语速越慢。
# noise: 噪声
# noisew: 噪声偏差
# max: 分段阈值,按标点符号分段,加起来大于max时为一段文本。max<=0表示不分段。
# timeout: 响应超时时间(秒),根据vits-simple-api服务器性能不同配置合理的超时时间。
server_url: "http://127.0.0.1:23456"
api_key: "api_key"
speaker_id: 0
length: 1.0
noise: 0.667
noisew: 0.8
max: 50
timeout: 60
相关配置:
# 语音合成服务配置
# 可选值:
# han-tts - HanTTS
# baidu-tts - 百度语音合成(推荐)
# xunfei-tts - 讯飞语音合成
# ali-tts - 阿里语音合成(推荐)
# tencent-tts - 腾讯云语音合成(推荐)
# azure-tts - 微软语音合成
# mac-tts - macOS 系统自带TTS(mac 系统推荐)
# edge-tts - 基于 Edge 的 TTS(推荐)
tts_engine: edge-tts
同时 edge-tts 也支持修改方言和音色:
# 基于 edge 浏览器的在线 TTS 服务
edge-tts:
# 命令行执行 edge-tts --list-voices 可以打印所有音色
# 中文推荐 `zh` 开头的音色
voice: zh-CN-XiaoxiaoNeural
本版本重点支持了 ChatGPT 流式对话和代码高亮,demo 详见这个视频:
【wukong-robot + ChatGPT 实现支持流式对话的智能音箱】 https://www.bilibili.com/video/BV1Bh411g7t2/?share_source=copy_web&vd_source=84877ef432f0e2745d4600027059e155
- 极客模式的默认结束时间从5回合拉长到20回合 (4a5524d)
- 美化气泡排版,实现代码高亮 (63d0e78)
- 增加闲聊插件 (c071590) 见使用说明:https://wukong.hahack.com/#/official?id=gossip
- ChatGPT 支持流式输出,优化响应速度 (53e969e)
- 废弃activeMode(#224);
- 修复极客模式下的若干bug (5d79aca)
- 移除多余的配置信息 (349c97f)
- 支持长内容自动滚动,修复LocalPlayer播放问题 (3121fb3)
OpenAI 超出 token 数量限制后丢弃历史会话。TTS 合成后优先进入播放。
- 修复修改配置后self.player变为None的bug (c00f454)
- 修复OpenAI丢弃历史会话后不会朗读文本的bug (2a6419a)
- 在 OpenAI token 超出限制后丢弃历史会话(#193) (fee700c)
- fix typo of Camera plugin. (#219) (09e896d)
在本次更新,子线程播放队列和提醒插件里的cron规则和interval规则解析代码均由 ChatGPT 辅助生成。特别感谢 ChatGPT 的协助!
- 增加提醒插件。 (a7fb270)
- 为音频播放增加一个子线程队列, 去除wait参数(#208)
- ChatGPT 支持上下文对话(#209, #193) (0068c9a)
- 增加一个 TTS 线程池,使用分句多线程合成的方式加速 TTS 语音合成速度。
新增了 Reminder
官方插件,支持定时提醒和周期式提醒。详见 Reminder文档 。
使用前请确保安装 apscheduler
库:
pip3 install apscheduler
示例:
- 设置定时提醒
- 用户:10分钟后提醒我吃饭。
- 悟空:好的,已为您添加提醒:时间:2023-03-26|13:05:54,事项:吃饭。
- 设置周期提醒
- 用户:每周一上午7点半提醒我起床。
- 悟空:好的,已为您添加提醒:时间:每周一上午七点半, 事项:起床。
- 检查提醒
- 用户:我有多少个提醒?
- 悟空:您当前有2个提醒。第1个提醒内容是时间:2023-03-26|13:05:54,事项:吃饭。第2个提醒内容是时间:每周一上午七点半, 事项:起床。
- 删除提醒
- 用户:删除提醒。
- 悟空:您当前有2个提醒。第1个提醒内容是时间:2023-03-26|13:05:54,事项:吃饭。第2个提醒内容是时间:每周一上午七点半, 事项:起床。要删除哪个提醒呢?
- 用户:第二个。
- 悟空:好的,已删除该提醒。
在 3.4.0 以前,Player 提供了 onCompleted
和 wait
两种方法来支持顺序播放音频,避免发生同时叠加音频播放的问题。然而,这两种方式各有弊端:
-
onCompleted
是完全异步的回调,当有多个音频要组合播放时,就会带来多重回调的问题。# 回调地狱 self.say("hello", onCompleted=\ lambda: self.say("wukong", onCompleted=\ lambda: self.say("robot")))
-
wait
则是阻塞主线程的,当使用这种模式播放音频时,又会导致在播放的时候无法唤醒。
因此,在 3.4.0 ,我们为 Player 加入了一个子线程播放队列,使用生产者-消费者的模式,当有新的音频需要播放时,将会丢进这个队列里交由播放器去按先进先出的方式消费。
这个机制的引入,我们很好的结合了 onCompleted
的不阻塞和 wait
按顺序播放的优点。例如,对于上面的例子,在 3.4.0 后,你可以这么写:
self.say("hello")
self.say("wukong")
self.say("robot")
是不是优雅多了?;)
注意:新的机制引入后,
wait
参数也不再被需要,所以已经被废弃。请大家不要再使用。
加入了 ChatGPT 上下文对话的支持。
- OpenAI 支持设置代理。提供了
proxy
和api_base
两种方式来帮助用户解决 OpenAI 接口无法直接访问的问题。新的配置如下:
openai:
openai_api_key: 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxx'
# 参数指定将生成文本的模型类型。默认情况下,OpenAI 提供了几个模型供您选择,您可以在此处查看。此外,您甚至可以创建自己的模型,但这超出了本教程的范围。https://beta.openai.com/docs/models/overview
model: 'gpt-3.5-turbo'
# 在前面加的一段前缀
prefix: '请用200字回答:'
# 该temperature参数指定响应的不确定性。这意味着该模型更有可能产生创造性的东西,并且可以被认为是模型承担风险并偏离正常反应。将此参数设置为 1 意味着模型将返回它不确定的结果,相比之下,将此参数设置为 0 意味着模型将返回它几乎可以肯定的结果。
temperature: 1
# 该max_tokens参数指定模型允许生成的最大字符数量作为其输出的一部分。您需要为生成的更多字符付费,因此请务必小心使用此参数。
max_tokens: 2000
# 一个可用于代替 temperature 的参数,对应机器学习中 nucleus sampling,如果设置 0.1 意味着只考虑构成前 10% 概率质量的 tokens
top_p: 1.0
# -2.0 ~ 2.0 之间的数字,正值会根据新 tokens 在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性
frequency_penalty: 0.0
# -2.0 ~ 2.0 之间的数字,正值会根据到目前为止是否出现在文本中来惩罚新 tokens,从而增加模型谈论新主题的可能性
presence_penalty: 0.0
stop_ai: 'stop'
# 如果需要代理,反注释下面的配置进行修改
# proxy: '127.0.0.1:1080'
# 如果需要更换 api_base ,反注释下面的配置进行修改
# api_base: "https://api.openai.com/v1/chat"
- 新增 macOS 自带的 TTS 服务(非常快),使用 Mac 电脑的强烈推荐将
tts_engine
改为mac-tts
:
# 语音合成服务配置
# 可选值:
# han-tts - HanTTS
# baidu-tts - 百度语音合成(推荐)
# xunfei-tts - 讯飞语音合成
# ali-tts - 阿里语音合成(推荐)
# tencent-tts - 腾讯云语音合成(推荐)
# azure-tts - 微软语音合成
# mac-tts - macOS 系统自带TTS(mac 系统推荐)
tts_engine: baidu-tts
同时 macOS TTS 也支持修改方言和音色:
# macOS 自带的 TTS 服务
# 注意:仅 macOS 系统可用!
mac-tts:
# 命令行执行 say -v '?' 可以打印所有语音
# 中文推荐 Tingting(普通话)或者 Sinji(粤语)
voice: Tingting
- 最低版本要求升级到 Python 3.7 及以上。使用了风格更优的字符串格式化写法替换了
.format()
语法。使用老版本 Python 的用户请升级。
- 增加 ChatGPT 对话能力支持。通过配置文件中指定 openai 的模型为
gpt-3.5-turbo
或者gpt-3.5-turbo-0301
即可开启 ChatGPT 对话服务。示例:
openai:
openai_api_key: 'sk-xxxxxxxxxxxxxxxxxxxxxxxxxx'
# 参数指定将生成文本的模型类型。默认情况下,OpenAI 提供了几个模型供您选择,您可以在此处查看。此外,您甚至可以创建自己的模型,但这超出了本教程的范围。https://beta.openai.com/docs/models/overview
model: 'gpt-3.5-turbo'
# 在前面加的一段前缀
prefix: '请用200字回答:'
...
备注:两个模型的区别如下:
- gpt-3.5-turbo:ChatGPT 官网所使用的模型;
- gpt-3.5-turbo-0301:OpenAI 在 2023.3.1 发布的新模型,带来了一些改进。不过可能没有老模型稳定。
- openai 新增
prefix
配置,用于在把问题提交给 openai / ChatGPT 前增加一段前缀文本,例如可以利用来限制一下长度 “请用200字回答:” 。 - 增加 OpenAI Whisper ASR 服务,在配置文件中将 ASR 服务指定为
openai
即可。示例:
# 语音识别服务配置
# 可选值:
# baidu-asr - 百度在线语音识别
# xunfei-asr - 讯飞语音识别
# ali-asr - 阿里语音识别
# tencent-asr - 腾讯云语音识别(推荐)
# azure-asr - 微软语音识别
# openai - OpenAI Whisper
asr_engine: openai
- 修复相机插件不展示图片的问题。(#194)
- 为了避免机器人(尤其是OpenAI GPT3)返回过长的结果文本导致 TTS 合成语音失败,在 3.1.0 中我们将自动截断超出 128 个字符的文本。在 3.1.1 中,我们将这个超长截断文本策略作为可选项(默认超长会截断),并将“后面的内容太长了,我就不念了”单独抽成一句语音,方便缓存,减少 TTS 合成耗时。
# 文本超过一定字符数后是否截断
trim_too_long_text: true
max_text_length: 128
- 后台管理端支持折行展示
- 新增 OpenAI GPT3 聊天对话机器人。
使用前请先在 config.yml 中增加如下配置:
# OpenAI(GPT3) 机器人
# 使用科学上网工具到 https://platform.openai.com
# 注册一个账号,获得 openai_api_key 后填到下面的配置中即可
# 缺点:返回速度较慢
openai:
openai_api_key: 'sk-XXXXXXXXXXXXXXXXXX' #请更换为 OpenAI 的 openai_api_key
model: 'text-davinci-003'
#参数指定将生成文本的模型类型。默认情况下,OpenAI 提供了几个模型供您选择,您可以在此处查看。此外,您甚至可以创建自己的模型,但这超出了本教程的范围。https://beta.openai.com/docs/models/overview
#prompt:''
#该prompt参数指定您从模型提供的输入提示,然后模型将自动完成对它的响应。这可以是任何你想要的
temperature: 1
#该temperature参数指定响应的不确定性。这意味着该模型更有可能产生创造性的东西,并且可以被认为是模型承担风险并偏离正常反应。将此参数设置为 1 意味着模型将返回它不确定的结果,相比之下,将此参数设置为 0 意味着模型将返回它几乎可以肯定的结果。
max_tokens: 2000
#该max_tokens参数指定模型允许生成的最大令牌数量作为其输出的一部分。您需要为生成的更多令牌付费,因此请务必小心使用此参数。
top_p: 1.0
#一个可用于代替 temperature 的参数,对应机器学习中 nucleus sampling,如果设置 0.1 意味着只考虑构成前 10% 概率质量的 tokens
frequency_penalty: 0.0
#-2.0 ~ 2.0 之间的数字,正值会根据新 tokens 在文本中的现有频率对其进行惩罚,从而降低模型逐字重复同一行的可能性
presence_penalty: 0.0
#-2.0 ~ 2.0 之间的数字,正值会根据到目前为止是否出现在文本中来惩罚新 tokens,从而增加模型谈论新主题的可能性
stop_ai: 'stop'
然后即可在 config.yml 中修改使用的对话机器人为 openai
:
# 聊天机器人
# 可选值:
# unit - 百度UNIT(推荐)
# openai - OPENAI
# anyq - AnyQ
# tuling - 图灵机器人
robot: openai
- Camera 插件拍照避免念出url。
在 3.0.0 中,wukong-robot 带来了大量更新和 bugfix :
- 新增 Porcupine 离线唤醒引擎,识别准确率相比 snowboy 有显著提升(见 Porcupine 的 benchmark),并且支持在线训练唤醒词(每个账户可免费训练3个)。
- 聊天机器人增加百度UNIT聊天技能,弥补聊天机器人缺少的不足。
- 增加 LifeCycleHandler ,将整个机器人的生命周期关键事件收归到这里处理,方便在里头添加更多业务逻辑。
- 移除极少数人才会用到的勿扰模式唤醒词,不再提供热词激活勿扰模式的开关。
- 增加对行空板的支持,包括提供特别定制的GUI以及摇一摇唤醒能力。
- 修复本地音乐播放器停止播放后,聊天时又会再次播放的bug。
对于老版本用户,更新到 3.0.0 后,如果希望尝试 Porcupine 的离线唤醒功能,可以在配置文件中新增如下配置:
# 热词唤醒机制
# 可选值:
# porcupine(推荐)
# snowboy
detector: porcupine
# porcupine 离线唤醒
# 登录 https://console.picovoice.ai/
# 可以获取 access_key 和训练自己的唤醒词
porcupine:
keyword:
- 'porcupine'
keyword_paths:
# 支持追加多个唤醒词
# 自定义唤醒词请放到 $HOME/.wukong 目录中
# - 'spiderman.ppn'
access_key: '在这里粘贴你的 access_key'
注意你需要先到 https://console.picovoice.ai/ 注册一个账号,获得 access_key
后才能使用 Porcupine 。
完成配置后,你就可以使用唤醒词 porcupine
来唤醒 wukong-robot 。当然,自定义唤醒词也是 OK 的,详见 修改 Porcupine 的唤醒词 。
详见 硬件选购建议-行空板 。
修复服务端保存配置提示YAML解析失败的问题。
- 修复部分Mac OS系统版本号使用semver导致版本号判断出错的问题。
由于 Mac OS 版本的版本号是 semver 格式(例如 10.16.12
),而部分则是非 semver 格式(例如 10.16
),导致 LocalPlayer 在判断操作系统版本时可能会出现问题。
本次更新修复了上述问题。
- 修复勿扰模式不能使用的问题。
- 增加微软 Azure 语音的支持(#170),感谢 @phoenixsfly 。
修复 Player 模块 proc 为空导致的异常。
默认端口号改为 5001 , 避免跟 macOS Monterey 的 AirPlay 端口冲突。
变更原因:
由于 macOS Monterey 的 AirPlay 占用 5000
端口,并且服务默认开启。因此 mac 用户升级上来后,使用
wukong-robot 时会发现无法打开 localhost:5000 后台管理端。因此,本次更新将把 wukong-robot 的
默认端口号改为 5001 。对于老用户,只需要把 ~/.wukong/config.yml 配置里的 port
选项改为 5001
或者其他非 5000
端口即可解决。
修复websocket-client在多线程下的并发问题; 修复讯飞TTS的全局变量未定义的bug。
修复科大讯飞的服务异常; 优化百度ASR的错误日志。
针对 macOS Big Sur 以上的系统暂时移除本地播放器的沉浸模式。
由于 Big Sur 以上 Mac 系统的 pkill 无法正常暂停音频,因此对于 macOS 系统,LocalPlayer 插件改成直接停止播放,不再支持沉浸模式。Linux 系统暂时不受影响。
相机功能优化; 新增勿扰模式控制API。
- 修复 Mac 系统里不支持在后台管理端展示图片的问题;
- 修复 Mac 系统本地音乐播放器切换歌曲后,上一首歌曲卡死的 bug ;
- 管理端
/operate
接口的type
参数支持1
和2
两种新控制类型, 分别支持打开和关闭勿扰模式。type
参数全部取值如下:
取值 | 说明 |
---|---|
0 | 重启 wukong-robot |
1 | 打开勿扰模式 |
2 | 关闭勿扰模式 |
更新图灵机器人API,解决对话异常问题。
增加更多百度 UNIT 的错误捕获日志,以方便定位问题。
将默认唤醒词改为 snowboy ,不再默认使用非通用模型。
由于以前的版本提供的“孙悟空”唤醒词是作者个人训练的非通用模型,对大部分用户而言达不到开箱即用的条件,往往需要自行训练。为了节省用户的配置成本,2.4.1 版本开始,改为使用更为通用的唤醒词 “snowboy” ,提升唤醒成功率。
- 解决了录音会带上
beep_hi
提示音的问题。现在识别到唤醒词后,录制到的用户的语音不会再带上 1 秒左右的beep_hi
提示音。 - 完善配置文件中对于几家语音厂家的服务的使用说明。
几个 ASR / TTS 的选择建议如下:
- 百度(推荐):普通话近场可以用,免费额度为普通话近场 ASR 200万次;TTS 1亿次(百度最为业界良心)。但普通话远场、极速版都需要付费使用。请自行注册个腾讯智能云账户,然后申请自己的appid使用,另外把配置文件里的dev_pid改为1536(已购买了远场和极速版API的土豪请忽略)。
- 腾讯云(推荐):可以用。免费额度为ASR 5000次;TTS 8,000,000字符。请自行注册并使用自己的智能云账户。
- 讯飞:可以用。但讯飞很抠,免费账户只有有500次使用额度。请自行注册讯飞云账户,注意api_secret和api_key的顺序别搞反。
- 阿里云:个人账户不能用,需认证为阿里企业云账户。so……不推荐。
由于百度 UNIT 服务已将 QPS 调整为 1 ,导致很多用户遇到了频率限制(例如 #125)。为了解决这个问题,2.3.0 版本支持配置使用自己的百度 UNIT 账户。
nlu_engine: unit
# 百度 UNIT
unit:
# 在 https://ai.baidu.com/unit 里注册创建一个机器人
# 得到一个机器人 ID ,
# 然后访问下面页面获取 API Key 和 Secret Key:
# https://console.bce.baidu.com/ai/#/ai/unit/app/list
service_id: '你的机器人ID'
api_key: '你的api_key'
secret_key: '你的secret_key'
使用了自己的账户后,账户默认不会带上其他用户训练的第三方 UNIT 技能。可以通过加入 QQ 群(群号:580447290),在群公告中获取最新的技能分享码自行训练需要的技能。
解决无法发送邮件的问题(#119)。
LocalPlayer 技能插件支持播放 wav 格式音频。
- 首页不再定期轮询后端历史聊天记录,而是改为 coroutine 的方式实现,减少了不必要的请求浪费,降低了管理端负载。
- 首页的大图加入了fancybox,支持直接点击会话气泡里的图片查看大图。
- 命中技能的气泡,文本中不再包含
[技能名]
的字样,而是以徽章(badge)的形式展示在气泡右下角。
修改日志 formatter,增加更详细的错误信息。
以前的日志风格:
2020-01-23 03:53:09,551 - robot.AI - INFO - tuling 回答:深圳多云,有点小风,吹着挺舒服的。预计18~25度,当前19℃。空气质量良,不错不错。
现在的日志风格:
2020-01-27 23:28:38,953 - robot.AI - AI.py - chat - line 72 - INFO - tuling 回答:好呀~有什么新鲜事儿了?
新增对 Google AIY Voice Kit 以及 Respeaker 2 Mics HAT 呼吸灯的支持。
Google AIY Voice Kit 上运行效果:https://www.bilibili.com/video/av81173082/
- 按 Voice Kit 上的按钮,可以唤醒 wukong-robot ;
- 支持 Google AIY Voice Kit 及 Respeaker 2 Mics HAT 的呼吸灯特效。
安装配置过程详见:https://wukong.hahack.com/#/mic-choices?id=google-aiy-voice-kit
# 是否展示灯光效果
# 支持 Respeaker 2 Mics 和 Google AIY Voice Kit 两种
# 必须具备相应的硬件和驱动
LED:
enable: true
type: aiy # aiy: Google AIY Voice Kit; respeaker:respeaker 2Mics
从这个版本开始,wukong-robot 的任一插件的命中规则,均可在配置文件中以正则表达式的形式自行扩充。
例如,如果用户希望使用 “芝麻开门” 指令来唤醒电脑(WOL 插件),可以在 config.yml
中,为 WOL 插件的配置增加一个 patterns
配置:
# WOL启动
wol:
ip: '局域网广播地址或指定电脑IP地址'
mac: '电脑MAC地址'
patterns: ['芝麻开门'] # 必须为数组形式
之后即可在唤醒wukong-robot后,实现类似这样的交互:
- 用户:芝麻开门
- 悟空:启动成功
patterns
里面的值允许为正则表达式,以实现更灵活的命中规则。例如,若给 Hass 插件 添加如下的正则表达式:
hass:
url: "http://ip地址" #切记加上http://,ip或者域名为你的homeassistant的主机
port: "8123" # 端口为你的homeassistant的端口和网页端口一样
key: "Bearer XXXXXXX" # 密钥
patterns:
- ".*开.*灯"
- ".*关.*灯"
- ".*灯.*开"
- ".*灯.*开"
那么以下的命令都会触发 Hass 插件的技能:
- 帮我打开灯
- 开灯
- 开下灯
- 把灯开了
- 帮我关灯
- 关灯
- 把灯关了
修复后台管理端空字符串也可以发起无意义交互的问题。
未来已来。wukong-robot 支持全新的唤醒方式:脑机唤醒。
唤醒效果:https://www.bilibili.com/video/av76739580/
使用方式见 脑机 。
自 2.0.0 开始,wukong-robot 的每一个大版本将会使用一个与神话相关的名词作为命名代号。2.0.0 的代号是 “哪吒” 。
- 新增极速版百度ASR,体验前所未有的高速语音识别;
- 将讯飞TTS改为新的流式版接口,不再需要设置 ip 白名单;
- wukong.py 新增
train
命令,支持命令行训练 snowboy 唤醒词。
在 1.9.3 版本中,baidu_yuyin
新增了一个 dev_pid
配置(老用户请自行加入):
# 百度语音服务
# http://yuyin.baidu.com/
baidu_yuyin:
appid: 'APPID' # 建议使用自己的百度语音账户 APPID
api_key: 'API_KEY'
secret_key: 'SECRET_KEY'
dev_pid: 1936 # 1936: 普通话远场,1536:普通话(支持简单的英文识别), 80001:ASR极速版(请使用自己的百度语音账户再使用)
per: 1 # 发音人选择 0:女生;1:男生;3:度逍遥;4:度丫丫
lan: 'zh'
当设为 80001 时,将使用极速版 ASR 。
注意:极速版 ASR 有限额,超出将收费。为了不影响体验,请务必自行注册一个百度语音服务账号,使用自己的 APPID 再使用极速版 ASR 。
科大讯飞已废弃了普通版 TTS 接口,所以在 1.9.3 中,XunfeiTTS 改成了新的流式版 TTS 。
在 1.9.3 中,xunfei_yuyin
的配置项也发生了变更。去除了 asr_api_key
和 tts_api_key
,统一成了 api_key
。
xunfei_yuyin:
appid: 'APPID'
api_key: 'API_KEY' # 语音听写
api_secret: 'API_SECRET'
voice: 'xiaoyan' # 全部可选:https://console.xfyun.cn/services/tts
在 1.9.3 中,wukong.py 新增了一个 train
命令,以实现命令行式训练唤醒词。这给那些没有外接显示器的树莓派用户而言带来了很大的便利。
详见:安装-更新唤醒词。
本次版本感谢 @tonytan1701 贡献了百度极速版 ASR 和 train
命令的 PR 。
新增基于 HanTTS 的本地 TTS 服务,减少了等待 TTS 合成的耗时,并且支持用户自己录制语音!
详见:HanTTS 安装 。
wukong.py 新增 upload 命令,支持独立进程上传 QA 集 ,以避免重建 AnyQ 的 solr 索引时卡住主线程。
在 1.9.0 中,wukong-robot 引入了 AnyQ 作为一种全新的本地聊天机器人的方案。不仅加快了对话的响应速度,用户还可以非常方便地在后台管理端定制和完善更多的问答,并贡献他们的QA集,一起使得 wukong-robot 更加智能!
详见:
移除了 Conversation 类的 play
方法废弃的 volume
参数。
音乐插件要实现调节音量,可以继承 MusicPlayer ,里头提供了直接修改系统音量的方法。
SoxPlayer 支持播放网络音频,以支持 WangYiYun 等插件直接调用并播放远程音乐。
去掉 Player 模块中 Python 3.7 以上才能使用的 subprocess.run
的 encoding
参数,改为兼容 3.5 的 universal_newlines
参数。
-
Player
模块下封装了一个通用的 MusicPlayer 类,提供了暂停、播放、上一首、下一首及音量控制的基本能力。 -
say()
方法新增了wait
参数,可以用于将异步语音提示改为同步语音提示,避免与后面添加的音频混到一起。 - 修改了音量调节的实现,改成了直接修改系统音量。这带来的好处是可以免重新播放,直接修改播放中的音乐的音量。
Player
模块下封装了一个通用的 MusicPlayer 类,提供了暂停、播放、上一首、下一首及音量控制的基本能力。
当你想自己写播放器时,你只需要准备好音乐播放列表,然后就可以调用这个类的构造函数,然后跟其他插件一样实现几个基本方法即可。
一个可供参考的范例是 LocalPlayer 。
为了实现打断 wukong-robot 说话,无论是 say()
方法还是 play()
方法,都是在一个子线程里执行最终的播放的。新手往往会因此遇到一个问题:如果我们连续调两句 say()
方法,我们就会发现第二句会打断前面一句的话,导致第一句话没说全。
# 写法1:错误的用法❌
# 第二句会打断第一句
self.say('你好')
self.say('世界')
在以前,如果你希望做到第一句说完才讲第二句,你可能需要用到 onCompleted
回调:
# 写法2:使用异步回调✅
# 第一句讲完后,自动触发讲第二句的匿名函数
self.say('你好', onCompleted=lambda: self.say('世界'))
但是现在你可以写成这样:
# 写法3:阻塞主进程✅
# 第一句会阻塞主线程直到讲完
# 所以不会被第二句打断
self.say('你好', wait=True)
self.say('世界')
要注意的是第二种写法是异步的,不会阻塞线程。因此在播放过程中,可以实现随时打断;而第三种写法则会阻塞主线程,因此在第一句话播放过程中无法实现打断。当第一个句子较长的时候,长时间无法打断依然会影响体验,这时候应该考虑写成第二种写法。
将科大讯飞的ASR改为新的流式接口。
主仓库有新增依赖,更新后请在主仓库目录执行 pip3 install -r requirements.txt
安装下依赖。
- 支持LRU缓存自清理;
- chat接口支持返回音频URL。
从 1.6.9 开始,wukong-robot 支持了缓存 LRU 自清理。自动淘汰删除久未使用的缓存,可以将缓存目录控制在一定的体积以内,避免造成过多的空间浪费。你可以在配置文件中配置缓存的淘汰策略:
# 是否定期清理temp目录下的缓存音频
lru_cache:
enable: true # true: 开启; false: 关闭
days: 7 # 清理超过多少天没有使用的文件
/chat
接口新增了 audio
返回值,支持返回音频的 URL :
参数名 | 说明 |
---|---|
code | 返回码。0:成功;1:失败 |
message | 结果说明 |
audio | TTS 音频的 url 地址(注意:不缓存的音频将在一分钟后被自动清理) |
注意:对于不缓存的音频(cache
值为 False
的情况下),一分钟后该音频将会被自动清理,而不再可用。