yihong0618 / gitblog

People Die, but Long Live GitHub
https://yihong0618.github.io/gitblog/
MIT License
1.42k 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

yunzhongjushi2 commented 1 year ago

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

主要是他的8个麦克风阵列,远距离侦听功能很强,用手机的话距离远一点根本听不到

小爱的语音识别功能尚可,如果可以直接只用他的侦听功能而使用识别更好的程序那就更好了,比如siri中英文都可以

mvphp commented 1 year ago

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

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

可以发到youtuber

yqoo666 commented 1 year ago

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

这是什么意思呢?我有openwrt

yihong0618 commented 1 year ago

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

这是什么意思呢?我有openwrt

那个是失败的。

yqoo666 commented 1 year ago

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

这是什么意思呢?我有openwrt

那个是失败的。

我想接入ChatGPT,可以实现吗大神?

yihong0618 commented 1 year ago

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

这是什么意思呢?我有openwrt

那个是失败的。

我想接入ChatGPT,可以实现吗大神?

你照着 README 就行啊。https://github.com/yihong0618/xiaogpt

jasonestock commented 1 year ago

@yihong0618 大佬,按照你写的MiService这个项目走,碰到错误好几天也没有解决,求解答

root@ecs-xxxxx:/etc/mi/MiService# micli.py list Exception on login xxxxxxxxxxx: 'userId' Traceback (most recent call last): File "/usr/local/lib/python3.10/dist-packages/miservice/miaccount.py", line 71, in login self.token['userId'] = resp['userId'] KeyError: 'userId' Error https://api.io.mi.com/app/home/device_list: Login failed

jin-feng commented 1 year ago

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

解决了吗?

ccccccface commented 1 year ago

Duplicate of #263

hirolee88 commented 1 year ago

在本地 terminal 跑 micli list 拿到你音响的 DID ------拿到的是空的 换成 micli mina 可以

yihong0618 commented 1 year ago

@l568288g 是的

onezero-10 commented 1 year ago

生命在于折腾!👍,天猫精灵有试过吗

yihong0618 commented 1 year ago

生命在于折腾!👍,天猫精灵有试过吗

天猫精灵不可行。

dccmmtop commented 1 year ago

一次就搞成功了,玩的不亦乐乎。谢谢这么好的开源项目。

dccmmtop commented 1 year ago

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

解决了吗?

这是GPT相关的问题,

yihong0618 commented 1 year ago

一次就搞成功了,玩的不亦乐乎。谢谢这么好的开源项目。

My pleasure

kindom2008 commented 1 year ago

https://www.douyin.com/video/7212243333274406177 要是能够这样就更厉害了,谢谢UP主,我现在还总是报错 ,(base) kindom2008@kindomAi:~/THUDM/xiaogpt$ python3 xiaogpt.py --hardware S12A --use_chatgpt_api --mute_xiaoai --stream --enable_edge_tts [05/20/23 15:41:07] INFO Serving on 172.30.215.132:8081 xiaogpt.py:294 Running xiaogpt now, 用帮我/请回答开头来提问 或用开始持续对话开始持续对话

问题:写一首关于幸福的诗? Traceback (most recent call last): File "/home/kindom2008/THUDM/xiaogpt/xiaogpt.py", line 5, in main() File "/home/kindom2008/THUDM/xiaogpt/xiaogpt/cli.py", line 136, in main loop.run_until_complete(miboy.run_forever()) File "/home/kindom2008/miniconda3/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete return future.result() File "/home/kindom2008/THUDM/xiaogpt/xiaogpt/xiaogpt.py", line 466, in run_forever await self.stop_if_xiaoai_is_playing() File "/home/kindom2008/THUDM/xiaogpt/xiaogpt/xiaogpt.py", line 408, in stop_if_xiaoai_is_playing is_playing = await self.get_if_xiaoai_is_playing() File "/home/kindom2008/THUDM/xiaogpt/xiaogpt/xiaogpt.py", line 399, in get_if_xiaoai_is_playing playing_info = await self.mina_service.player_get_status(self.device_id) AttributeError: 'MiNAService' object has no attribute 'player_get_status'

