『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 514|回复: 8

[技术探讨] 小爱音响与智谱清言AI对接的自动化脚本(基于mi home和auto)

[复制链接]

16

主题

230

帖子

2517

积分

论坛技术达人

积分
2517
金钱
2267
HASS币
40
发表于 4 天前 | 显示全部楼层 |阅读模式
本帖最后由 hzcoolwind 于 2025-1-18 10:35 编辑

本脚本利用mi home官方集成音响中 播放暂停按钮 可实现几乎无小爱对话抢答的 AI集成,可持续对话直到说 “退出”或不说话
ai.yaml (7.51 KB, 下载次数: 29)


1. 小米APP 训练计划, 设置 “智能对话”/“智能模式”/“智能对话模式”   执行一句话  返回 “请稍后”
2. ha 安装mi home 小米官方, xiaomi auto, 智谱清言 集成
3. mi home / xiaomi auto 都配置有小米音响实体
4.  按附件脚本修改对应实体, 脚本为2个音响的脚本 ,可自行修改
5.  使用流程
a.  对小爱音响说:  “智能对话”   小爱音响返回 “请稍后”
b.  过1,2秒后小爱同学说“请问有什么可以帮您的”, 即进入智能对话模式, 此时可对小爱说出你的指令, 或者不说话 5,6秒后自动退出智能对话模式
c.  对小爱音响说出指令, 过几秒后小爱同学响应“正在处理中”,期间几乎无小爱抢答(2个音响,一个完全无抢答,另一个偶尔有1,2个字的抢答)
d. 再过几秒返回智谱清言的 响应结果
e.  再过几秒小爱同学会说“请问还有什么可以帮您的”
f.   持续对AI提出问题, 或者说“没有了”/“退出” 或者不说话自动退出智能对话


脚本中 script.calltts 为两个音响的tts语音播放,mode 指定哪个音响,可自行编写
缺点: 目前智谱清言的响应还不够快速准确, 还在持续改进中, 本地指令conversation.process 处理结果跟语言助手中执行效果不一致,等待大佬改进,也可切换为home assistant自带代理,执行一些简单明确的指令


评分

参与人数 4金钱 +34 收起 理由
FireDAO + 5 论坛有你更精彩!
summ99111 + 8 高手,这是高手!
nuknoop + 16 高手,这是高手!
sxrcm + 5 高手,这是高手!

查看全部评分

回复

使用道具 举报

28

主题

312

帖子

4115

积分

论坛技术达人

积分
4115
金钱
3788
HASS币
60
发表于 4 天前 | 显示全部楼层
还在维修,比较复杂,确实在提升响应和解决这个问题
回复

使用道具 举报

4

主题

159

帖子

931

积分

高级会员

Rank: 4

积分
931
金钱
772
HASS币
0
发表于 4 天前 | 显示全部楼层
老哥你好,我在创建脚本的时候提示报错,我问了chatgpt还是无法解决
alias: 新脚本
description: ""
mode: restart
variables:
  repeat_count: 1
triggers:
  - platform: state
    entity_id:
      - sensor.xiaomi_l7a_d47f_conversation
    id: keting
    variables:
      conversation_txt: "{{ states.sensor.xiaomi_l7a_d47f_conversation.state }}"
  - platform: state
    entity_id:
      - sensor.xiaomi_l7a_d47f_conversation
    id: zhuwo
    variables:
      conversation_txt: "{{ states.sensor.xiaomi_l7a_d47f_conversation.state }}"
conditions:
  - condition: template
    value_template: "{{ '智能对话' in conversation_txt or '智能模式' in conversation_txt }}"
