用ESP8266实现HomeAssistant下自定义语音播报(TTS)

在HomeAssistant下使用NodeRed的TTS组件结合智能音箱比较容易实现语音播报功能,但一般家里不会在每个房间都放一个智能音箱。本文旨在低成本(十几元)实现自定义语音播报。

一、设计思路

首先通过NodeRed合成需要播报的文本,用微软的Edge TTS将文本转换语音,并生成MP3格式文件,再使用ESP8266来播放该MP3文件,通过小型功放驱动喇叭播出。

二、器件准备

1、ESP8266模块(ESP-01S)

2、LM386功放模块

3、esp8266烧写器(CH340)

4、8Ω 3W喇叭

三、器件连接

1、烧写模式

CH340ESP8266
烧写模式
3.3V3.3V
RXTX
TXRX
GNDGPIO0
GNDGND

如直接使用ESP8266烧写器,插上可直接烧写。

2、工作模式

ESP8266
工作模式
LM386功放模块喇叭
VCC(3.3V)VCC(5V)
RXIN
OUT
GNDGND

四、烧写ESP8266

1、下载固件MrDIY_Notifier.bin到本地。

该固件是一位大神制作的,通过这个bin文件,可以简单地将文件直接加载到ESP8266中。这免去了下载代码、更新WIFI和MQTT设置、下载和安装库、为Arduino配置esp8266、更改Arduino设置、最终上传代码的漫长过程。如果需要访问完整的源代码,可以在Gitlab上找到(MrDIY / MrDIY Audio Notifier · GitLab)。

2、下载Tasmota烧录工具

