yihong0618 / gitblog

People Die, but Long Live GitHub
https://blog.yihong0618.me
MIT License
1.44k stars 135 forks source link

不用 root 使用小爱同学和 ChatGPT 交互折腾记 #258

Open yihong0618 opened 1 year ago

yihong0618 commented 1 year ago

写在前面

项目链接 -> https://github.com/yihong0618/xiaogpt 大多数事儿很简单的一个结论是:这么做有什么用? 但是,没用就不做了么?好玩也是有用之一呀。

下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo.

想法

开始折腾

  1. 最早的 idea 是把小爱同学破解了,破解之后拦截我的对话,如果对话包含 GPT 就用破解的小爱发送请求到 ChatGPT, 再把 ChatGPT 的回复截包,读出来。

    • 遇到最大的困难是小爱怎么破解,搜了一圈发现,小爱是有办法通过串口来 hook 再刷固件的。
    • 但串口是啥?我学习了串口通信,用自己树莓派做实验,去淘宝买 usb2ttl 学会了。但是需要焊接,我又去 B 站刷视频学习,问同事硬件大神如何焊接,学会了焊接。但,他妈的,新的小爱同学把串口通信给封了。
    • 翻到了一个国外破解小爱同学的,能用拆机后的 USB 来烧固件,但我没有 windows,-> 学习老的 macbookpro 2015 刷双系统,尝试给小爱刷机 -> 小米把这个也封了
    • 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。
  2. 第一个方式不太行,尝试去用路由 openwrt 截包再发送,依然失败,我折腾了一下发现 https 获取 payload 还是有些困难的

  3. 转向了 Siri 那么我能不能用 Siri 实现呢?是能的,可以用 Siri -> 捷径 -> 获取你说的话 -> 发送 ChatGPT -> 小爱 or 直接 Siri 自己来

  4. 网友象牙山刘能有一天发他儿子小爱同学的聊天记录,突然灵感来了,我可以用最蠢的轮询,来不断获取最新的聊天记录,如果有新的符合要求我就发送给 ChatGPT --> 再用 tts 让小爱同学朗读,但因为朗读需要时间,所以轮询也没那么笨了。

实现

准备

  1. ChatGPT id
  2. 小爱音响
  3. 能正常联网的环境或 proxy
  4. python3.8+

使用

  1. pip install -r requirements.txt
  2. 参考 MiService 项目 README 并在本地 terminal 跑 micli list 拿到你音响的 DID 成功 别忘了设置 export MI_DID=xxx 这个 MI_DID 用
  3. 参考 revChatGPT 项目 README 配置 chatGPT 的 config
  4. run python xiaogpt.py --hardware ${your_hardware} hardware 你看小爱屁股上有型号,输入进来
  5. 跑起来之后就可以问小爱同学问题了,“帮我回答开头的问题” 会发送一份给 ChatGPT 然后小爱同学用 tts 回答

总结

彩蛋

image

LukeWJ commented 1 year ago

我有一个二傻子斐讯R1音箱,看看能不能搞出来

yihong0618 commented 1 year ago

现在不用抓包了,修改了文章

peterjx19 commented 1 year ago

哈哈,直接做个APP,TTS做交互更简单,技术也成熟

auzeonfung commented 1 year ago

我有一个二傻子斐讯R1音箱,看看能不能搞出来

期待好消息😃

NeoSmithX commented 1 year ago

有熬夜做一个傻儿子出来玩的冲动,哈哈哈😂

tonyqus commented 1 year ago

