在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烧写器提供电源)。

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

    

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

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