OnlyTL

OnlyTL

让小爱更智能:小爱同学接入ChatGPT

2023-12-02
让小爱更智能:小爱同学接入ChatGPT

小爱同学在现在大模型超速发展的背景下,已经不能称之为一个人工智能助手,在小米的大模型未发力前,小爱同学的对话能力始终是有待提高的。本文将介绍通过开源项目将小爱同学接入目前最强人工智能ChatGPT,来提升小爱同学的可玩性。

效果演示

相关地址

  • xiaogpt-使用小米 AI 扬声器播放 ChatGPT 和其他 LLM

https://github.com/yihong0618/xiaogpt

  • MiService-获取小米设备ID

https://github.com/yihong0618/MiService

  • OpenAI-ChatGPT

OpenAI

  • ChatGLM-国产大模型

智谱AI开放平台

开始☞

主要实现方式是在本地运行xiaogpt项目,就可实现与小爱的对话。

xiaogpt项目介绍

xiaogpt是一个开源项目,旨在帮助用户将小爱同学与ChatGPT及其他大型语言模型(LLM)相结合。通过这个项目,你可以让小爱同学具备更强大的智能对话能力,为用户提供更加丰富和有趣的互动体验。

目前支持的AI类型如下

准备工作

为了实现小爱同学与ChatGPT的结合,需要准备以下条件:

  • 小米AI音箱

  • 能正常联网的环境或代理

  • 需要安装Python环境,3.8以上