翻到了一个国外破解小爱同学的,[能用拆机后的 USB 来烧固件](https://github.com/duhow/xiaoai-patch/blob/master/research/lx06/install.md),但我没有 windows,-> 学习老的 macbookpro 2015 刷双系统,尝试给小爱刷机 -> 小米把这个也封了

这方式小米是怎么封的?新固件不让用了?

yihong0618 commented 1 year ago

对,新的版本这个暂时不行

wsjq5477 commented 1 year ago

确实是个很有意思的项目!生命不息,折腾不止。 如果用NAS替代PC做中转,上面跑MiService截音响,这个想法是可行的嘛

yihong0618 commented 1 year ago

@wsjq5477 可行,但是不要 mute-xiaomi

wsjq5477 commented 1 year ago

请教下为啥不加mute-xiaomi呢,我试了下加不加mute-xiaomi,小爱都只会回答自己的答案,但是终端会显示出gpt的答案

yihong0618 commented 1 year ago

会频繁请求 api, 容易被 ban 要是一直跑

imkingcn commented 1 year ago

大佬们,能实现和小度交互么? https://juejin.cn/post/7203685609654550588

jihan-socool commented 1 year ago

我有一个二傻子斐讯R1音箱,看看不能搞出来 斐讯可以刷,但是体验效果不好,更别说交互chatgpt了

BussanQ commented 1 year ago

@yihong0618 请问下放小猪佩奇是什么流程😊

yihong0618 commented 1 year ago

@yihong0618 请问下放小猪佩奇是什么流程😊

小爱同学,帮我播放小猪佩奇

BussanQ commented 1 year ago

@yihong0618 是小爱同学语音读的节目吗?我以为是和小米盒子联动播放视频,希望能通过关键词播放某一集的剧情。。

yihong0618 commented 1 year ago

是的。

jjp9624022 commented 1 year ago

可以用openwrt获取小爱设备突发特定流量后轮询

YuanZhencai commented 1 year ago

之前搞天猫精灵,发现提问题前一定需要某些语料然后才会回调接口,相信小爱也是一样的吧?怎么保持小爱可以一直说话,不需要语料?所以关键点是不断轮询吗?

yihong0618 commented 1 year ago

tonyqus commented 1 year ago

你们谁在墙内试过亚马逊Echo智能音箱?我基本放弃破解国内的智能音箱了。

yihong0618 commented 1 year ago

echo 有人做出来了

ryan4yin commented 1 year ago

哈哈,yihong 佬也入了硬件的坑,我去年底开始折腾硬件,发现硬件真的好玩

deadjoker commented 1 year ago

关注这个有段时间,一直没能上手做。有个疑问,这个脚本我要跑在跟小爱同一个网络环境下么?

yihong0618 commented 1 year ago

@deadjoker 不需要。

deadjoker commented 1 year ago

@yihong0618 如果我希望多个小爱音箱都能够使用chatgpt的话,有没有方法只跑一个脚本呢?还是必须得多个环境跑多个脚本

yihong0618 commented 1 year ago

可以同环境部署多个吧

goofegg commented 1 year ago

大神,你能写个手把手的流程就好了,才能让很多小白能去尝试。 你这个过程省略了好多细节,估计和你同级别的大牛才能看得懂操作起来。

SwartzMss commented 1 year ago

大神,你能写个手把手的流程就好了,才能让很多小白能去尝试。 你这个过程省略了好多细节,估计和你同级别的大牛才能看得懂操作起来。

直接看视频就行。。还是保姆级别的。。。我在做的过程里面就遇到了一个ptython 版本的问题,其他的都是一次过。。

但是呢 是可以用,但是体验感不是很好

qingqingjiayuan6 commented 1 year ago

我看了你的教学视频,非常感兴趣,手里还没有小米音箱,准备买一个,请问现在购买的小米音箱Pro 型号是LX6,也可以按照你提供的方法,使用小爱同学和ChatGPT交互吗?小米音箱有没有版本要求?必须是哪个版本以下的才能按照你的方法做,我担心新购买的音箱,系统版本不对,无法实现教程的内容,谢谢!

SwartzMss commented 1 year ago

我看了你的教学视频,非常感兴趣,手里还没有小米音箱,准备买一个,请问现在购买的小米音箱Pro 型号是LX6,也可以按照你提供的方法,使用小爱同学和ChatGPT交互吗?小米音箱有没有版本要求?必须是哪个版本以下的才能按照你的方法做,我担心新购买的音箱,系统版本不对,无法实现教程的内容,谢谢!

我就是新买的 可以 还是蛮简单的。。。 其实我有做一个类似的视频,但是国内的限制太多了

Enchner commented 1 year ago

我在Windows系统上获取不到小米音箱的DID

liuwx2010 commented 1 year ago

请问,运行了以后,接受不到小爱的消息是什么原因?

yihong0618 commented 1 year ago

有更多的报错信息么?@Enchner @liuwx2010

liuwx2010 commented 1 year ago

@yihong0618 没有报错信息,界面上就显示的请用'帮我'什么什么的,然后就没有了。和小爱说话,也打不出任何的消息

yihong0618 commented 1 year ago

添加 arg --verbose

eason78 commented 1 year ago

--mute_xiaoai 这个参数不能使用,一用就报错 MinaService里不存在xxx方法 例如不存在 player_get_status 不存在player_pause 我去查了源码的确没有

这个项目是不是有点bug

yihong0618 commented 1 year ago

--mute_xiaoai 这个参数不能使用,一用就报错 MinaService里不存在xxx方法 例如不存在 player_get_status 不存在player_pause 我去查了源码的确没有

这个项目是不是有点bug

  1. pip uninstall miservice
  2. pip install -U miservice_fork
  3. 以后 bug 建议在该项目的 issue 下留言,那样大家都能看到,你搜下这个,里面也有人提过
reactphao commented 1 year ago

我遇到了问题, 但是尝试下来无法解决 python3 的环境 。 在MiService 项目中运行如下命令 ./micli.py list 或者 python3 ./micli.py list 或者 python3 micli.py list。 给出如下的报错。 `xception on login 2330087479: Cannot connect to host sts.api.io.mi.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)')] Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 980, in _wrap_create_connection return await self._loop.create_connection(*args, **kwargs) # type: ignore[return-value] # noqa ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/base_events.py", line 1112, in create_connection transport, protocol = await self._create_connection_transport( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/base_events.py", line 1145, in _create_connection_transport await waiter File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/sslproto.py", line 574, in _on_handshake_complete raise handshake_exc File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/sslproto.py", line 556, in _do_handshake self._sslobj.do_handshake() File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py", line 979, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/Users/pdx/wk/AI/小爱AI/MiService/miservice/miaccount.py", line 74, in login serviceToken = await self._securityTokenService( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/pdx/wk/AI/小爱AI/MiService/miservice/miaccount.py", line 114, in _securityTokenService async with self.session.get( File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/client.py", line 1141, in aenter self._resp = await self._coro ^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/client.py", line 536, in _request conn = await self._connector.connect( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 540, in connect proto = await self._create_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 901, in _createconnection , proto = await self._create_direct_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 1206, in _create_direct_connection raise last_exc File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 1175, in _create_direct_connection transp, proto = await self._wrap_create_connection( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 982, in _wrap_create_connection raise ClientConnectorCertificateError(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host sts.api.io.mi.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)')] Error https://api.io.mi.com/app/home/device_list: Login failed` 求解

yihong0618 commented 1 year ago

我遇到了问题, 但是尝试下来无法解决 python3 的环境 。 在MiService 项目中运行如下命令 ./micli.py list 或者 python3 ./micli.py list 或者 python3 micli.py list。 给出如下的报错。 `xception on login 2330087479: Cannot connect to host sts.api.io.mi.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)')] Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 980, in _wrap_create_connection return await self._loop.create_connection(*args, **kwargs) # type: ignore[return-value] # noqa ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/base_events.py", line 1112, in create_connection transport, protocol = await self._create_connection_transport( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/base_events.py", line 1145, in _create_connection_transport await waiter File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/sslproto.py", line 574, in _on_handshake_complete raise handshake_exc File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/asyncio/sslproto.py", line 556, in _do_handshake self._sslobj.do_handshake() File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/ssl.py", line 979, in do_handshake self._sslobj.do_handshake() ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)

The above exception was the direct cause of the following exception:

Traceback (most recent call last): File "/Users/pdx/wk/AI/小爱AI/MiService/miservice/miaccount.py", line 74, in login serviceToken = await self._securityTokenService( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/pdx/wk/AI/小爱AI/MiService/miservice/miaccount.py", line 114, in _securityTokenService async with self.session.get( File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/client.py", line 1141, in aenter self._resp = await self._coro ^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/client.py", line 536, in _request conn = await self._connector.connect( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 540, in connect proto = await self._create_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 901, in _createconnection , proto = await self._create_direct_connection(req, traces, timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 1206, in _create_direct_connection raise last_exc File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 1175, in _create_direct_connection transp, proto = await self._wrap_create_connection( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/aiohttp/connector.py", line 982, in _wrap_create_connection raise ClientConnectorCertificateError(req.connection_key, exc) from exc aiohttp.client_exceptions.ClientConnectorCertificateError: Cannot connect to host sts.api.io.mi.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:992)')] Error https://api.io.mi.com/app/home/device_list: Login failed` 求解

ssl 问题

  1. 尝试不用 vpn
  2. 尝试换个网络,比如手机热点
reactphao commented 1 year ago

同上SSL问题。 1.家庭网以及个人热点都连接尝试了 命令执行: ./micli.py list ./micli.py: line 1: from: command not found ./micli.py: line 6: syntax error: unexpected end of file 查看目录 ls LICENSE build miservice requirements-dev.txt setup.py README.md micli.py miservice_fork.egg-info requirements.txt 换命令执行 python3 micli.py list或者 python3 ./micli.py list

执行和上述结果相同 报错SSL。

执行前置: 确定下载了依赖, 按照文档配置了账号密码export..... 以及账号在app登陆,账号密码没错。 电脑蓝牙已连接音响

产品LX06 。 大陆地区。

yihong0618 commented 1 year ago

ssl 问题

  1. 尝试不用 vpn
  2. 尝试换个网络,比如手机热点

ssl 问题

尝试不用 vpn 尝试换个网络,比如手机热点

liuwx2010 commented 1 year ago

添加 arg --verbose

@yihong0618 我添加了,没有任何错误信息,下面是详细情况

Running xiaogpt now, 用帮我/请回答开头来提问 或用开始持续对话开始持续对话 [03/31/23 00:45:29] DEBUG Now listening xiaoai new xiaogpt.py:91 message timestamp:
1680237928131
[03/31/23 00:45:30] DEBUG Now listening xiaoai new xiaogpt.py:91 message timestamp:
1680237928131
[03/31/23 00:45:31] DEBUG Now listening xiaoai new xiaogpt.py:91 message timestamp:
1680237928131

Devenke6 commented 1 year ago

为什么不直接搞一个脚本接入安卓语音助手?这样一个更简单吧,小爱只是一个回复,手机貌似可以接入更多,目前只有iPhone有捷径,安卓貌似现在只有tasker太鸡了

SummerXinBing commented 1 year ago

@qingqingjiayuan6 @SwartzMss 请问教程视频的链接在哪里?麻烦发一下

yunzhongjushi2 commented 1 year ago

我觉得AI音箱的主要作用还是它的6个麦克风的触发和声音收集功能 至于识别转文字(尤其是英文)还是siri最优秀,然后就只剩下GPT调用和回传播放语音了 想通了这个逻辑,还是直接用homepod上的捷径就好

SummerXinBing commented 1 year ago

以下是GPT的回答: GPT回答出错 Error communicating with OpenAI

SummerXinBing commented 1 year ago

这是我的报错,GPT使用不了

metafeng commented 1 year ago

早上看到之后,果断入手一个小爱音响 Play,现在小爱版GPT已经上线了。过程吧,说来也心酸,获取did累个半死,其他都还挺顺溜。感谢大神的折腾笔记。 就是现在 "enable_edge_tts": true 就直接没声音了,不知道咋回事。

yihong0618 commented 1 year ago

早上看到之后,果断入手一个小爱音响 Play,现在小爱版GPT已经上线了。过程吧,说来也心酸,获取did累个半死,其他都还挺顺溜。感谢大神的折腾笔记。

就是现在 "enable_edge_tts": true 就直接没声音了,不知道咋回事。

看看 http server 是否开启了,mac 的话需要点确认