Edgar-Lzxc commented 1 year ago

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

但是app需要自行点击启动,做不到开机就启动,但是docker可以

arbraham commented 1 year ago

大侠,我在这里卡住了“参考 MiService 项目 README 并在本地 terminal 跑 micli list 拿到你音响的 DID 成功”。能否指导下?

  1. 执行这个时报错,说没有requirements,的确在仓库里没有提供这个,是不是漏了? set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890 pip3 install miservice bdd7776fd3cd0c3606491f3ebb0b1f1

2.执行这个时,xiaogpt.py --hardware L05B --use_chatgpt_api --mute_xiaoai --use_command 直接跳到这个Py文件,我只好在VS上点下run,就弹出这个对话框,接下来要做什么呢? image

jinmiao commented 1 year ago

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

这个就是:https://github.com/jinmiao/chatgpt_android

chgblog commented 1 year ago

部署在树莓派4B上流畅度如何呢?支持小爱触屏音箱吗?

yihong0618 commented 1 year ago

呢?支持小爱触屏音箱吗?

小爱触屏音不支持 mute_xiaoai 树莓派4B 没问题。

chgblog commented 1 year ago

谢谢,家里还有一个“Yeelight语音助手”(集成了小爱同学和小冰,就是没有普通版的小爱音响-_-!)我试试哪个好用

chgblog commented 1 year ago

昨天试了下,通过MiService可以给Yeelight语音助手发送文字进行播报,但是用底部的型号运行程序提示找不到这个型号,运行micli mina只返回了小爱触屏音箱的,没有Yeelight语音助手,这个还有办法适应Yeelight语音助手吗?

chgblog commented 1 year ago

现在遇到个问题,使用小爱触屏音箱Pro 8,现在控制台可以显示GPT的回复,但是小爱音响并没有播放回复内容,这个如何解决呢?

yihong0618 commented 1 year ago

现在遇到个问题,使用小爱触屏音箱Pro 8,现在控制台可以显示GPT的回复,但是小爱音响并没有播放回复内容,这个如何解决呢?

加上 —use_command 另外请在项目里提 issue 那样其他人遇到了也容易看到

chgblog commented 1 year ago

谢谢,搞定了。如果可以不用先调用小爱同学再调用chatgpt就更好了

zhangnan1981 commented 1 year ago

非常感谢大神的指导,我从头至尾详细学习了一下,然后实际操作中出现了一点小问题,请大神指导。 输入python xiaogpt.py --hardware L15A --use_chatgpt_api --mute_xiaoai,开始运行 Running xiaogpt now, 用帮我/请回答开头来提问 或用开始持续对话开始持续对话

问题:请问中国足球什么时候能拿到大力神杯? 这些都正常吗,然后出现错误提示如下 Traceback (most recent call last): File "D:\project\xiaomi\xiaogpt\xiaogpt.py", line 5, in main() File "D:\project\xiaomi\xiaogpt\xiaogpt\cli.py", line 153, in main loop.run_until_complete(miboy.run_forever()) File "C:\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 469, in run_forever await self.stop_if_xiaoai_is_playing() File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 411, in stop_if_xiaoai_is_playing is_playing = await self.get_if_xiaoai_is_playing() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 402, in get_if_xiaoai_is_playing playing_info = await self.mina_service.player_get_status(self.device_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'MiNAService' object has no attribute 'player_get_status' 请您指正,诚待回复,不胜感激。

yihong0618 commented 1 year ago

非常感谢大神的指导,我从头至尾详细学习了一下,然后实际操作中出现了一点小问题,请大神指导。

