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

写在前面

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

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

想法

  • 从 ChatGPT 刚上第二周开始,我弄了个账号,后来发现一个很好玩的项目 ChineseAiDungeonChatGPT –> 用 ChatGPT 玩 DND, 我突然想我能语音就更有带入感了。
  • 因为之前折腾 blue 时候了解了一些小米 IOT 设备的交互 tts, 我觉得我用一些方式是可以实现的
  • 不过从想法到可用确实经历了不少

开始折腾

  1. 最早的 idea 是把小爱同学破解了,破解之后拦截我的对话,如果对话包含 GPT 就用破解的小爱发送请求到 ChatGPT, 再把 ChatGPT 的回复截包,读出来。
  • 遇到最大的困难是小爱怎么破解,搜了一圈发现,小爱是有办法通过串口来 hook 再刷固件的。
  • 但串口是啥?我学习了串口通信,用自己树莓派做实验,去淘宝买 usb2ttl 学会了。但是需要焊接,我又去 B 站刷视频学习,问同事硬件大神如何焊接,学会了焊接。但,他妈的,新的小爱同学把串口通信给封了。
  • 翻到了一个国外破解小爱同学的,能用拆机后的 USB 来烧固件,但我没有 windows,-> 学习老的 macbookpro 2015 刷双系统,尝试给小爱刷机 -> 小米把这个也封了
  • 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。
  1. 第一个方式不太行,尝试去用路由 openwrt 截包再发送,依然失败,我折腾了一下发现 https 获取 payload 还是有些困难的
  2. 转向了 Siri 那么我能不能用 Siri 实现呢?是能的,可以用 Siri -> 捷径 -> 获取你说的话 -> 发送 ChatGPT -> 小爱 or 直接 Siri 自己来
  3. 网友象牙山刘能有一天发他儿子小爱同学的聊天记录,突然灵感来了,我可以用最蠢的轮询,来不断获取最新的聊天记录,如果有新的符合要求我就发送给 ChatGPT –> 再用 tts 让小爱同学朗读,但因为朗读需要时间,所以轮询也没那么笨了。

实现

  • 先实现不断拿对话历史
  • 测试 revChatGPT 可行
  • 利用 MiService call 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 回答

总结

  • 完成那一刻确实挺开心,但过程中发现了几个好玩的博客,惊讶了做 revChatGPT 的学生真牛逼,学会了焊接,开始发现硬件也挺有意思的,不断折腾的过程沮丧有一些,但更多的是学习新东西带来的兴奋感。
  • 拆机发现,小爱同学内部做工确实不错
  • 折腾过程中的感受,将来肯定有一天这些智能音箱厂商也会训练大模型,将彻底改变智能家居,仿佛看到了未来

彩蛋

image

👍 73🎉 8❤️ 10

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

yihong0618

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

peterjx19

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

yukiinagato

> 我有一个二傻子斐讯R1音箱,看看能不能搞出来 期待好消息😃

NeoSmithX

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

tonyqus

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

yihong0618

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

wsjq5477

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

yihong0618

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

wsjq5477

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

yihong0618

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

imkingcn

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

jihan-socool

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

BussanQ

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

yihong0618

> @yihong0618 请问下放小猪佩奇是什么流程😊 小爱同学,帮我播放小猪佩奇

BussanQ

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

jjp9624022

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

YuanZhencai

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

tonyqus

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

ryan4yin

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

deadjoker

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

deadjoker

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

yihong0618

可以同环境部署多个吧

goofegg

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

SwartzMss

> 大神,你能写个手把手的流程就好了,才能让很多小白能去尝试。 你这个过程省略了好多细节,估计和你同级别的大牛才能看得懂操作起来。 直接看视频就行。。还是保姆级别的。。。我在做的过程里面就遇到了一个ptython 版本的问题,其他的都是一次过。。 但是呢 是可以用,但是体验感不是很好

qingqingjiayuan6

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

SwartzMss

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

Enchner

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

liuwx2010

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

yihong0618

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

liuwx2010

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

eason78

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

yihong0618

> --mute_xiaoai 这个参数不能使用,一用就报错 MinaService里不存在xxx方法 例如不存在 player_get_status 不存在player_pause 我去查了源码的确没有 > > 这个项目是不是有点bug 1. pip uninstall miservice 2. pip install -U miservice_fork 3. 以后 bug 建议在该项目的 issue 下留言,那样大家都能看到,你搜下这个,里面也有人提过