actions:
  - delay:
      milliseconds: 1500
  - choose:
      - conditions:
          - condition: trigger
            id: keting
        sequence:
          - repeat:
              while:
                - condition: template
                  value_template: "{{ '退出' not in states.sensor.xiaomi_l7a_d47f_conversation.state and '没有了' not in states.sensor.xiaomi_l7a_d47f_conversation.state }}"
              sequence:
                - variables:
                    conversation_txt: "{{ states.sensor.xiaomi_l7a_d47f_conversation.state }}"
                - choose:
                    - conditions:
                        - condition: template
                          value_template: "{{ repeat.first }}"
                      sequence:
                        - action: script.calltts
                          data:
                            mode: 'text.xiaomi_l7a_d47f_play_text'
                            message: '请问有什么可以帮您的?'
                    default:
                      - action: script.calltts
                        data:
                          mode: 'text.xiaomi_l7a_d47f_play_text'
                          message: '请问还有什么可以帮您的?'
                - delay:
                    milliseconds: 2250
                - action: button.press
                  target:
                    entity_id: button.xiaomi_cn_337459372_l7a_wake_up_a_5_2
                - delay:
                    milliseconds: 2500
                - repeat:
                    while:
                      - condition: template
                        value_template: "{{ states.sensor.xiaomi_l7a_d47f_conversation.state == conversation_txt }}"
                      - condition: template
                        value_template: "{{ repeat.index <= 20 }}"
                    sequence:
                      - action: homeassistant.update_entity
                        entity_id: sensor.xiaomi_l7a_d47f_conversation
                      - delay:
                          milliseconds: 333
                      - action: button.press
                        target:
                          entity_id: button.xiaomi_cn_337459372_l7a_pause_a_4_1
                        continue_on_error: true
                - choose:
                    - conditions:
                        - condition: template
                          value_template: "{{ states.sensor.xiaomi_l7a_d47f_conversation.state != conversation_txt and '退出' not in states.sensor.xiaomi_l7a_d47f_conversation.state and '没有了' not in states.sensor.xiaomi_l7a_d47f_conversation.state }}"
                      sequence:
                        - action: script.calltts
                          data:
                            message: "正在处理中..."
                        - action: conversation.process
                          data:
                            text: "{{ states.sensor.xiaomi_l7a_d47f_conversation.state }}"
                            language: zh
                            conversation_id: my_conversation_xiaoai
                            agent_id: conversation.zhi_pu_qing_yan
                          response_variable: process_result
                        - action: script.calltts
                          data:
                            message: "{{ process_result.response.speech.plain.speech }}"
                        - delay:
                            milliseconds: "{{ process_result.response.speech.plain.speech | count / 4 * 1000 + 500 }}"
                    default:
                      - action: script.calltts
                        data:
                          message: "已为您退出智能对话"
                      - stop: "true"
      - conditions:
          - condition: trigger
            id: zhuwo
        sequence:
          - repeat:
              while:
                - condition: template
                  value_template: "{{ '退出' not in states.sensor.xiaomi_lx05_8fb9_conversation.state and '没有了' not in states.sensor.xiaomi_lx05_8fb9_conversation.state }}"
              sequence:
                - variables:
                    conversation_txt: "{{ states.sensor.xiaomi_lx05_8fb9_conversation.state }}"
                - choose:
                    - conditions:
                        - condition: template
                          value_template: "{{ repeat.first }}"
                      sequence:
                        - action: script.calltts
                          data:
                            mode: 'text.xiaomi_lx05_8fb9_play_text'
                            message: '请问有什么可以帮您的?'
                    default:
                      - action: script.calltts
                        data:
                          mode: 'text.xiaomi_lx05_8fb9_play_text'
                          message: '请问还有什么可以帮您的?'
                - delay:
                    milliseconds: 2500
                - action: button.press
                  target:
                    entity_id: button.xiaomi_cn_295489515_lx05_wake_up_a_5_1
                - delay:
                    milliseconds: 2500
                - repeat:
                    while:
                      - condition: template
                        value_template: "{{ states.sensor.xiaomi.lx05_8fb9_conversation.state == conversation_txt }}"
                      - condition: template
                        value_template: "{{ repeat.index <= 20 }}"
                    sequence:
                      - action: homeassistant.update_entity
                        entity_id: sensor.xiaomi.lx05_8fb9_conversation
                      - delay:
                          milliseconds: 333
                      - action: button.press
                        target:
                          entity_id: button.xiaomi_cn_295489515_lx05_pause_a_3_3
                        continue_on_error: true
                - choose:
                    - conditions:
                        - condition: template
                          value_template: "{{ states.sensor.xiaomi_lx05_8fb9_conversation.state != conversation_txt and '退出' not in states.sensor.xiaomi.lx05_8fb9_conversation.state and '没有了' not in states.sensor.xiaomi_lx05_8fb9_conversation.state }}"
                      sequence:
                        - action: script.calltts
                          data:
                            mode: 'text.xiaomi_lx05_8fb9_play_text'
                            message: "正在处理中..."
                        - action: conversation.process
                          data:
                            text: "{{ states.sensor.xiaomi_lx05_8fb9_conversation.state }}"
                            language: zh
                            conversation_id: my_conversation_xiaoai
                            agent_id: conversation.zhi_pu_qing_yan
                          response_variable: process_result
                        - action: script.calltts
                          data:
                            mode: 'text.xiaomi_lx05_8fb9_execute_text_directive'
                            message: "{{ process_result.response.speech.plain.speech }}"
                        - delay:
                            milliseconds: "{{ process_result.response.speech.plain.speech | count / 4 * 1000 + 500 }}"
                    default:
                      - action: script.calltts
                        data:
                          mode: '2'
                          message: "已为您退出智能对话"
                      - stop: "true"


