Skip to content

Commit 9e60682

Browse files
committed
Fix missing dependency declaration and use ROS param config
1 parent 7dc7712 commit 9e60682

File tree

4 files changed

+127
-17
lines changed

4 files changed

+127
-17
lines changed

coffee_ws/src/effector_nodes/effector_nodes/tts_node/node.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,38 @@ def __init__(self):
1919
super().__init__('tts_node')
2020
self.get_logger().info("TTS node initialized")
2121

22+
# Declare parameters
23+
self.declare_parameter('voice_id', "KTPVrSVAEUSJRClDzBw7") # Default voice ID
24+
self.declare_parameter('model_id', "eleven_multilingual_v2") # Default model
25+
self.declare_parameter('api_key', '') # Empty by default, will check env var
26+
self.declare_parameter('cooldown_duration', 1.0) # Cooldown in seconds
27+
self.declare_parameter('output_format', 'pcm_24000') # Audio output format
28+
29+
# Get parameters
30+
self.voice_id = self.get_parameter('voice_id').value
31+
self.model_id = self.get_parameter('model_id').value
32+
self.COOLDOWN_DURATION = self.get_parameter('cooldown_duration').value
33+
self.output_format = self.get_parameter('output_format').value
34+
2235
self.service_group = MutuallyExclusiveCallbackGroup()
2336
self.timer_group = MutuallyExclusiveCallbackGroup()
2437

2538
# Cooldown settings
2639
self.cooldown_timer = None
2740
self.in_cooldown = False
28-
self.COOLDOWN_DURATION = 1.0 # seconds
2941

3042
# Initialize Eleven Labs SDK client
31-
api_key = os.environ.get('ELEVEN_LABS_API_KEY')
43+
api_key = self.get_parameter('api_key').value
44+
if not api_key:
45+
api_key = os.environ.get('ELEVEN_LABS_API_KEY')
46+
3247
if not api_key:
33-
self.get_logger().error("ELEVEN_LABS_API_KEY environment variable not set")
34-
raise ValueError("ELEVEN_LABS_API_KEY environment variable is required, refer to the README for more information")
48+
self.get_logger().error("ELEVEN_LABS_API_KEY not set in parameter or environment variable")
49+
raise ValueError("ELEVEN_LABS_API_KEY is required. Set it as a ROS2 parameter or environment variable. Refer to the README for more information")
3550

3651
self.eleven_labs_client = ElevenLabs(api_key=api_key)
3752

38-
self.voice_id = "KTPVrSVAEUSJRClDzBw7" # https://elevenlabs.io/app/voice-library/collections/HXn5AetPOJgAHd2D60mP?voiceId=KTPVrSVAEUSJRClDzBw7
39-
self.model_id = "eleven_multilingual_v2"
40-
41-
self.get_logger().info("Eleven Labs SDK initialized")
53+
self.get_logger().info(f"Eleven Labs SDK initialized with voice: {self.voice_id}, model: {self.model_id}")
4254

4355
self.audio_player = pyaudio.PyAudio()
4456

@@ -75,7 +87,11 @@ def __init__(self):
7587
def publish_status(self):
7688
"""Publish current status information"""
7789
status = {
78-
"health": "ok"
90+
"health": "ok",
91+
"voice_id": self.voice_id,
92+
"model_id": self.model_id,
93+
"is_playing": self.is_playing,
94+
"in_cooldown": self.in_cooldown
7995
}
8096

8197
msg = String()
@@ -120,7 +136,7 @@ def stream_audio_playback(self, text):
120136

121137
# Request PCM audio format (raw audio data)
122138
# pcm_16000 = 16kHz sample rate, pcm_24000 = 24kHz sample rate
123-
output_format = "pcm_24000"
139+
output_format = self.output_format
124140

