用ESP8266实现HomeAssistant下自定义语音播报(TTS)
在HomeAssistant下使用NodeRed的TTS组件结合智能音箱比较容易实现语音播报功能,但一般家里不会在每个房间都放一个智能音箱。本文旨在低成本(十几元)实现自定义语音播报。首先通过NodeRed合成需要播报的文本,用微软的Edge TTS将文本转换成MP3格式文件,再使用ESP8266来播放该MP3文件,并通过小型功放驱动喇叭播出。
在HomeAssistant下使用NodeRed的TTS组件结合智能音箱比较容易实现语音播报功能,但一般家里不会在每个房间都放一个智能音箱。本文旨在低成本(十几元)实现自定义语音播报。
一、设计思路
首先通过NodeRed合成需要播报的文本,用微软的Edge TTS将文本转换语音,并生成MP3格式文件,再使用ESP8266来播放该MP3文件,通过小型功放驱动喇叭播出。
二、器件准备
1、ESP8266模块(ESP-01S)
2、LM386功放模块
3、esp8266烧写器(CH340)
4、8Ω 3W喇叭
三、器件连接
1、烧写模式
CH340 | ESP8266 烧写模式 |
3.3V | 3.3V |
RX | TX |
TX | RX |
GND | GPIO0 |
GND | GND |
如直接使用ESP8266烧写器,插上可直接烧写。
2、工作模式
ESP8266 工作模式 | LM386功放模块 | 喇叭 |
VCC(3.3V) | VCC(5V) | |
RX | IN | |
OUT | 正 | |
GND | GND | 负 |
四、烧写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烧写器提供电源)。
测试没有问题,就可以组装了,我这里用了一个圆筒形塑料盒,一个自制智能语音播报音箱就完成了。
这个语音播报系统有个问题,就是在没有播报的时候,喇叭会有时断时续的“咔、咔”声,一直没有找到好的解决方案,我这里是把它的供电电源插在一个定时开关上面,每天早晨播报前打开电源,播报玩后再关闭电源。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)