changed voice-to-text to post on change

master
Jake Wilkinson 2025-11-09 22:23:10 +08:00
parent 98399fc62e
commit 0550422a9d
1 changed files with 21 additions and 11 deletions

View File

@ -28,20 +28,28 @@ latest_result = {"text": ""}
class VoicePublisher(ThreadedNode): class VoicePublisher(ThreadedNode):
def __init__(self): def __init__(self):
super().__init__(package_name, default_rate=5.0) super().__init__(package_name)
self.string_pub = self.create_publisher(String, package_name + '/test_topic', 10) self.string_pub = self.create_publisher(String, package_name + '/test_topic', 10)
self.latest_partial = {"partial": ""} self.prev_partial = ""
self.latest_result = {"text": ""} self.prev_text = ""
self.speech_thread = threading.Thread(target=self.speech_loop, daemon=True) self.speech_thread = threading.Thread(target=self.speech_loop, daemon=True)
self.speech_thread.start() self.speech_thread.start()
def on_tick(self): def publish_if_changed(self, key, new_value):
if key == "partial" and new_value != self.prev_partial:
self.prev_partial = new_value
self._publish(new_value)
elif key == "text" and new_value != self.prev_text:
self.prev_text = new_value
self._publish(new_value)
def _publish(self, data):
msg = String() msg = String()
msg.data = self.latest_partial.get("partial", "") or self.latest_result.get("text", "") msg.data = data
self.string_pub.publish(msg) self.string_pub.publish(msg)
self.get_logger().info(f'Published: {msg.data}') self.get_logger().info(f'Published: {data}')
def speech_loop(self): def speech_loop(self):
model = Model(model_path) model = Model(model_path)
@ -59,12 +67,13 @@ class VoicePublisher(ThreadedNode):
data = q.get() data = q.get()
if rec.AcceptWaveform(data): if rec.AcceptWaveform(data):
result = json.loads(rec.Result()) result = json.loads(rec.Result())
self.latest_result = result text = result.get("text", "")
print(".", result) self.publish_if_changed("text", text)
print(".", text)
else: else:
partial = json.loads(rec.PartialResult()) partial = json.loads(rec.PartialResult()).get("partial", "")
self.latest_partial = partial self.publish_if_changed("partial", partial)
print("...", partial.get("partial", ""), end='\r') print("...", partial, end='\r')
def destroy_node(self): def destroy_node(self):
super().destroy_node() super().destroy_node()
@ -72,6 +81,7 @@ class VoicePublisher(ThreadedNode):
def main(): def main():
rclpy.init() rclpy.init()
node = VoicePublisher() node = VoicePublisher()