输入python xiaogpt.py --hardware L15A --use_chatgpt_api --mute_xiaoai,开始运行 Running xiaogpt now, 用帮我/请回答开头来提问 或用开始持续对话开始持续对话 问题:请问中国足球什么时候能拿到大力神杯? 这些都正常吗,然后出现错误提示如下 Traceback (most recent call last): File "D:\project\xiaomi\xiaogpt\xiaogpt.py", line 5, in main() File "D:\project\xiaomi\xiaogpt\xiaogpt\cli.py", line 153, in main loop.run_until_complete(miboy.run_forever()) File "C:\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 469, in run_forever await self.stop_if_xiaoai_is_playing() File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 411, in stop_if_xiaoai_is_playing is_playing = await self.get_if_xiaoai_is_playing() ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 402, in get_if_xiaoai_is_playing playing_info = await self.mina_service.player_get_status(self.device_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'MiNAService' object has no attribute 'player_get_status' 请您指正,诚待回复,不胜感激。

pip3 uninstall miservice pip3 install -U miservice_fork

zhangnan1981 commented 1 year ago

非常感谢大神的指导,我从头到尾详细学习了一番,然后实际操作中出现了一点小问题,请大神的指导。

输入python xiaogpt.py --hardware L15A --use_chatgpt_api --mute_xiaoai,开始运行 Running xiaogpt now,用帮我/请回答开头来提问 或用开始持续对话开始持续对话 问题:请问中国足球什么时候能伸大力神杯? 这些都正常吗,然后出现错误提示如下 Traceback (most最近一次调用最后): File "D:\project\xiaomi\xiaogpt\xiaogpt.py", line 5 ,在main()文件“D:\project\xiaomi\xiaogpt\xiaogpt\cli.py”中,第153行,在主loop.run_until_complete(miboy.run_forever())文件“C:\Python311\Lib\asyncio\base_events”中.py”,第 653 行,在 run_until_complete return future.result() ^^^^^^^^^^^^^^^^^ 文件“D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py”,第 469 行,在run_forever中await self.stop_if_xiaoai_is_playing()文件“D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py”,第411行,在stop_if_xiaoai_is_playing中is_playing=await self.get_if_xiaoai_is_playing()^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 文件“D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py”,第 402 行,在 get_if_xiaoai_is_playing 中play_info = 等待 self.mina_service。player_get_status(self.device_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AttributeError: 'MiNAService' 对象没有属性 'player_get_status' 请指正,诚待回复您,不胜感激。

pip3 uninstall miservice pip3 install -U miservice_fork 非常感谢,我试试看哈,原理能简单分析一下吗?

zhangnan1981 commented 1 year ago

pip3 uninstall miservice pip3 install -U miservice_fork 执行完这两条命令后,情况如下, python xiaogpt.py --hardware L15A --use_chatgpt_api --mute_xiaoai Traceback (most recent call last): File "D:\project\xiaomi\xiaogpt\xiaogpt.py", line 2, in from xiaogpt.cli import main File "D:\project\xiaomi\xiaogpt\xiaogpt\cli.py", line 5, in from xiaogpt.xiaogpt import MiGPT File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 22, in from miservice import MiAccount, MiIOService, MiNAService, miio_command ImportError: cannot import name 'MiAccount' from 'miservice' (unknown location) 请指导

yihong0618 commented 1 year ago

pip3 uninstall miservice pip3 install -U miservice_fork 执行完这两条命令后,情况如下, python xiaogpt.py --hardware L15A --use_chatgpt_api --mute_xiaoai Traceback (most recent call last): File "D:\project\xiaomi\xiaogpt\xiaogpt.py", line 2, in from xiaogpt.cli import main File "D:\project\xiaomi\xiaogpt\xiaogpt\cli.py", line 5, in from xiaogpt.xiaogpt import MiGPT File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 22, in from miservice import MiAccount, MiIOService, MiNAService, miio_command ImportError: cannot import name 'MiAccount' from 'miservice' (unknown location) 请指导

python3 -m pip install -U miservice_fork

另外,请最好不要在这里留 issue, 在 xiaogpt 项目里留

zhangnan1981 commented 1 year ago

好的好的,一定注意,十分感谢

puke3615 commented 1 year ago

有办法监听到米家传感器设备么? 如果这条路打通了,再配合ChatGPT,智能家居就能迎来每个程序员的高光时刻。

yihong0618 commented 1 year ago

有办法监听到米家传感器设备么? 如果这条路打通了,再配合ChatGPT,智能家居就能迎来每个程序员的高光时刻。

理论上可以

chengliangluo commented 1 year ago

大佬,关于音箱操作的哪些api文档你是在哪里找到啊?我扒了你的mute api,但是感觉并没有mute掉, 只响应了个 “Msg has been successfully proxy to the device, this service is a simple proxy, if you encounter any problems pls contact ROM's developers directly!!!”

yihong0618 commented 1 year ago

大佬,关于音箱操作的哪些api文档你是在哪里找到啊?我扒了你的mute api,但是感觉并没有mute掉, 只响应了个 “Msg has been successfully proxy to the device, this service is a simple proxy, if you encounter any problems pls contact ROM's developers directly!!!”

没有 api 文档。。。 参考 README 有些型号不能 mute, 另外 issue 在 xiaogpt 项目下留言比较好,那样大家也都能看见

ericliyee commented 1 year ago

micli mina返回为空 我的设备是小爱音响 型号为MDZ-25-DA

d112848962 commented 1 year ago

我型号是MDZ-25-DA是不是不支持呀

yihong0618 commented 1 year ago

micli mina返回为空 我的设备是小爱音响 型号为MDZ-25-DA

好像不支持这个型号

yihong0618 commented 1 year ago

我型号是MDZ-25-DA是不是不支持呀

是。。。

yihong0618 commented 11 months ago

现在很多设计都改变了,有点惊讶我 2 月份就实现了;

duolabmeng6 commented 10 months ago

怪不得 MDZ-25-DA不行

duolabmeng6 commented 10 months ago

下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. 这句话是什么意思啊...repo在哪里

yihong0618 commented 10 months ago

下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. 这句话是什么意思啊...repo在哪里

就是 xiaogpt 意思是不用原来逆向的方案了,用的是 api with key 的方案

duolabmeng6 commented 10 months ago

下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. 这句话是什么意思啊...repo在哪里

就是 xiaogpt 意思是不用原来逆向的方案了,用的是 api with key 的方案

我搞了好久 MDZ-25-DA 这个型号确实不行把 我测试了可以播放声音..获取文本不行

yihong0618 commented 10 months ago

下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. 这句话是什么意思啊...repo在哪里

就是 xiaogpt 意思是不用原来逆向的方案了,用的是 api with key 的方案

我搞了好久 MDZ-25-DA 这个型号确实不行把 我测试了可以播放声音..获取文本不行

印象中这型号是不行的。。。。

duolabmeng6 commented 10 months ago

我想问一下现在这个项目的方案还是网络获取嘛就是读一个小米账号音箱的记录 这个方式我测试的延迟比较大 还是你这个项目的话是读的本地的一个数据库啊会比较快一点

yihong0618 commented 10 months ago

我想问一下现在这个项目的方案还是网络获取嘛就是读一个小米账号音箱的记录 这个方式我测试的延迟比较大 还是你这个项目的话是读的本地的一个数据库啊会比较快一点

是的。其实延迟可以改 sleep 时间的,但会频繁请求不建议

duolabmeng6 commented 10 months ago

我想问一下现在这个项目的方案还是网络获取嘛就是读一个小米账号音箱的记录 这个方式我测试的延迟比较大 还是你这个项目的话是读的本地的一个数据库啊会比较快一点

是的。其实延迟可以改 sleep 时间的,但会频繁请求不建议

大佬有群吗 加一个讨论