(https://github.com/tasmota/tasmotizer/releases)

Windows下32位选择下载“tasmotizer_x86-1.2.exe”,64位选择下载“tasmotizer-1.2.exe”。

 3、烧录固件

      按烧写模式连接CH340和ESP8266,启动Tasmota烧录工具,选择COM端口(可通过设备管理器查询CH340端口号)。

点击“Open”选择刚才下载的MrDIY_Notifier.bin文件,选择“Tasmotize!”开始烧录。

 

 

4、配置固件

       烧录完成后,连接名字为 "MrDIY Notifier"的WIFI,密码是 "mrdiy.ca"。然后在浏览器输入地址:192.168.4.1。

 输入你将要接入的WIFI名称、密码,以及MQTT服务器IP地址等信息(关于MQTT服务器安装可参考我另外一篇文章:用树莓派构建家庭智能家居控制中心_树莓派 米家-CSDN博客),然后点击保存。重启ESP8266,然后回到你自己的WIFI网络。该固件已经配置好MQTT相关主题,具体如下:

     - Play MP3              MQTT topic: "/mrdiynotifier/play"
                             MQTT load: http://url-to-the-mp3-file/file.mp3

     - Play Icecast Stream   MQTT topic: "/mrdiynotifier/stream"
                             MQTT load: http://url-to-the-icecast-stream/file.mp3

     - Play Ringtone         MQTT topic: "/mrdiynotifier/tone"
                             MQTT load: RTTTL formated text, example: Soap:d=8,o=5,b=125:g,a,c6,p,a,4c6,4p,a,g,e,c,4p,4g,a

     - Say Text              MQTT topic: "/mrdiynotifier/say"
                             MQTT load: Text to be read, example: Hello There. How. Are. You?

     - Change Volume         MQTT topic: "/mrdiynotifier/volume"
                             MQTT load: a double between 0.00 and 1.00, example: 0.7

     - Stop Playing         MQTT topic: "/mrdiynotifier/stop"                           

     To get status:

     - The notifier sends status update on this MQTT topic: "/mrdiynotifier/status"

                  "playing"       either paying an mp3, streaming, playing a ringtone or saying a text
                  "idle"          waiting for a command
                  "error"         error when receiving a command: example: MP3 file URL can't be loaded
                  "connected"     device just connected to MQTT server

     - The notifier plays a 2 second audio clip when it is first booted and connected to Wifi & MQTT

5、播放测试

在HomeAssistant的“设备与服务”打开MQTT,点击选项

按照以上设置MQTT主题,输入要播放的MP3文件地址,选择“开始监听”,点击“发送”,看监听反馈信息,如没有报错,说明运行正常。要特别注意MP3文件地址,必须是在浏览器下通过HTTP可以直接访问的地址(不能是HTTPS)。当然你也可以分别测试其他主题(如say、tone等),还可以把耳机直接接到ESP8266的RX、GND引脚上听是否有声音。

五、安装Microsoft Edge TTS

在github下载hass-edge-tts组件(GitHub - hasscc/hass-edge-tts: 🗣️ Microsoft Edge TTS for Home Assistant, no need for app_key),解压后将 custom_components下的edge_tts 文件夹复制到HomeAssistant的custom_components文件夹下,

                    

将以下代码加入到HomeAssistant的configuration.yaml里,zh-CN-XiaoxiaoNeural是默认的语音种类, 具体可参考GitHub - hasscc/hass-edge-tts: 🗣️ Microsoft Edge TTS for Home Assistant, no need for app_key对语言种类、音色等进行设置。

# Text to speech

tts:
  - platform: edge_tts
    language: zh-CN-XiaoxiaoNeural

然后重新启动HomeAssistant,进入“开发者工具”进入“服务”页面,输入“TTS”,选择“Text-to-speech (TTS): Say a TTS message with edge_tts”服务,选择播放语音的实体(如智能音箱),然后输入要播放的文字内容,点击“调用服务”就可以进行测试了。

六、配置Node-Red

进入Node-Red,导入以下流程。

流程链接:链接:https://pan.baidu.com/s/1WXLtHnEFkv7Fbjwtr2y9Yg?pwd=o6vi 
(提取码:o6vi )

流程下面部分是自定义播出文本的过程,我这里读取了自制的室外温湿度传感器数据,另外读取了HomeAssistant天气组件的天气预报(含天气,最高温度、最低温度),你也可以根据自己需求自定义。另外“Run TTS_1”是自定义的一个开关,以便后面在HomeAssistant里面进行调用。

注意:这里相关节点的Server、Entity ID要修改为你HomeAssistant地址和实体。

流程上面部分是根据自定义文本,调用Microsoft Edge TTS将文本转换成语音,并生成MP3文件,然后再通过MQTT发布出去,由ESP8266进行播放。

注意:这里相关节点的URL地址要更换为你HomeAssistant地址,Token要换为你自己的令牌。

点击下面的时间戳,即可触发整个流程,并在服务器生成MP3播报文件。

七、HA配置调试(非必须)

为方便合成语音的调试,在完成Node-Red配置后,可在HomeAssistant里配置一个调试仪表盘:首先在“设备与服务”里创建一个“辅助元素”,选择“文本”类型,名称可自定义(如:tts_msg)。

然后在概览中创建一个新的仪表盘(如:TTS),给该仪表盘添加两个组件,一个是刚才定义的“tts_msg”文本组件,

另外一个是在Node-Red里面定义的“Run TTS_1”开关组件。

简单起见,也可以直接用以下代码自定义(注意entity_id要和实际情况保持一致)

type: button
icon_height: 20px
tap_action:
  action: call-service
  service: nodered.trigger
  service_data:
    entity_id: switch.run_tts
name: Run tts
size: 45%
styles:
  card:
    - height: 40px
  name:
    - font-size: 13.5px

定义好后界面如下:

在这里就可以通过点击"Run tts"按钮实现语音合成调用,和在Node-Red里面点击时间戳可触发整个流程一样的效果。

七、组装测试

完成以上配置后就可以开始测试了,按上文器件连接方法把ESP8266模块、LM386功放模块、喇叭连接好并通电(我这里使用了自己设计的ESP8266供电模块,可同时提供3.3V、5V电压,你也可以直接使用ESP8266烧写器提供电源)。

测试没有问题,就可以组装了,我这里用了一个圆筒形塑料盒,一个自制智能语音播报音箱就完成了。

    

这个语音播报系统有个问题,就是在没有播报的时候,喇叭会有时断时续的“咔、咔”声,一直没有找到好的解决方案,我这里是把它的供电电源插在一个定时开关上面,每天早晨播报前打开电源,播报玩后再关闭电源。

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值