Gravity:中英文语音合成模块V2.0测评
在以往的语音播报应用中,主要是采用串口可知MP3语音模块的方式来实现,其特点是以TF卡来存储播放的语音片段,故语音片段的存储容量很充裕。其不足之处则是,事先需要录制或以语音合成的方式来制作语音片段,因而前期的准备工作较为繁琐。
此次测评的Gravity: 中英文语音合成模块则是一款支持中文、英文及中英文混合的文字转语音(TTS) 合成的功能模块,并具有发音自然准确的特点。
该模块采用Gravity标准接口,可提供I2C与UART双通信协议,且可以轻松兼容Arduino、micro:bit等主流主控板。其最大的优势在于即插即用,该模块板载了喇叭和音频电路,因而无需任何外接元件,单以简单的几行代码即可实现项目语音化工作,因而极大地降低了语音功能的应用门槛。
该模块的应用场景为机器人对话、智能家居提示、环境数据播报等场景,面向创客、教育工作者及开发者而设计。
该模块采用DFROBOT常见的黑色纸盒包装,见图1所示。

图1 外包装
打开外包装后,是果糖般包装的模块和连接配件,见图2所示。

该模块的正反面器件布局见图3所示,其引脚用途见图4所示。

图3 正反面器件布局

图4 引脚功能
该模块的技术规格为:
供电电压:3.3V~5V 工作电流:160mA I2C地址:0x40 工作温度范围:-40℃~85℃ 产品尺寸:42*32mm
该模块支持I2C和UART两种通讯模式,有板载的开关可进行模式的切换。
通过连接的卡槽可限定连接的准确性,从而可以避免因连接的错误所导致的模块损伤。

图5 导线连接
有别于用MP3语音模块播放的方式来输出语音提示信息,该功能模块在使用时需要需要软硬的配合方可实现,所支持的主控板有Arduino UNO、ESP32、micro:bit等,见图1所示。相应的编程环境有Mind+、Arduino IDE、Python等。

图1 常见主控板
Arduino UNO为例,两种通信模式的连接方式如图2所示。

以使用Mind+为例,在完成软件下载后,其内容如图3所示。

在完成安装后,其界面如图4所示。

在该界面中,提供了多种编程模式,如实时模式、上传模式、Python积木模式及microPython积木模式等。
为便于测试,就选取了Python积木模式,见图5所示。该模式支持在电脑或行空板M10上运行,尽管咱没有行空板,电脑起码还是有的。

图5 模式选取
在进入该模式后,其界面分布如图6所示。在模块栏可选取编辑程序所需的功能模块,在资源文件栏有所选模块的拼接组件,在编辑栏可使用组件拼接程序,在运行栏可观察到拼接后的程序代码,在终端窗口则可观察程序的运行结果。
以图中所拼接的程序为例,它会每隔1秒就打印一次“Hello World”。

至此,说明在不连接开发板的情况下,用该软件也可进行程序的测试。后面的测试任务就是该软件如何通过串口来控制中英文语音合成模块。
以RA2E1开发板控制语音播报
打算通过官方建议的开发板来控制语音合成模块进行语音播报,遗憾的是在Mind+软件时无论是离线的还是在现,在串口连接成功后,却无法进行程序的下载。
改用Arduino IDE开发,在程序编译时也没有问题,但在下载时也不成功。
无奈之下,只能走第三条路线,即解析指令直接以串口来控制语音合成及播报。
在破译指令协议的情况下,至于实现了语音合成及播报。
这里选取的开发板是RA-Eco-RA2E1-V1.0开发板,经RASE的配置可生成相应的KEIL工程框架,随后经功能程序的添加,即可实现串口通信功能。

图1 参数配置
添加的功能程序为:
unsigned char cmd3[] = {0xFD, 0x00, 0x0B, 0x01, 0x00, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, 0x34, 0x20, 0x35};unsigned char cmd5[] = {0xFD, 0x00, 0x0C, 0x01, 0x03, 0x11, 0x62, 0x31, 0x72, 0x60, 0x4F, 0x2D, 0x4E, 0xFD, 0x56};void hal_entry(void){int i=0;err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);assert(FSP_SUCCESS == err);err = R_SCI_UART_Read(&g_uart9_ctrl, uart_rx_buffer, 1);assert(FSP_SUCCESS == err);_write(cmd3,14);while(1){ if(uart_receive_complete_flag) { uart_receive_complete_flag = false; if(uart_rx_buffer[0] == 0x41 ) { if(i==0) { _write(cmd5,15); } else { _write(cmd3,14); } i=(i+1)%2; } err = R_SCI_UART_Read(&g_uart9_ctrl, uart_rx_buffer, 1); assert(FSP_SUCCESS == err); } R_BSP_SoftwareDelay (3000, BSP_DELAY_UNITS_MILLISECONDS);}}
经程序的编译和下载,其测试结果如图2所示,说明程序设计正确。


