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

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

    

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

<think>好的,我现在需要帮助用户寻找基于STM32的触控屏蓝牙音箱的设计方案或实现方法。首先,我应该理清楚用户的需求:他们希望用STM32作为主控,结合触控屏和蓝牙功能来设计一个音箱系统。接下来,我需要结合之前提供的引用内容,看看有没有相关的信息可以参考。 首先,引用[1]提到了DSP的智能音响系统,包括音频处理、语音识别和蓝牙模块。虽然主控是DSP,但可能有些模块的实现方法可以借鉴到STM32上,比如蓝牙连接和音频处理部分。引用[2]中的项目使用了沁恒的CH32V307开发板,涉及了蓝牙传输、压力传感器、LCD显示等,这可能对蓝牙模块和触控屏的驱动有帮助。引用[3]讨论了GUI设计,使用Qt等框架,这对于触控屏的界面设计有参考价值。引用[4]提到了语音合成模块,通过串口控制,这可能用于系统的语音反馈功能。 接下来,我需要分解整个系统的组成部分。根据用户的需求,系统应该包括以下几个模块:主控(STM32)、触控屏、蓝牙模块、音频处理、电源管理,以及可能的附加功能如语音控制或物联网集成。 主控部分,STM32F4或F7系列比较合适,因为它们有较高的处理能力和丰富的外设,比如I2S、SPI、USART等,适合处理音频和驱动屏幕。触控屏方面,可能需要选择支持电容或电阻触控的TFT显示屏,并考虑使用LVGL或Embedded Wizard这样的嵌入式GUI库,这在引用[3]中提到的Qt可能不太适合资源有限的嵌入式系统,所以需要调整。 蓝牙模块部分,引用[2]中使用了CH9141蓝牙模块,可能可以作为参考。常见的蓝牙音频模块如CSR8645或BK8000L,它们支持A2DP和AVRCP协议,能够实现音频流传输和控制。需要配置STM32通过UART或SPI与蓝牙模块通信,并处理音频数据的传输。 音频处理方面,需要DAC将数字信号转换为模拟音频,或者使用集成DAC的STM32型号。此外,可能需要音频编解码器如VS1053来处理MP3等格式的解码。引用[1]中的音频处理模块可能提供一些思路,比如使用DSP进行音效处理。 电源管理部分,锂电池充电和低功耗设计是关键,特别是便携式设备需要考虑续航。可能需要集成充电IC如TP4056,并设计合理的电源路径。 附加功能方面,用户可能想要语音控制,引用[4]提到的CN-TTS模块可以实现语音合成,而语音识别可能需要额外的模块或使用STM32的算法。物联网集成可以通过Wi-Fi或蓝牙实现,引用[3]中的智能家居控制模块可能相关。 然后,我需要考虑系统集成和调试。硬件上需要设计PCB,合理布局以减少干扰;软件上需要编写驱动程序,比如触控屏的触摸检测、蓝牙协议栈的集成、音频流的处理等。引用[2]中提到的环形FIFO缓存可能用于音频数据的缓冲,确保流畅播放。 可能遇到的问题包括蓝牙音频的延迟、触控屏的响应速度、音频质量等。需要参考现有的开源项目或文档,比如STM32的HAL库和蓝牙协议栈的应用笔记。 最后,生成相关问题,帮助用户深入探讨各个模块的实现细节和潜在挑战。</think>### 基于STM32的触控屏蓝牙音箱设计方案 以下是分模块的实现方法,结合触控交互、蓝牙音频传输和嵌入式系统设计: --- #### **1. 硬件架构设计** - **主控芯片**:选择STM32F4/F7系列(如STM32F407/F767),支持高速USB OTG、I2S音频接口、TFT控制器及多点触控接口。 - **触控屏**:选用电容式触摸TFT屏(如ILI9341驱动芯片),分辨率建议320×480,通过SPI或FSMC接口连接STM32[^3]。 - **蓝牙模块**:采用支持A2DP(音频传输)和AVRCP(控制)的蓝牙5.0芯片(如BK8000L或CSR8645),通过UART或SPP协议与STM32通信[^2]。 - **音频模块**: - 解码:集成VS1053B音频解码芯片(支持MP3/WMA/AAC格式),通过SPI与STM32通信。 - 输出:使用Class D功放(如PAM8403)驱动扬声器。 - **电源管理**:设计锂电池供电(3.7V)与充电电路(TP4056),支持USB-PD快充。 --- #### **2. 软件实现关键步骤** - **触控交互界面**: - 使用LVGL或Embedded Wizard开发GUI,实现音量控制、播放列表、模式切换等功能[^3]。 - 示例代码(触控事件处理): ```c void touch_event_handler(lv_event_t *e) { if (e->code == LV_EVENT_CLICKED) { lv_obj_t *btn = lv_event_get_target(e); if (btn == play_btn) { audio_play_pause(); // 控制音频播放 } } } ``` - **蓝牙音频传输**: - 配置蓝牙模块为从机模式,STM32通过AT指令控制配对与连接。 - 接收音频数据流后,通过I2S传输至VS1053解码[^2]。 - **音频处理优化**: - 使用DMA传输减少CPU负载,避免音频卡顿。 - 实现环形缓冲区(FIFO)存储蓝牙数据流。 --- #### **3. 系统集成与调试** - **硬件调试**: - 检查I2S时钟同步(避免噪声)、触控屏校准(通过LVGL内置工具)。 - 测试蓝牙信号稳定性(建议距离<10米)。 - **软件优化**: - 启用STM32硬件浮点单元(FPU)提升GUI渲染效率。 - 使用FreeRTOS管理多任务(触控响应、蓝牙通信、音频播放)。 --- #### **4. 扩展功能(可选)** - **语音控制**:集成LD3320语音识别芯片,支持自定义唤醒词[^4]。 - **物联网交互**:通过ESP8266 Wi-Fi模块接入智能家居平台(如Home Assistant)。 --- ### 开源参考资源 1. **STM32蓝牙音频库**:[STM32H7_A2DP_Source](https://github.com/pschatzmann/STM32H7_A2DP_Source) 2. **LVGL触控示例**:[lv_port_stm32f4_disco](https://github.com/lvgl/lv_port_stm32f4_disco) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值