报错提示是这样的(解析 YAML 时出错:bad indentation of a mapping entry (行:46,列:21))
回复

使用道具 举报

16

主题

230

帖子

2517

积分

论坛技术达人

积分
2517
金钱
2267
HASS币
40
 楼主| 发表于 4 天前 | 显示全部楼层
summ99111 发表于 2025-1-18 21:38
老哥你好,我在创建脚本的时候提示报错,我问了chatgpt还是无法解决
alias: 新脚本
description: ""

这个太难看了,得一点点仔细检查,可能空格差几个都会出问题
回复

使用道具 举报

3

主题

97

帖子

1537

积分

金牌会员

Rank: 6Rank: 6

积分
1537
金钱
1440
HASS币
10
发表于 4 天前 | 显示全部楼层
请问script.calltts 需要额外的脚本吗?执行到这进行不下去了
回复

使用道具 举报

16

主题

230

帖子

2517

积分

论坛技术达人

积分
2517
金钱
2267
HASS币
40
 楼主| 发表于 4 天前 | 显示全部楼层
script.yaml 中

calltts:
  description: "call a tts service"
  fields:
    mode:
      description: "0: 所有音箱  1: 客厅音响  2: 主卧音响"
      example: 1
      default: '1'
    message:
      description: "tts message"
      example: "你好"
  sequence:
    - variables:
        msg: "{{ message }}"
    - if:
        - condition: template
          value_template: "{{ mode is not defined or mode == 1 or mode == 0 or mode == '1' or mode == '0'}}"
      then:
        - action: notify.send_message
          target:
            entity_id: notify.xiaomi_cn_327623717_l7a_play_text_a_5_1
          data:
            message: "[\"{{ msg }}\"]"
    - if:
        - condition: template
          value_template: "{{ mode == 2 or mode == 0 or mode == '2' or mode == '0'}}"
      then:
        - action: notify.send_message
          data:
            message: "[\"{{ msg }}\"]"
          target:
            entity_id: notify.xiaomi_cn_800766781_l05b_play_text_a_5_3


类似这样,用的是mi home的notify实现的tts 播放,也可以用 xiaomi auto中的方法来实现tts
回复

使用道具 举报

3

主题

97

帖子

1537

积分

金牌会员

Rank: 6Rank: 6

积分
1537
金钱
1440
HASS币
10
发表于 4 天前 | 显示全部楼层
感谢楼主,已经可以使用了
回复

使用道具 举报

28

主题

312

帖子

4115

积分

论坛技术达人

积分
4115
金钱
3788
HASS币
60
发表于 3 天前 | 显示全部楼层
截屏2025-01-19 02.18.54.png
回复

使用道具 举报

16

主题

230

帖子

2517

积分

论坛技术达人

积分
2517
金钱
2267
HASS币
40
 楼主| 发表于 3 天前 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2025-1-22 20:52 , Processed in 0.090532 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表