其实在了解播放指令协议的基础上,没有开发板也照样可用控制语音的合成与播放,无非是通过串口来发送指令罢了。利用开发板的主要原因无非是借助于开发板将播放的内容包装成相应的控制指令而已。
只要了解其指令的协议构成,用串口依然可用进行语音合成与播放。
以播放语音“AB”为例,在波特率为115200bps的情况下,按图1所示发送HEX码即可得到预期的效果,其回文是41H。

图1 播放测试
此外,经测试它是不区分大小写,见图2所示。

在日常应用中,涉及最多的是数值播报功能,当然对于有视觉障碍的人群来说,其意义更明显。
由于连续播报的原因,在数字间应适当地添加空格加以停顿和分断,其测试结果见图3所示。

此外,还可以对问候语进行测试,见图4所示,其效果不是很满意。

对我们来说,中文发音才是最实用的,图5是测试“个十百千万”的发音结果。

至此,字符、数字、词语以及中文就都可以播放啦!
RDK X5 ROS机器人AI开发板测评
非常荣幸能够参与RDK X5 ROS机器人AI开发板的测评。最吸引我的,莫过于它搭载的10 TOPS强劲算力,为边缘端AI应用提供了坚实保障。
从外观上看,RDK X5的板型设计与树莓派5高度一致,尺寸、接口布局几乎如出一辙,这也意味着可以方便地使用为树莓派设计的部分配件和扩展板。

从外包装上看RDK X5的外包装明显比树莓派5更加厚重,详细的细节对比如下:
核心差异:
| AI算力 | 10 TOPS | X5完胜 | |
| CPU架构 | |||
| USB接口 | 4×USB 3.0 | ||
| 网络 | |||
| 视频输出 | X5实用性好 | ||
| 价格 |
唯一可惜的是两者都没有emmc,都需要外接sd卡。最后就是两张RDK X5的靓图:


本次我们来一步步实现这个“语音控制LED”项目,步骤如下:
一,环境搭建
1.1 硬件环境准备
请确保带麦克风的音频设备已正确连接到RDK X5的3.5mm接口,或者采用USB麦克风。我这里使用的是USB麦克风。


1.2 软件环境准备
本次使用的语音识别算法是官方SenseVoice语音算法包(该包会自动下载约470MB的模型文件,安装过程可能需要几分钟)。
# 1. 更新软件源sudo apt update# 2. 一键安装语音包sudo apt install tros-humble-sensevoice-ros2
第二步:语音识别开发与GPIO控制(核心代码)
#!/usr/bin/env python3import rclpyfrom rclpy.node import Nodefrom rclpy.qos import QoSProfile, QoSReliabilityPolicy, QoSDurabilityPolicy# 导入 /audio_smart 的消息类型try: from audio_msg.msg import SmartAudioData MSG_TYPE = SmartAudioData HAS_MSG = Trueexcept ImportError: print("Warning: audio_msg not found, using fallback") from rclpy.msg import Any MSG_TYPE = Any HAS_MSG = False# 板载 ACT LED 的控制路径LED_BRIGHTNESS_PATH = "/sys/class/leds/ACT/brightness"def set_led(state): """state: True 熄灭, False 点亮""" with open(LED_BRIGHTNESS_PATH, 'w') as f: f.write('0' if state else '1')class VoiceLEDControl(Node): def __init__(self): super().__init__('voice_led_control') self.get_logger().info("使用 ACT LED 进行控制")# 设置与 /audio_smart 匹配的 QoS qos = QoSProfile( depth=10, reliability=QoSReliabilityPolicy.RELIABLE, durability=QoSDurabilityPolicy.VOLATILE )self.sub = self.create_subscription( MSG_TYPE, '/audio_smart', self.callback, qos ) self.get_logger().info("已订阅 /audio_smart,等待语音命令...")def callback(self, msg): if HAS_MSG: cmd = msg.cmd_word else: cmd = getattr(msg, 'cmd_word', str(msg))self.get_logger().info(f"收到命令: {cmd}")if cmd == "开灯": set_led(True) self.get_logger().info("ACT LED 已点亮") elif cmd == "关灯": set_led(False) self.get_logger().info("ACT LED 已熄灭")def main(args=None): rclpy.init(args=args) node = VoiceLEDControl() try: rclpy.spin(node) except KeyboardInterrupt: node.get_logger().info("用户中断,退出") except Exception as e: node.get_logger().error(f"错误: {e}") finally: node.destroy_node() rclpy.shutdown()if __name__ == '__main__': main()
第三步:运行与测试
开启语音识别:另开一个新终端,执行以下命令启动SenseVoice节点。
source /opt/tros/humble/setup.bash # 配置ROS2环境变量[reference:8]ros2 run sensevoice_ros2 sensevoice_ros2 --ros-args -p micphone_name:=plughw:1,0 # 运行SenseVoice节点

2.另开一个新终端,查看话题列表
source /opt/ros/humble/setup.bashros2 topic list
3.修改命令词
sudo nano /opt/tros/humble/lib/sensevoice_ros2/config/cmd_word.json

4.运行控制脚本:再开一个终端,在脚本所在目录执行以下命令。
source /opt/ros/humble/setup.bashpython3 led.py
资源推荐
精彩文章推荐
· END ·