reactphao

我遇到了问题, 但是尝试下来无法解决 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 _create_connection _, 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

> 我遇到了问题, 但是尝试下来无法解决 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 _create_connection _, 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

同上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

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

liuwx2010

> 添加 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

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

SummerXinBing

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

yunzhongjushi2

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

SummerXinBing

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

SummerXinBing

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

metafeng

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

yihong0618

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

yunzhongjushi2

> 为什么不直接搞一个脚本接入安卓语音助手?这样一个更简单吧,小爱只是一个回复,手机貌似可以接入更多,目前只有iPhone有捷径,安卓貌似现在只有tasker太鸡了 主要是他的8个麦克风阵列,远距离侦听功能很强,用手机的话距离远一点根本听不到 小爱的语音识别功能尚可,如果可以直接只用他的侦听功能而使用识别更好的程序那就更好了,比如siri中英文都可以

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

> 可以用openwrt获取小爱设备突发特定流量后轮询 这是什么意思呢?我有openwrt

yihong0618

> > 可以用openwrt获取小爱设备突发特定流量后轮询 > > 这是什么意思呢?我有openwrt 那个是失败的。

> > > 可以用openwrt获取小爱设备突发特定流量后轮询 > > > > > > 这是什么意思呢?我有openwrt > > 那个是失败的。 我想接入ChatGPT,可以实现吗大神?

yihong0618

> > > > 可以用openwrt获取小爱设备突发特定流量后轮询 > > > > > > > > > 这是什么意思呢?我有openwrt > > > > > > 那个是失败的。 > > 我想接入ChatGPT,可以实现吗大神? 你照着 README 就行啊。https://github.com/yihong0618/xiaogpt

jasonestock