我安装的是Python3.9,如果没有的话可以在官网(https://www.python.org/downloads/) 下载安装,安装时记得添加到环境变量。

获取音箱设备ID(MI_DID)

这里借助作者另一开源项目https://github.com/yihong0618/MiService 来获取自己的小爱音箱设备ID。

# 1.安装
pip3 install -U miservice_fork

# 2.导入环境变量,自己的小米账户和密码,windows电脑,如果安装有git,可以通过Git Bash使用export
export MI_USER=<Username>
export MI_PASS=<Password>

# 3.列出自己的设备
micli list

micli list 会列出账号下所有的设备,这里可以通过名称区分出哪一个是小爱音箱的MI_DID。

相关配置

先拉取https://github.com/yihong0618/xiaogpt 代码,可以使用VsCode打开项目,方便后续配置修改,然后通过pip安装

pip install -U --force-reinstall xiaogpt

这里如果网络环境不好,会非常慢,可以自己使用魔法,或者使用阿里的源

# 使用阿里源
pip install library -i <http://mirrors.aliyun.com/pypi/simple/> --trusted-host mirrors.aliyun.com

等待安装完成后,打开项目目录所在文件夹,我这里通过配置文件启动的,也可以使用官方提供的其他启动方式。

  • 官方非配置文件方式

    • pip install -U --force-reinstall xiaogpt

    • 参考我 fork 的 MiService 项目 README 并在本地 terminal 跑 micli list 拿到你音响的 DID 成功 别忘了设置 export MI_DID=xxx 这个 MI_DID 用

    • run xiaogpt --hardware ${your_hardware} --use_chatgpt_api hardware 你看小爱屁股上有型号,输入进来,如果在屁股上找不到或者型号不对,可以用 micli mina 找到型号

    • 跑起来之后就可以问小爱同学问题了,“帮我"开头的问题,会发送一份给 ChatGPT 然后小爱同学用 tts 回答

    • 如果上面不可用,可以尝试用手机抓包,https://userprofile.mina.mi.com/device_profile/v2/conversation 找到 cookie 利用 -cookie '${cookie}' cookie 别忘了用单引号包裹

    • 默认用目前 ubus, 如果你的设备不支持 ubus 可以使用 -use_command 来使用 command 来 tts

    • 使用 -mute_xiaoai 选项,可以快速停掉小爱的回答

    • 使用 -account ${account} --password ${password}

    • 如果有能力可以自行替换唤醒词,也可以去掉唤醒词

    • 使用 -use_chatgpt_api 的 api 那样可以更流畅的对话,速度特别快,达到了对话的体验, openai api, 命令 -use_chatgpt_api

    • 使用 gpt-3 的 api 那样可以更流畅的对话,速度快, 请 google 如何用 openai api 命令 --use_gpt3

    • 如果你遇到了墙需要用 Cloudflare Workers 替换 api_base 请使用 -api_base ${url} 来替换。 请注意,此处你输入的api应该是'https://xxxx/v1'的字样,域名需要用引号包裹

    • 可以跟小爱说 开始持续对话 自动进入持续对话状态,结束持续对话 结束持续对话状态。

    • 可以使用 -tts edge 来获取更好的 tts 能力

    • 可以使用 -use_langchain 替代 -use_chatgpt_api 来调用 LangChain(默认 chatgpt)服务,实现上网检索、数学运算..

    e.g.

    export OPENAI_API_KEY=${your_api_key}
    xiaogpt --hardware LX06 --use_chatgpt_api
    # or
    xiaogpt --hardware LX06 --cookie ${cookie} --use_chatgpt_api
    # 如果你想直接输入账号密码
    xiaogpt --hardware LX06 --account ${your_xiaomi_account} --password ${your_password} --use_chatgpt_api
    # 如果你想 mute 小米的回答
    xiaogpt --hardware LX06  --mute_xiaoai --use_chatgpt_api
    # 使用流式响应,获得更快的响应
    xiaogpt --hardware LX06  --mute_xiaoai --stream
    # 如果你想使用 gpt3 ai
    export OPENAI_API_KEY=${your_api_key}
    xiaogpt --hardware LX06  --mute_xiaoai --use_gpt3
    # 如果你想用 edge-tts
    xiaogpt --hardware LX06 --cookie ${cookie} --use_chatgpt_api --tts edge
    # 如果你想使用 LangChain + SerpApi 实现上网检索或其他本地服务(目前仅支持 stream 模式)
    export OPENAI_API_KEY=${your_api_key}
    export SERPAPI_API_KEY=${your_serpapi_key}
    xiaogpt --hardware Lx06 --use_langchain --mute_xiaoai --stream --openai_key ${your_api_key} --serpapi_api_key ${your_serpapi_key}
    

    使用 git clone 运行

    export OPENAI_API_KEY=${your_api_key}
    python3 xiaogpt.py --hardware LX06
    # or
    python3 xiaogpt.py --hardware LX06 --cookie ${cookie}
    # 如果你想直接输入账号密码
    python3 xiaogpt.py --hardware LX06 --account ${your_xiaomi_account} --password ${your_password} --use_chatgpt_api
    # 如果你想 mute 小米的回答
    python3 xiaogpt.py --hardware LX06  --mute_xiaoai
    # 使用流式响应,获得更快的响应
    python3 xiaogpt.py --hardware LX06  --mute_xiaoai --stream
    # 如果你想使用 gpt3 ai
    export OPENAI_API_KEY=${your_api_key}
    python3 xiaogpt.py --hardware LX06  --mute_xiaoai --use_gpt3
    # 如果你想使用 ChatGLM api
    python3 xiaogpt.py --hardware LX06  --mute_xiaoai --use_glm --glm_key ${glm_key}
    # 如果你想使用 google 的 bard
    python3 xiaogpt.py --hardware LX06  --mute_xiaoai --use_bard --bard_token ${bard_token}
    # 如果你想使用 LangChain+SerpApi 实现上网检索或其他本地服务(目前仅支持 stream 模式)
    export OPENAI_API_KEY=${your_api_key}
    export SERPAPI_API_KEY=${your_serpapi_key}
    python3 xiaogpt.py --hardware Lx06 --use_langchain --mute_xiaoai --stream --openai_key ${your_api_key} --serpapi_api_key ${your_serpapi_key}
    

我是用的配置文件方式,步骤如下

打开项目目录,将xiao_config.json.example 文件复制一份,并改名为xiao_config.json

然后修改其中信息为自己的即可,以下是我的配置文件内容(我使用的ChatGLM,国产的,不需要魔法,ChatGPT同理)

{
  "hardware": "L05B",    # 型号,小爱屁股底下有
  "account": "xxxxx",    #账号
  "password": "xxxxx",   #密码
  "use_glm": true,       
  "glm_key": "xxxxxxxxxxxxxxxxxxxxxxx.xxxxx",   # ChatGLM的APIkey
  "mi_did": "xxxxxx",     #之前获取到的小米设备ID DID
  "use_command": true,
  "mute_xiaoai": true,
  "verbose": false,
  "bot": "glm",
  "tts": "mi",
  "edge_tts_voice": "zh-CN-XiaoxiaoNeural",
  "prompt": "请用100字以内回答",
  "keyword": [
      "请"
  ],
  "change_prompt_keyword": [
      "更改提示词"
  ],
  "start_conversation": "开始持续对话",
  "end_conversation": "结束持续对话",
  "stream": false
}

配置内容的说明如下,可以根据自己情况进行调整,来源于官方

参数

说明

默认值

hardware

设备型号

account

小爱账户

password

小爱账户密码

openai_key

openai的apikey

serpapi_api_key

serpapi的key 参考 https://serpapi.com/

glm_key

chatglm 的 apikey

bard_token

bard 的 token 参考 https://github.com/dsdanielpark/Bard-API

cookie

小爱账户cookie (如果用上面密码登录可以不填)

mi_did

设备did

use_command

使用 MI command 与小爱交互

false

mute_xiaoai

快速停掉小爱自己的回答

true

verbose

是否打印详细日志

false

bot

使用的 bot 类型,目前支持gpt3,chatgptapi和newbing

chatgptapi

tts

使用的 TTS 类型(mi

edge

tts_voice

TTS 的嗓音

zh-CN-XiaoxiaoNeural(edge)

prompt

自定义prompt

请用100字以内回答

keyword

自定义请求词列表

["请"]

change_prompt_keyword

更改提示词触发列表

["更改提示词"]

start_conversation

开始持续对话关键词

开始持续对话

end_conversation

结束持续对话关键词

结束持续对话

stream

使用流式响应,获得更快的响应

false

proxy

支持 HTTP 代理,传入 http proxy URL

""

gpt_options

OpenAI API 的参数字典

{}

bing_cookie_path

NewBing使用的cookie路径,参考https://github.com/acheong08/EdgeGPT#getting-authentication-required获取

也可通过环境变量 COOKIE_FILE 设置

bing_cookies

NewBing使用的cookie字典,参考https://github.com/acheong08/EdgeGPT#getting-authentication-required获取

deployment_id

Azure OpenAI 服务的 deployment ID

参考这个https://github.com/yihong0618/xiaogpt/issues/347#issuecomment-1784410784

api_base

如果需要替换默认的api,或者使用Azure OpenAI 服务

例如:https://abc-def.openai.azure.com/

启动🚀

在项目目录下,执行如下命令,

xiaogpt --config xiao_config.json

输出如上内容就可以开始和小爱对话了,使用请开头的将会发送一份给ChatGPT,小爱会回答来自于ChatGPT的内容。

可以看到,小爱的回答答非所问,ChatGLM可以回答最新的新闻信息。

注意事项

目前已知 LX04、X10A 和 L05B L05C 可能需要使用 -use_command,否则可能会出现终端能输出GPT的回复但小爱同学不回答GPT的情况

我使用的是

结尾

以上就是小爱同学的进化之旅,玩玩还是可以的,如果没有魔法,可以接入国产ChatGLM,也是不错的,不过ChatGLM好像没有流式输出?需要等待响应结束后,小爱才会朗读回答。当然作者也一直在增加不同AI类型的支持,大家可以关注下这个仓库。还有个问题就是在屏蔽原生小爱回答上,我这个型号的小爱屏蔽不是很彻底,大家可以试试自己的。

至此完结🎉