update @huiyu

This commit is contained in:
NuoDaJia02
2026-01-05 09:53:18 +08:00
parent d8d1cb3a11
commit 14b12e61d5
6 changed files with 106 additions and 0 deletions

21
package.xml Normal file
View File

@@ -0,0 +1,21 @@
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>robot_speaker</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="mzebra@foxmail.com">mzebra</maintainer>
<license>Apache-2.0</license>
<depend>rclpy</depend>
<depend>example_interfaces</depend>
<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend>
<test_depend>python3-pytest</test_depend>
<export>
<build_type>ament_python</build_type>
</export>
</package>

0
resource/robot_speaker Normal file
View File

View File

View File

@@ -0,0 +1,55 @@
import rclpy
from rclpy.node import Node
from example_interfaces.msg import String
import threading
from queue import Queue
import time
import espeakng
import pyttsx3
class RobotSpeakerNode(Node):
def __init__(self, node_name):
super().__init__(node_name)
self.novels_queue_ = Queue()
self.novel_subscriber_ = self.create_subscription(
String, 'robot_msg', self.novel_callback, 10)
self.speech_thread_ = threading.Thread(target=self.speak_thread)
self.speech_thread_.start()
def novel_callback(self, msg):
self.novels_queue_.put(msg.data)
def speak_thread(self):
# 初始化引擎
engine = pyttsx3.init()
# 调整参数
engine.setProperty('rate', 150) # 语速150更自然
engine.setProperty('volume', 1.0) # 音量0.0-1.0
# 选择中文音色(修正:使用 languages 属性,且是列表)
voices = engine.getProperty('voices')
for voice in voices:
# 检查语音支持的语言列表中是否包含中文('zh' 或 'zh-CN' 等)
if any('zh' in lang for lang in voice.languages):
engine.setProperty('voice', voice.id)
self.get_logger().info(f'已选择中文语音:{voice.id}')
break
else:
self.get_logger().warning('未找到中文语音库,将使用默认语音')
while rclpy.ok():
if self.novels_queue_.qsize() > 0:
text = self.novels_queue_.get()
engine.say(text)
engine.runAndWait() # 等待语音播放完成
else:
time.sleep(0.5)
def main(args=None):
rclpy.init(args=args)
node = RobotSpeakerNode("robot_speaker_node")
rclpy.spin(node)
rclpy.shutdown()

4
setup.cfg Normal file
View File

@@ -0,0 +1,4 @@
[develop]
script_dir=$base/lib/robot_speaker
[install]
install_scripts=$base/lib/robot_speaker

26
setup.py Normal file
View File

@@ -0,0 +1,26 @@
from setuptools import find_packages, setup
package_name = 'robot_speaker'
setup(
name=package_name,
version='0.0.0',
packages=[package_name],
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='mzebra',
maintainer_email='mzebra@foxmail.com',
description='TODO: Package description',
license='Apache-2.0',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'robot_speaker_node=robot_speaker.robot_speaker_node:main'
],
},
)