@yihong0618 大佬,按照你写的[MiService](https://github.com/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

> 以下是GPT的回答: GPT回答出错 Error communicating with OpenAI 解决了吗?

hirolee88

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

onezero-10

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

yihong0618

> 生命在于折腾!👍,天猫精灵有试过吗 天猫精灵不可行。

dccmmtop

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

dccmmtop

> > 以下是GPT的回答: GPT回答出错 Error communicating with OpenAI > > 解决了吗? 这是GPT相关的问题, - 确保你能访问 chatGPT, 最好梯子开全局代理,选择非亚洲节点 - 确保你的token正常,也就是没有过期,没有超限

yihong0618

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

kindom2008

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 <module> 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

> 哈哈,直接做个APP,TTS做交互更简单,技术也成熟 但是app需要自行点击启动,做不到开机就启动,但是docker可以

arbraham

大侠,我在这里卡住了“参考 [MiService](https://github.com/Yonsm/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 <img width="831" alt="bdd7776fd3cd0c3606491f3ebb0b1f1" src="https://github.com/yihong0618/gitblog/assets/1009896/a863a7f8-d7eb-4d6b-ac0e-68dec3be263d"> 2.执行这个时,xiaogpt.py --hardware L05B --use_chatgpt_api --mute_xiaoai --use_command 直接跳到这个Py文件,我只好在VS上点下run,就弹出这个对话框,接下来要做什么呢? ![image](https://github.com/yihong0618/gitblog/assets/1009896/5b2503ed-627f-4596-bbf7-d06eed94665f)

jinmiao

> 哈哈,直接做个APP,TTS做交互更简单,技术也成熟 这个就是:https://github.com/jinmiao/chatgpt_android

chgblog

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

yihong0618

> 呢?支持小爱触屏音箱吗? 小爱触屏音不支持 mute_xiaoai 树莓派4B 没问题。

chgblog

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

chgblog

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

chgblog

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

yihong0618

> 现在遇到个问题,使用小爱触屏音箱Pro 8,现在控制台可以显示GPT的回复,但是小爱音响并没有播放回复内容,这个如何解决呢? 加上 —use_command 另外请在项目里提 issue 那样其他人遇到了也容易看到

chgblog

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

zhangnan1981

非常感谢大神的指导,我从头至尾详细学习了一下,然后实际操作中出现了一点小问题,请大神指导。 输入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 <module> 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

> ## 非常感谢大神的指导,我从头至尾详细学习了一下,然后实际操作中出现了一点小问题,请大神指导。 > 输入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

> > ## 非常感谢大神的指导,我从头到尾详细学习了一番,然后实际操作中出现了一点小问题,请大神的指导。 > > 输入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

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 <module> from xiaogpt.cli import main File "D:\project\xiaomi\xiaogpt\xiaogpt\cli.py", line 5, in <module> from xiaogpt.xiaogpt import MiGPT File "D:\project\xiaomi\xiaogpt\xiaogpt\xiaogpt.py", line 22, in <module> from miservice import MiAccount, MiIOService, MiNAService, miio_command ImportError: cannot import name 'MiAccount' from 'miservice' (unknown location) 请指导

yihong0618

> 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

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

puke3615

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

yihong0618

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

chengliangluo

大佬,关于音箱操作的哪些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

> 大佬,关于音箱操作的哪些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

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

d112848962

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

yihong0618

> micli mina返回为空 > 我的设备是小爱音响 型号为MDZ-25-DA 好像不支持这个型号

yihong0618

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

yihong0618

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

duolabmeng6

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

yihong0618

> 下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. 这句话是什么意思啊...repo在哪里 就是 xiaogpt 意思是不用原来逆向的方案了,用的是 api with key 的方案

duolabmeng6

> > 下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. 这句话是什么意思啊...repo在哪里 > > 就是 xiaogpt 意思是不用原来逆向的方案了,用的是 api with key 的方案 我搞了好久 MDZ-25-DA 这个型号确实不行把 我测试了可以播放声音..获取文本不行

yihong0618

> > > 下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. 这句话是什么意思啊...repo在哪里 > > > > > > 就是 xiaogpt 意思是不用原来逆向的方案了,用的是 api with key 的方案 > > 我搞了好久 MDZ-25-DA 这个型号确实不行把 我测试了可以播放声音..获取文本不行 印象中这型号是不行的。。。。

duolabmeng6

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

yihong0618

> 我想问一下现在这个项目的方案还是网络获取嘛就是读一个小米账号音箱的记录 这个方式我测试的延迟比较大 还是你这个项目的话是读的本地的一个数据库啊会比较快一点 是的。其实延迟可以改 sleep 时间的,但会频繁请求不建议

duolabmeng6

> > 我想问一下现在这个项目的方案还是网络获取嘛就是读一个小米账号音箱的记录 这个方式我测试的延迟比较大 还是你这个项目的话是读的本地的一个数据库啊会比较快一点 > > > > 是的。其实延迟可以改 sleep 时间的,但会频繁请求不建议 大佬有群吗 加一个讨论

yihong0618

> > > 我想问一下现在这个项目的方案还是网络获取嘛就是读一个小米账号音箱的记录 这个方式我测试的延迟比较大 还是你这个项目的话是读的本地的一个数据库啊会比较快一点 > > > > > > 是的。其实延迟可以改 sleep 时间的,但会频繁请求不建议 > > 大佬有群吗 加一个讨论 没有。。。

duolabmeng6

兄弟我还有另外一个问题 我要怎么禁止掉小爱同学的回答 我读取到我自己说的话的时候 这里有一段时间的延迟 我要停止小爱同学的回答要怎么处理

yihong0618

> 兄弟我还有另外一个问题 我要怎么禁止掉小爱同学的回答 我读取到我自己说的话的时候 这里有一段时间的延迟 我要停止小爱同学的回答要怎么处理 有 —mute 参数,但有些机型不支持,请参考 xiaogpt 的 README 也可以在那里留 issue

duolabmeng6

兄弟 这个停止说话的请求是发到小米服务器的 有没有办法做到本地停止....我想让小爱直接闭嘴 我设置500ms一直调用停止回答 感觉很诡异 哈哈哈哈

duolabmeng6

大佬你的代码我玩起来了 但是无法唤醒我型号是 S12A 请问一下这个是要怎么抓包获取到唤醒的请求啊

duolabmeng6

``` func (mt *MiBot) wakeUp() { w := mt.hardwareCommand(WakeupIndex) mt.miioService.MiotAction(mt.deviceID, actionId(w), []interface{}{WakeupKeyword, 0}) } ``` 这个唤醒不起作用 要怎么调试 我有 智能开关 智能开关可以触发到唤醒 但是不知道如何抓包的...

yihong0618

> S12A S12A 不能用我这个方式唤醒,另外能在 xiaogpt 项目下留 issue 么?那样如果其他人遇到问题也能看到,谢谢

zhuzhuyule

> 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。 @yihong0618 请问这句是啥意思了? 小猪佩奇收费,所以我也在尝试如何让小爱走自己的服务,去自动播放自己的资源列表。

yihong0618

> > 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。 > > @yihong0618 请问这句是啥意思了? 小猪佩奇收费,所以我也在尝试如何让小爱走自己的服务,去自动播放自己的资源列表。 这个不难,是可以的。我有时间写个教程回复你

zhuzhuyule

> > > 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。 > > > > > > @yihong0618 请问这句是啥意思了? 小猪佩奇收费,所以我也在尝试如何让小爱走自己的服务,去自动播放自己的资源列表。 > > 这个不难,是可以的。我有时间写个教程回复你 666, 看了你的简历,哈哈哈,真是大佬呀

yihong0618

> > > > 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。 > > > > > > > > > @yihong0618 请问这句是啥意思了? 小猪佩奇收费,所以我也在尝试如何让小爱走自己的服务,去自动播放自己的资源列表。 > > > > > > 这个不难,是可以的。我有时间写个教程回复你 > > 666, 看了你的简历,哈哈哈,真是大佬呀 现在你可以参考这个 https://origin.v2ex.com/t/982027 但不太成熟,有精力我写个稍微好点的方案。。。

hirolee88

> @yihong0618 大佬,按照你写的[MiService](https://github.com/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 https://github.com/yihong0618/xiaogpt/issues/6#issuecomment-1866617374

yihong0618

> > @yihong0618 大佬,按照你写的[MiService](https://github.com/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 > > > > https://github.com/yihong0618/xiaogpt/issues/6#issuecomment-1866617374 应该是触发风控了,你得本地浏览器登录下小米云

zhuzhuyule

所以一直循环检查是否正在播放,是暂时无解的对吗? 还有就是查看对话记录也是循环检查的,也是无解的对吗?

yihong0618

> 所以一直循环检查是否正在播放,是暂时无解的对吗? 还有就是查看对话记录也是循环检查的,也是无解的对吗? 不是

fencanyan

@yihong0618 请问, 是不是不和小爱音箱在一个局域网也可以用?只要在有网络的地方部署成功就可以用了?

yihong0618

> @yihong0618 请问, 是不是不和小爱音箱在一个局域网也可以用?只要在有网络的地方部署成功就可以用了? 不是,海外 IP 或者 vps 会风控也用不了,其余能用,你可以去 xiaogpt repo 里搜索

jingyibo123

> [能用拆机后的 USB 来烧固件](https://github.com/duhow/xiaoai-patch/blob/master/research/lx06/install.md),但我没有 windows,-> 学习老的 macbookpro 2015 刷双系统,尝试给小爱刷机 -> 小米把这个也封了 大神能说一下怎么个被封法么?

yihong0618

> > [能用拆机后的 USB 来烧固件](https://github.com/duhow/xiaoai-patch/blob/master/research/lx06/install.md),但我没有 windows,-> 学习老的 macbookpro 2015 刷双系统,尝试给小爱刷机 -> 小米把这个也封了 > > 大神能说一下怎么个被封法么? 读不到了

starFelix

> ## 写在前面 > 项目链接 -> https://github.com/yihong0618/xiaogpt 大多数事儿很简单的一个结论是:这么做有什么用? 但是,没用就不做了么?好玩也是有用之一呀。 > > ## 注 > 下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. > > ## 想法 > * 从 ChatGPT 刚上第二周开始,我弄了个账号,后来发现一个很好玩的项目 [ChineseAiDungeonChatGPT](https://github.com/bupticybee/ChineseAiDungeonChatGPT) --> 用 ChatGPT 玩 DND, 我突然想我能语音就更有带入感了。 > * 因为之前折腾 [blue](https://github.com/yihong0618/blue) 时候了解了一些小米 IOT 设备的交互 tts, 我觉得我用一些方式是可以实现的 > * 不过从想法到可用确实经历了不少 > > ## 开始折腾 > 1. 最早的 idea 是把小爱同学破解了,破解之后拦截我的对话,如果对话包含 `GPT` 就用破解的小爱发送请求到 ChatGPT, 再把 ChatGPT 的回复截包,读出来。 > > * 遇到最大的困难是小爱怎么破解,搜了一圈发现,小爱是有办法通过串口来 hook 再刷固件的。 > * 但串口是啥?我学习了串口通信,用自己树莓派做实验,去淘宝买 usb2ttl 学会了。但是需要焊接,我又去 B 站刷视频学习,问同事硬件大神如何焊接,学会了焊接。但,他妈的,新的小爱同学把串口通信给封了。 > * 翻到了一个国外破解小爱同学的,[能用拆机后的 USB 来烧固件](https://github.com/duhow/xiaoai-patch/blob/master/research/lx06/install.md),但我没有 windows,-> 学习老的 macbookpro 2015 刷双系统,尝试给小爱刷机 -> 小米把这个也封了 > * 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。 > > 2. 第一个方式不太行,尝试去用路由 openwrt 截包再发送,依然失败,我折腾了一下发现 https 获取 payload 还是有些困难的 > 3. 转向了 Siri 那么我能不能用 Siri 实现呢?是能的,可以用 Siri -> 捷径 -> 获取你说的话 -> 发送 ChatGPT -> 小爱 or 直接 Siri 自己来 > 4. 网友[象牙山刘能](https://twitter.com/disksing)有一天发他儿子小爱同学的聊天记录,突然灵感来了,我可以用最蠢的轮询,来不断获取最新的聊天记录,如果有新的符合要求我就发送给 ChatGPT --> 再用 tts 让小爱同学朗读,但因为朗读需要时间,所以轮询也没那么笨了。 > > ## 实现 > * 先实现不断拿对话历史 > * 测试 revChatGPT 可行 > * 利用 MiService call tts 可行 > * 剩下就是写代码了 > > ## 准备 > 1. ChatGPT id > 2. 小爱音响 > 3. 能正常联网的环境或 proxy > 4. python3.8+ > > ## 使用 > 1. pip install -r requirements.txt > 2. 参考 [MiService](https://github.com/Yonsm/MiService) 项目 README 并在本地 terminal 跑 `micli list` 拿到你音响的 DID 成功 **别忘了设置 export MI_DID=xxx** 这个 MI_DID 用 > 3. 参考 [revChatGPT](https://github.com/acheong08/ChatGPT) 项目 README 配置 chatGPT 的 config > 4. run `python xiaogpt.py --hardware ${your_hardware}` hardware 你看小爱屁股上有型号,输入进来 > 5. 跑起来之后就可以问小爱同学问题了,“帮我回答开头的问题” 会发送一份给 ChatGPT 然后小爱同学用 tts 回答 > > ## 总结 > * 完成那一刻确实挺开心,但过程中发现了几个好玩的[博客](http://javabin.cn/archives/),惊讶了做 revChatGPT 的学生真牛逼,学会了焊接,开始发现硬件也挺有意思的,不断折腾的过程沮丧有一些,但更多的是学习新东西带来的兴奋感。 > * 拆机发现,小爱同学内部做工确实不错 > * 折腾过程中的感受,将来肯定有一天这些智能音箱厂商也会训练大模型,将彻底改变智能家居,仿佛看到了未来 > > ## 彩蛋 > ![image](https://user-images.githubusercontent.com/15976103/219273665-f8c252aa-0b05-4f18-9028-8cada453aea5.png) 看项目介绍,没能完全了解这个仓库能够提供的能力。可以通过复杂的命令控制家电吗?还是只能通过gpt对话。 另外这个脚本需要持续运行吗?还是说设置成功后就完事不需要运行了。

yihong0618

> > ## 写在前面 > > 项目链接 -> https://github.com/yihong0618/xiaogpt 大多数事儿很简单的一个结论是:这么做有什么用? 但是,没用就不做了么?好玩也是有用之一呀。 > > ## 注 > > 下文中 revChatGPT 方案废弃了,全部改用 API, 请参考 repo. > > ## 想法 > > > > * 从 ChatGPT 刚上第二周开始,我弄了个账号,后来发现一个很好玩的项目 [ChineseAiDungeonChatGPT](https://github.com/bupticybee/ChineseAiDungeonChatGPT) --> 用 ChatGPT 玩 DND, 我突然想我能语音就更有带入感了。 > > * 因为之前折腾 [blue](https://github.com/yihong0618/blue) 时候了解了一些小米 IOT 设备的交互 tts, 我觉得我用一些方式是可以实现的 > > * 不过从想法到可用确实经历了不少 > > > > ## 开始折腾 > > > > 1. 最早的 idea 是把小爱同学破解了,破解之后拦截我的对话,如果对话包含 `GPT` 就用破解的小爱发送请求到 ChatGPT, 再把 ChatGPT 的回复截包,读出来。 > > > > > > * 遇到最大的困难是小爱怎么破解,搜了一圈发现,小爱是有办法通过串口来 hook 再刷固件的。 > > * 但串口是啥?我学习了串口通信,用自己树莓派做实验,去淘宝买 usb2ttl 学会了。但是需要焊接,我又去 B 站刷视频学习,问同事硬件大神如何焊接,学会了焊接。但,他妈的,新的小爱同学把串口通信给封了。 > > * 翻到了一个国外破解小爱同学的,[能用拆机后的 USB 来烧固件](https://github.com/duhow/xiaoai-patch/blob/master/research/lx06/install.md),但我没有 windows,-> 学习老的 macbookpro 2015 刷双系统,尝试给小爱刷机 -> 小米把这个也封了 > > * 有趣的是每天用发现确实还挺好用的,让他放歌,给我儿子放小猪佩奇。于是又给丈母娘买了一个,给她配置好,可以放歌。 > > > > > > 2. 第一个方式不太行,尝试去用路由 openwrt 截包再发送,依然失败,我折腾了一下发现 https 获取 payload 还是有些困难的 > > 3. 转向了 Siri 那么我能不能用 Siri 实现呢?是能的,可以用 Siri -> 捷径 -> 获取你说的话 -> 发送 ChatGPT -> 小爱 or 直接 Siri 自己来 > > 4. 网友[象牙山刘能](https://twitter.com/disksing)有一天发他儿子小爱同学的聊天记录,突然灵感来了,我可以用最蠢的轮询,来不断获取最新的聊天记录,如果有新的符合要求我就发送给 ChatGPT --> 再用 tts 让小爱同学朗读,但因为朗读需要时间,所以轮询也没那么笨了。 > > > > ## 实现 > > > > * 先实现不断拿对话历史 > > * 测试 revChatGPT 可行 > > * 利用 MiService call tts 可行 > > * 剩下就是写代码了 > > > > ## 准备 > > > > 1. ChatGPT id > > 2. 小爱音响 > > 3. 能正常联网的环境或 proxy > > 4. python3.8+ > > > > ## 使用 > > > > 1. pip install -r requirements.txt > > 2. 参考 [MiService](https://github.com/Yonsm/MiService) 项目 README 并在本地 terminal 跑 `micli list` 拿到你音响的 DID 成功 **别忘了设置 export MI_DID=xxx** 这个 MI_DID 用 > > 3. 参考 [revChatGPT](https://github.com/acheong08/ChatGPT) 项目 README 配置 chatGPT 的 config > > 4. run `python xiaogpt.py --hardware ${your_hardware}` hardware 你看小爱屁股上有型号,输入进来 > > 5. 跑起来之后就可以问小爱同学问题了,“帮我回答开头的问题” 会发送一份给 ChatGPT 然后小爱同学用 tts 回答 > > > > ## 总结 > > > > * 完成那一刻确实挺开心,但过程中发现了几个好玩的[博客](http://javabin.cn/archives/),惊讶了做 revChatGPT 的学生真牛逼,学会了焊接,开始发现硬件也挺有意思的,不断折腾的过程沮丧有一些,但更多的是学习新东西带来的兴奋感。 > > * 拆机发现,小爱同学内部做工确实不错 > > * 折腾过程中的感受,将来肯定有一天这些智能音箱厂商也会训练大模型,将彻底改变智能家居,仿佛看到了未来 > > > > ## 彩蛋 > > ![image](https://user-images.githubusercontent.com/15976103/219273665-f8c252aa-0b05-4f18-9028-8cada453aea5.png) > > 看项目介绍,没能完全了解这个仓库能够提供的能力。可以通过复杂的命令控制家电吗?还是只能通过gpt对话。 另外这个脚本需要持续运行吗?还是说设置成功后就完事不需要运行了。 能

MrTreasure

我希望通过GPT接入后再控制智能家居,但是目前看见只能简单对话。请问控制家居这个怎么实现呢?小米那边文档没有找到

yihong0618

> 我希望通过GPT接入后再控制智能家居,但是目前看见只能简单对话。请问控制家居这个怎么实现呢?小米那边文档没有找到 这个算是逆向,没有文档,但实现智能控制不难,你可以利用 miservice 做,但是需要你自己 DIY 我的例子: https://github.com/yihong0618/gitblog/issues

lonelam

大佬有没有openwrt做流量劫持的踩坑?盲猜这种IoT设备应该不会强校验https证书。

yihong0618

> 大佬有没有openwrt做流量劫持的踩坑?盲猜这种IoT设备应该不会强校验https证书。 xiaoai 好像做了。

Saintoliver

感谢yihong大佬的回答,我放弃了全局梯子。直接选择连接国内的通亿千问,在家里的NAS docker上用上了。感谢。 以后家里小朋友的十万个为什么,不需要我都百度后回答他了。。。。

daimenspace

> 感谢yihong大佬的回答,我放弃了全局梯子。直接选择连接国内的通亿千问,在家里的NAS docker上用上了。感谢。 > > 以后家里小朋友的十万个为什么,不需要我都百度后回答他了。。。。 小爱同学现在不能注册开发者账号了,是不是就没法接入其他家的AI助手了?

sparkssssssss

感谢带佬提供的教程,不过使用下来感觉不好用, 1-gpt好像无法完全接管,每次都要用前缀,我尝试改了下代码逻辑,任何提问都由gpt,但是好像有问题2 2-不管参数配置mute_xiaomi,还是启动加参数mute-xiaomi,似乎小米都会抢答,或者说几个字,然后说正在问gpt...... 所以,想咨询下,如何能彻底ban掉小爱的回答?我是lx05 红外线那款,

yihong0618

> > 感谢yihong大佬的回答,我放弃了全局梯子。直接选择连接国内的通亿千问,在家里的NAS docker上用上了。感谢。 > > 以后家里小朋友的十万个为什么,不需要我都百度后回答他了。。。。 > > 小爱同学现在不能注册开发者账号了,是不是就没法接入其他家的AI助手了? 能

yihong0618

> 感谢带佬提供的教程,不过使用下来感觉不好用, 1-gpt好像无法完全接管,每次都要用前缀,我尝试改了下代码逻辑,任何提问都由gpt,但是好像有问题2 2-不管参数配置mute_xiaomi,还是启动加参数mute-xiaomi,似乎小米都会抢答,或者说几个字,然后说正在问gpt...... > > 所以,想咨询下,如何能彻底ban掉小爱的回答?我是lx05 红外线那款, 是可行的 但不建议彻底 ban 掉小米回答,那样会频繁请求。 https://github.com/yihong0618/xiaogpt/issues/417

yihong0618

> 感谢带佬提供的教程,不过使用下来感觉不好用, 1-gpt好像无法完全接管,每次都要用前缀,我尝试改了下代码逻辑,任何提问都由gpt,但是好像有问题2 2-不管参数配置mute_xiaomi,还是启动加参数mute-xiaomi,似乎小米都会抢答,或者说几个字,然后说正在问gpt...... > > 所以,想咨询下,如何能彻底ban掉小爱的回答?我是lx05 红外线那款, 关于用前缀是为了不影响正常小爱的提问,你可以自行 diy 去掉前缀

sparkssssssss

> > 感谢带佬提供的教程,不过使用下来感觉不好用, 1-gpt好像无法完全接管,每次都要用前缀,我尝试改了下代码逻辑,任何提问都由gpt,但是好像有问题2 2-不管参数配置mute_xiaomi,还是启动加参数mute-xiaomi,似乎小米都会抢答,或者说几个字,然后说正在问gpt...... > > 所以,想咨询下,如何能彻底ban掉小爱的回答?我是lx05 红外线那款, > > 关于用前缀是为了不影响正常小爱的提问,你可以自行 diy 去掉前缀 看代码逻辑,我修改全部都问gpt了,小爱还是会抢答,我主要想问下,怎么能彻底拦截小爱啊,我吧所有mute_xiaoai的都设置为True了,也把所有问题都让gpt了. ``` if True: #if query.startswith(tuple(self.key_word)): # only mute when your clause start's with the keyword self.this_mute_xiaoai = True #self.this_mute_xiaoai = False # drop 帮我回答 query = re.sub(rf"^({'|'.join(self.key_word)})", "", query) print("-" * 20) print("问题:" + query + "?") query = f"{query},{PROMPT}" # waiting for xiaoai speaker done #if self.mute_xiaoai: # await asyncio.sleep(1) await self.do_tts("正在问GPT") ........ ```

yihong0618

> > > 感谢带佬提供的教程,不过使用下来感觉不好用, 1-gpt好像无法完全接管,每次都要用前缀,我尝试改了下代码逻辑,任何提问都由gpt,但是好像有问题2 2-不管参数配置mute_xiaomi,还是启动加参数mute-xiaomi,似乎小米都会抢答,或者说几个字,然后说正在问gpt...... > > > 所以,想咨询下,如何能彻底ban掉小爱的回答?我是lx05 红外线那款, > > > > > > 关于用前缀是为了不影响正常小爱的提问,你可以自行 diy 去掉前缀 > > 看代码逻辑,我修改全部都问gpt了,小爱还是会抢答,我主要想问下,怎么能彻底拦截小爱啊,我吧所有mute_xiaoai的都设置为True了,也把所有问题都让gpt了. > > ``` > if True: > #if query.startswith(tuple(self.key_word)): > # only mute when your clause start's with the keyword > self.this_mute_xiaoai = True > #self.this_mute_xiaoai = False > # drop 帮我回答 > query = re.sub(rf"^({'|'.join(self.key_word)})", "", query) > > print("-" * 20) > print("问题:" + query + "?") > > query = f"{query},{PROMPT}" > # waiting for xiaoai speaker done > #if self.mute_xiaoai: > # await asyncio.sleep(1) > await self.do_tts("正在问GPT") > ........ > ``` 目前不能。lx05 可能会 mute 的更慢一些

ZHANGHAIWEN949

能接入小爱通话吗 让GPT跟骚扰电话斗智斗勇

windfgg

> > > > 感谢带佬提供的教程,不过使用下来感觉不好用, 1-gpt好像无法完全接管,每次都要用前缀,我尝试改了下代码逻辑,任何提问都由gpt,但是好像有问题2 2-不管参数配置mute_xiaomi,还是启动加参数mute-xiaomi,似乎小米都会抢答,或者说几个字,然后说正在问gpt...... > > > > 所以,想咨询下,如何能彻底ban掉小爱的回答?我是lx05 红外线那款, > > > > > > > > > 关于用前缀是为了不影响正常小爱的提问,你可以自行 diy 去掉前缀 > > > > > > 看代码逻辑,我修改全部都问gpt了,小爱还是会抢答,我主要想问下,怎么能彻底拦截小爱啊,我吧所有mute_xiaoai的都设置为True了,也把所有问题都让gpt了. > > ``` > > if True: > > #if query.startswith(tuple(self.key_word)): > > # only mute when your clause start's with the keyword > > self.this_mute_xiaoai = True > > #self.this_mute_xiaoai = False > > # drop 帮我回答 > > query = re.sub(rf"^({'|'.join(self.key_word)})", "", query) > > > > print("-" * 20) > > print("问题:" + query + "?") > > > > query = f"{query},{PROMPT}" > > # waiting for xiaoai speaker done > > #if self.mute_xiaoai: > > # await asyncio.sleep(1) > > await self.do_tts("正在问GPT") > > ........ > > ``` > > 目前不能。lx05 可能会 mute 的更慢一些 https://bbs.hassbian.com/thread-23752-1-1.html 我看到一篇 小爱音箱接入ChatGPT:上下文理解和去除小爱回应 可以实现去除小爱回应吗?

leo07046219

QA2 你做这玩意也没用啊? ========= 各种软硬件折腾的快乐,他们体会不到,哈哈哈 -- 一名本科就开始玩单片机,现在在嵌入式行业的人这么说

hirolee88

哇,现在有小智AI和,怎么改造到小爱音箱上面

欸,我有个xioami sound飞了三个串口2个没输出,一个RTOS的输出,但是这个控制台无法进行操作。又飞了USB口,插入后没adb。一晚上一无所获。然后看到博主,发现历程一模一样,难绷。

docker-alex-ai

请求接入小智,那个音色很牛