125141
self.get_logger().info(f"Starting audio streaming with format: {output_format}")
126142

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
#!/usr/bin/env python3
2+
3+
from launch import LaunchDescription
4+
from launch.actions import DeclareLaunchArgument, LogInfo
5+
from launch.substitutions import LaunchConfiguration, TextSubstitution
6+
from launch_ros.actions import Node
7+
8+
9+
def generate_launch_description():
10+
"""Generate launch description for TTS node with configurable parameters."""
11+
12+
# Declare launch arguments
13+
voice_id_arg = DeclareLaunchArgument(
14+
'voice_id',
15+
default_value='KTPVrSVAEUSJRClDzBw7',
16+
description='ElevenLabs voice ID to use for TTS'
17+
)
18+
19+
model_id_arg = DeclareLaunchArgument(
20+
'model_id',
21+
default_value='eleven_multilingual_v2',
22+
description='ElevenLabs model ID to use for TTS'
23+
)
24+
25+
api_key_arg = DeclareLaunchArgument(
26+
'api_key',
27+
default_value='',
28+
description='ElevenLabs API key (leave empty to use ELEVEN_LABS_API_KEY environment variable)'
29+
)
30+
31+
cooldown_duration_arg = DeclareLaunchArgument(
32+
'cooldown_duration',
33+
default_value='1.0',
34+
description='Cooldown duration in seconds between TTS requests'
35+
)
36+
37+
output_format_arg = DeclareLaunchArgument(
38+
'output_format',
39+
default_value='pcm_24000',
40+
description='Audio output format (pcm_16000, pcm_24000, etc.)'
41+
)
42+
43+
# TTS Node
44+
tts_node = Node(
45+
package='effector_nodes',
46+
executable='tts_node',
47+
name='tts_node',
48+
output='screen',
49+
emulate_tty=True,
50+
parameters=[{
51+
'voice_id': LaunchConfiguration('voice_id'),
52+
'model_id': LaunchConfiguration('model_id'),
53+
'api_key': LaunchConfiguration('api_key'),
54+
'cooldown_duration': LaunchConfiguration('cooldown_duration'),
55+
'output_format': LaunchConfiguration('output_format'),
56+
}]
57+
)
58+
59+
# Log info about the launch
60+
log_info = LogInfo(
61+
msg=[
62+
'Starting TTS Node with voice: ',
63+
LaunchConfiguration('voice_id'),
64+
' and model: ',
65+
LaunchConfiguration('model_id')
66+
]
67+
)
68+
69+
return LaunchDescription([
70+
voice_id_arg,
71+
model_id_arg,
72+
api_key_arg,
73+
cooldown_duration_arg,
74+
output_format_arg,
75+
log_info,
76+
tts_node
77+
])

coffee_ws/src/effector_nodes/package.xml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,22 @@
33
<package format="3">
44
<name>effector_nodes</name>
55
<version>0.0.0</version>
6-
<description>TODO: Package description</description>
7-
<maintainer email="Marcus.Arnett10@gmail.com">vr-workstation-2</maintainer>
8-
<license>TODO: License declaration</license>
6+
<description>ROS2 package providing Text-to-Speech (TTS) effector nodes for the Coffee Buddy robot system using ElevenLabs API</description>
7+
<maintainer email="marcus@opendive.io">vr-workstation-2</maintainer>
8+
<license>Apache-2.0</license>
99

10+
<!-- Core ROS2 dependencies -->
11+
<depend>rclpy</depend>
12+
<depend>std_msgs</depend>
13+
14+
<!-- Coffee Buddy specific message dependencies -->
15+
<depend>coffee_buddy_msgs</depend>
16+
<depend>shared_configs</depend>
17+
18+
<!-- System dependencies for audio -->
19+
<depend>python3-pyaudio</depend>
20+
21+
<!-- Test dependencies -->
1022
<test_depend>ament_copyright</test_depend>
1123
<test_depend>ament_flake8</test_depend>
1224
<test_depend>ament_pep257</test_depend>

coffee_ws/src/effector_nodes/setup.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@
1010
('share/ament_index/resource_index/packages',
1111
['resource/' + package_name]),
1212
('share/' + package_name, ['package.xml']),
13+
('share/' + package_name + '/launch', ['launch/tts_node.launch.py']),
14+
],
15+
install_requires=[
16+
'setuptools',
17+
'elevenlabs==1.57.0',
18+
'PyAudio==0.2.14',
1319
],
14-
install_requires=['setuptools'],
1520
zip_safe=True,
1621
maintainer='vr-workstation-2',
17-
maintainer_email='Marcus.Arnett10@gmail.com',
18-
description='TODO: Package description',
19-
license='TODO: License declaration',
22+
maintainer_email='marcus@opendive.io',
23+
description='ROS2 package providing Text-to-Speech (TTS) effector nodes for the Coffee Buddy robot system using ElevenLabs API',
24+
license='Apache-2.0',
2025
tests_require=['pytest'],
2126
entry_points={
2227
'console_scripts': [

0 commit comments

Comments
 (0)