respeaker_node.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # Author: furushchev <furushchev@jsk.imi.i.u-tokyo.ac.jp>
4 
5 import angles
6 from contextlib import contextmanager
7 import usb.core
8 import usb.util
9 import pyaudio
10 import math
11 import numpy as np
12 import tf.transformations as T
13 import os
14 import rospy
15 import struct
16 import sys
17 import time
18 from audio_common_msgs.msg import AudioData
19 from geometry_msgs.msg import PoseStamped
20 from std_msgs.msg import Bool, Int32, ColorRGBA
21 from dynamic_reconfigure.server import Server
22 try:
23  from pixel_ring import usb_pixel_ring_v2
24 except IOError as e:
25  rospy.logerr(e)
26  raise RuntimeError("Check the device is connected and recognized")
27 
28 try:
29  from respeaker_ros.cfg import RespeakerConfig
30 except Exception as e:
31  rospy.logerr(e)
32  raise RuntimeError("Need to run respeaker_gencfg.py first")
33 
34 
35 # suppress error messages from ALSA
36 # https://stackoverflow.com/questions/7088672/pyaudio-working-but-spits-out-error-messages-each-time
37 # https://stackoverflow.com/questions/36956083/how-can-the-terminal-output-of-executables-run-by-python-functions-be-silenced-i
38 @contextmanager
39 def ignore_stderr(enable=True):
40  if enable:
41  devnull = None
42  try:
43  devnull = os.open(os.devnull, os.O_WRONLY)
44  stderr = os.dup(2)
45  sys.stderr.flush()
46  os.dup2(devnull, 2)
47  try:
48  yield
49  finally:
50  os.dup2(stderr, 2)
51  os.close(stderr)
52  finally:
53  if devnull is not None:
54  os.close(devnull)
55  else:
56  yield
57 
58 
59 # Partly copied from https://github.com/respeaker/usb_4_mic_array
60 # parameter list
61 # name: (id, offset, type, max, min , r/w, info)
62 PARAMETERS = {
63  'AECFREEZEONOFF': (18, 7, 'int', 1, 0, 'rw', 'Adaptive Echo Canceler updates inhibit.', '0 = Adaptation enabled', '1 = Freeze adaptation, filter only'),
64  'AECNORM': (18, 19, 'float', 16, 0.25, 'rw', 'Limit on norm of AEC filter coefficients'),
65  'AECPATHCHANGE': (18, 25, 'int', 1, 0, 'ro', 'AEC Path Change Detection.', '0 = false (no path change detected)', '1 = true (path change detected)'),
66  'RT60': (18, 26, 'float', 0.9, 0.25, 'ro', 'Current RT60 estimate in seconds'),
67  'HPFONOFF': (18, 27, 'int', 3, 0, 'rw', 'High-pass Filter on microphone signals.', '0 = OFF', '1 = ON - 70 Hz cut-off', '2 = ON - 125 Hz cut-off', '3 = ON - 180 Hz cut-off'),
68  'RT60ONOFF': (18, 28, 'int', 1, 0, 'rw', 'RT60 Estimation for AES. 0 = OFF 1 = ON'),
69  'AECSILENCELEVEL': (18, 30, 'float', 1, 1e-09, 'rw', 'Threshold for signal detection in AEC [-inf .. 0] dBov (Default: -80dBov = 10log10(1x10-8))'),
70  'AECSILENCEMODE': (18, 31, 'int', 1, 0, 'ro', 'AEC far-end silence detection status. ', '0 = false (signal detected) ', '1 = true (silence detected)'),
71  'AGCONOFF': (19, 0, 'int', 1, 0, 'rw', 'Automatic Gain Control. ', '0 = OFF ', '1 = ON'),
72  'AGCMAXGAIN': (19, 1, 'float', 1000, 1, 'rw', 'Maximum AGC gain factor. ', '[0 .. 60] dB (default 30dB = 20log10(31.6))'),
73  'AGCDESIREDLEVEL': (19, 2, 'float', 0.99, 1e-08, 'rw', 'Target power level of the output signal. ', '[-inf .. 0] dBov (default: -23dBov = 10log10(0.005))'),
74  'AGCGAIN': (19, 3, 'float', 1000, 1, 'rw', 'Current AGC gain factor. ', '[0 .. 60] dB (default: 0.0dB = 20log10(1.0))'),
75  'AGCTIME': (19, 4, 'float', 1, 0.1, 'rw', 'Ramps-up / down time-constant in seconds.'),
76  'CNIONOFF': (19, 5, 'int', 1, 0, 'rw', 'Comfort Noise Insertion.', '0 = OFF', '1 = ON'),
77  'FREEZEONOFF': (19, 6, 'int', 1, 0, 'rw', 'Adaptive beamformer updates.', '0 = Adaptation enabled', '1 = Freeze adaptation, filter only'),
78  'STATNOISEONOFF': (19, 8, 'int', 1, 0, 'rw', 'Stationary noise suppression.', '0 = OFF', '1 = ON'),
79  'GAMMA_NS': (19, 9, 'float', 3, 0, 'rw', 'Over-subtraction factor of stationary noise. min .. max attenuation'),
80  'MIN_NS': (19, 10, 'float', 1, 0, 'rw', 'Gain-floor for stationary noise suppression.', '[-inf .. 0] dB (default: -16dB = 20log10(0.15))'),
81  'NONSTATNOISEONOFF': (19, 11, 'int', 1, 0, 'rw', 'Non-stationary noise suppression.', '0 = OFF', '1 = ON'),
82  'GAMMA_NN': (19, 12, 'float', 3, 0, 'rw', 'Over-subtraction factor of non- stationary noise. min .. max attenuation'),
83  'MIN_NN': (19, 13, 'float', 1, 0, 'rw', 'Gain-floor for non-stationary noise suppression.', '[-inf .. 0] dB (default: -10dB = 20log10(0.3))'),
84  'ECHOONOFF': (19, 14, 'int', 1, 0, 'rw', 'Echo suppression.', '0 = OFF', '1 = ON'),
85  'GAMMA_E': (19, 15, 'float', 3, 0, 'rw', 'Over-subtraction factor of echo (direct and early components). min .. max attenuation'),
86  'GAMMA_ETAIL': (19, 16, 'float', 3, 0, 'rw', 'Over-subtraction factor of echo (tail components). min .. max attenuation'),
87  'GAMMA_ENL': (19, 17, 'float', 5, 0, 'rw', 'Over-subtraction factor of non-linear echo. min .. max attenuation'),
88  'NLATTENONOFF': (19, 18, 'int', 1, 0, 'rw', 'Non-Linear echo attenuation.', '0 = OFF', '1 = ON'),
89  'NLAEC_MODE': (19, 20, 'int', 2, 0, 'rw', 'Non-Linear AEC training mode.', '0 = OFF', '1 = ON - phase 1', '2 = ON - phase 2'),
90  'SPEECHDETECTED': (19, 22, 'int', 1, 0, 'ro', 'Speech detection status.', '0 = false (no speech detected)', '1 = true (speech detected)'),
91  'FSBUPDATED': (19, 23, 'int', 1, 0, 'ro', 'FSB Update Decision.', '0 = false (FSB was not updated)', '1 = true (FSB was updated)'),
92  'FSBPATHCHANGE': (19, 24, 'int', 1, 0, 'ro', 'FSB Path Change Detection.', '0 = false (no path change detected)', '1 = true (path change detected)'),
93  'TRANSIENTONOFF': (19, 29, 'int', 1, 0, 'rw', 'Transient echo suppression.', '0 = OFF', '1 = ON'),
94  'VOICEACTIVITY': (19, 32, 'int', 1, 0, 'ro', 'VAD voice activity status.', '0 = false (no voice activity)', '1 = true (voice activity)'),
95  'STATNOISEONOFF_SR': (19, 33, 'int', 1, 0, 'rw', 'Stationary noise suppression for ASR.', '0 = OFF', '1 = ON'),
96  'NONSTATNOISEONOFF_SR': (19, 34, 'int', 1, 0, 'rw', 'Non-stationary noise suppression for ASR.', '0 = OFF', '1 = ON'),
97  'GAMMA_NS_SR': (19, 35, 'float', 3, 0, 'rw', 'Over-subtraction factor of stationary noise for ASR. ', '[0.0 .. 3.0] (default: 1.0)'),
98  'GAMMA_NN_SR': (19, 36, 'float', 3, 0, 'rw', 'Over-subtraction factor of non-stationary noise for ASR. ', '[0.0 .. 3.0] (default: 1.1)'),
99  'MIN_NS_SR': (19, 37, 'float', 1, 0, 'rw', 'Gain-floor for stationary noise suppression for ASR.', '[-inf .. 0] dB (default: -16dB = 20log10(0.15))'),
100  'MIN_NN_SR': (19, 38, 'float', 1, 0, 'rw', 'Gain-floor for non-stationary noise suppression for ASR.', '[-inf .. 0] dB (default: -10dB = 20log10(0.3))'),
101  'GAMMAVAD_SR': (19, 39, 'float', 1000, 0, 'rw', 'Set the threshold for voice activity detection.', '[-inf .. 60] dB (default: 3.5dB 20log10(1.5))'),
102  # 'KEYWORDDETECT': (20, 0, 'int', 1, 0, 'ro', 'Keyword detected. Current value so needs polling.'),
103  'DOAANGLE': (21, 0, 'int', 359, 0, 'ro', 'DOA angle. Current value. Orientation depends on build configuration.')
104 }
105 
106 
107 class RespeakerInterface(object):
108  VENDOR_ID = 0x2886
109  PRODUCT_ID = 0x0018
110  TIMEOUT = 100000
111 
112  def __init__(self):
113  self.dev = usb.core.find(idVendor=self.VENDOR_ID,
114  idProduct=self.PRODUCT_ID)
115  if not self.dev:
116  raise RuntimeError("Failed to find Respeaker device")
117  rospy.loginfo("Initializing Respeaker device")
118  self.dev.reset()
119  self.pixel_ring = usb_pixel_ring_v2.PixelRing(self.dev)
120  self.set_led_think()
121  time.sleep(5) # it will take 5 seconds to re-recognize as audio device
122  self.set_led_trace()
123  rospy.loginfo("Respeaker device initialized (Version: %s)" % self.version)
124 
125  def __del__(self):
126  try:
127  self.close()
128  except:
129  pass
130  finally:
131  self.dev = None
132 
133  def write(self, name, value):
134  try:
135  data = PARAMETERS[name]
136  except KeyError:
137  return
138 
139  if data[5] == 'ro':
140  raise ValueError('{} is read-only'.format(name))
141 
142  id = data[0]
143 
144  # 4 bytes offset, 4 bytes value, 4 bytes type
145  if data[2] == 'int':
146  payload = struct.pack(b'iii', data[1], int(value), 1)
147  else:
148  payload = struct.pack(b'ifi', data[1], float(value), 0)
149 
150  self.dev.ctrl_transfer(
151  usb.util.CTRL_OUT | usb.util.CTRL_TYPE_VENDOR | usb.util.CTRL_RECIPIENT_DEVICE,
152  0, 0, id, payload, self.TIMEOUT)
153 
154  def read(self, name):
155  try:
156  data = PARAMETERS[name]
157  except KeyError:
158  return
159 
160  id = data[0]
161 
162  cmd = 0x80 | data[1]
163  if data[2] == 'int':
164  cmd |= 0x40
165 
166  length = 8
167 
168  try:
169  response = self.dev.ctrl_transfer(
170  usb.util.CTRL_IN | usb.util.CTRL_TYPE_VENDOR | usb.util.CTRL_RECIPIENT_DEVICE,
171  0, cmd, id, length, self.TIMEOUT)
172  except usb.core.USBError as e:
173  rospy.logerr(e)
174  rospy.signal_shutdown('Shutdown this node because of USBError')
175 
176  if sys.version_info.major == 2:
177  response = struct.unpack(b'ii', response.tostring())
178  else:
179  response = struct.unpack(b'ii', response.tobytes())
180 
181  if data[2] == 'int':
182  result = response[0]
183  else:
184  result = response[0] * (2.**response[1])
185 
186  return result
187 
188  def set_led_think(self):
189  self.pixel_ring.set_brightness(10)
190  self.pixel_ring.think()
191 
192  def set_led_trace(self):
193  self.pixel_ring.set_brightness(20)
194  self.pixel_ring.trace()
195 
196  def set_led_color(self, r, g, b, a):
197  self.pixel_ring.set_brightness(int(20 * a))
198  self.pixel_ring.set_color(r=int(r*255), g=int(g*255), b=int(b*255))
199 
200  def set_vad_threshold(self, db):
201  self.write('GAMMAVAD_SR', db)
202 
203  def is_voice(self):
204  return self.read('VOICEACTIVITY')
205 
206  @property
207  def direction(self):
208  return self.read('DOAANGLE')
209 
210  @property
211  def version(self):
212  return self.dev.ctrl_transfer(
213  usb.util.CTRL_IN | usb.util.CTRL_TYPE_VENDOR | usb.util.CTRL_RECIPIENT_DEVICE,
214  0, 0x80, 0, 1, self.TIMEOUT)[0]
215 
216  def close(self):
217  """
218  close the interface
219  """
220  usb.util.dispose_resources(self.dev)
221 
222 
223 class RespeakerAudio(object):
224  def __init__(self, on_audio, channel=0, suppress_error=True):
225  self.on_audio = on_audio
226  with ignore_stderr(enable=suppress_error):
227  self.pyaudio = pyaudio.PyAudio()
228  self.channels = None
229  self.channel = channel
230  self.device_index = None
231  self.rate = 16000
232  self.bitwidth = 2
233  self.bitdepth = 16
234 
235  # find device
236  count = self.pyaudio.get_device_count()
237  rospy.logdebug("%d audio devices found" % count)
238  for i in range(count):
239  info = self.pyaudio.get_device_info_by_index(i)
240  name = info["name"].encode("utf-8")
241  chan = info["maxInputChannels"]
242  rospy.logdebug(" - %d: %s" % (i, name))
243  if name.lower().find(b"respeaker") >= 0:
244  self.channels = chan
245  self.device_index = i
246  rospy.loginfo("Found %d: %s (channels: %d)" % (i, name, chan))
247  break
248  if self.device_index is None:
249  rospy.logwarn("Failed to find respeaker device by name. Using default input")
250  info = self.pyaudio.get_default_input_device_info()
251  self.channels = info["maxInputChannels"]
252  self.device_index = info["index"]
253 
254  if self.channels != 6:
255  rospy.logwarn("%d channel is found for respeaker" % self.channels)
256  rospy.logwarn("You may have to update firmware.")
257  self.channel = min(self.channels - 1, max(0, self.channel))
258 
259  self.stream = self.pyaudio.open(
260  input=True, start=False,
261  format=pyaudio.paInt16,
262  channels=self.channels,
263  rate=self.rate,
264  frames_per_buffer=1024,
265  stream_callback=self.stream_callback,
266  input_device_index=self.device_index,
267  )
268 
269  def __del__(self):
270  self.stop()
271  try:
272  self.stream.close()
273  except:
274  pass
275  finally:
276  self.stream = None
277  try:
278  self.pyaudio.terminate()
279  except:
280  pass
281 
282  def stream_callback(self, in_data, frame_count, time_info, status):
283  # split channel
284  data = np.frombuffer(in_data, dtype=np.int16)
285  chunk_per_channel = int(len(data) / self.channels)
286  data = np.reshape(data, (chunk_per_channel, self.channels))
287  chan_data = data[:, self.channel]
288  # invoke callback
289  self.on_audio(chan_data.tobytes())
290  return None, pyaudio.paContinue
291 
292  def start(self):
293  if self.stream.is_stopped():
294  self.stream.start_stream()
295 
296  def stop(self):
297  if self.stream.is_active():
298  self.stream.stop_stream()
299 
300 
301 class RespeakerNode(object):
302  def __init__(self):
303  rospy.on_shutdown(self.on_shutdown)
304  self.update_rate = rospy.get_param("~update_rate", 10.0)
305  self.sensor_frame_id = rospy.get_param("~sensor_frame_id", "respeaker_base")
306  self.doa_xy_offset = rospy.get_param("~doa_xy_offset", 0.0)
307  self.doa_yaw_offset = rospy.get_param("~doa_yaw_offset", 90.0)
308  self.speech_prefetch = rospy.get_param("~speech_prefetch", 0.5)
309  self.speech_continuation = rospy.get_param("~speech_continuation", 0.5)
310  self.speech_max_duration = rospy.get_param("~speech_max_duration", 7.0)
311  self.speech_min_duration = rospy.get_param("~speech_min_duration", 0.1)
312  suppress_pyaudio_error = rospy.get_param("~suppress_pyaudio_error", True)
313  #
316  self.is_speeching = False
317  self.speech_stopped = rospy.Time(0)
318  self.prev_is_voice = None
319  self.prev_doa = None
320  # advertise
321  self.pub_vad = rospy.Publisher("is_speeching", Bool, queue_size=1, latch=True)
322  self.pub_doa_raw = rospy.Publisher("sound_direction", Int32, queue_size=1, latch=True)
323  self.pub_doa = rospy.Publisher("sound_localization", PoseStamped, queue_size=1, latch=True)
324  self.pub_audio = rospy.Publisher("audio", AudioData, queue_size=10)
325  self.pub_speech_audio = rospy.Publisher("speech_audio", AudioData, queue_size=10)
326  # init config
327  self.config = None
328  self.dyn_srv = Server(RespeakerConfig, self.on_config)
329  # start
330  self.respeaker_audio = RespeakerAudio(self.on_audio, suppress_error=suppress_pyaudio_error)
332  self.speech_prefetch * self.respeaker_audio.rate * self.respeaker_audio.bitdepth / 8.0)
334  self.respeaker_audio.start()
335  self.info_timer = rospy.Timer(rospy.Duration(1.0 / self.update_rate),
336  self.on_timer)
337  self.timer_led = None
338  self.sub_led = rospy.Subscriber("status_led", ColorRGBA, self.on_status_led)
339 
340  def on_shutdown(self):
341  try:
342  self.respeaker.close()
343  except:
344  pass
345  finally:
346  self.respeaker = None
347  try:
348  self.respeaker_audio.stop()
349  except:
350  pass
351  finally:
352  self.respeaker_audio = None
353 
354  def on_config(self, config, level):
355  if self.config is None:
356  # first get value from device and set them as ros parameters
357  for name in config.keys():
358  config[name] = self.respeaker.read(name)
359  else:
360  # if there is different values, write them to device
361  for name, value in config.items():
362  prev_val = self.config[name]
363  if prev_val != value:
364  self.respeaker.write(name, value)
365  self.config = config
366  return config
367 
368  def on_status_led(self, msg):
369  self.respeaker.set_led_color(r=msg.r, g=msg.g, b=msg.b, a=msg.a)
370  if self.timer_led and self.timer_led.is_alive():
371  self.timer_led.shutdown()
372  self.timer_led = rospy.Timer(rospy.Duration(3.0),
373  lambda e: self.respeaker.set_led_trace(),
374  oneshot=True)
375 
376  def on_audio(self, data):
377  self.pub_audio.publish(AudioData(data=data))
378  if self.is_speeching:
379  if len(self.speech_audio_buffer) == 0:
381  self.speech_audio_buffer += data
382  else:
383  self.speech_prefetch_buffer += data
385 
386  def on_timer(self, event):
387  stamp = event.current_real or rospy.Time.now()
388  is_voice = self.respeaker.is_voice()
389  doa_rad = math.radians(self.respeaker.direction - 180.0)
391  doa_rad, math.radians(self.doa_yaw_offset))
392  doa = int(math.degrees(doa_rad))
393 
394  # vad
395  if is_voice != self.prev_is_voice:
396  self.pub_vad.publish(Bool(data=is_voice))
397  self.prev_is_voice = is_voice
398 
399  # doa
400  if doa != self.prev_doa:
401  self.pub_doa_raw.publish(Int32(data=doa))
402  self.prev_doa = doa
403 
404  msg = PoseStamped()
405  msg.header.frame_id = self.sensor_frame_id
406  msg.header.stamp = stamp
407  ori = T.quaternion_from_euler(math.radians(doa), 0, 0)
408  msg.pose.position.x = self.doa_xy_offset * np.cos(doa_rad)
409  msg.pose.position.y = self.doa_xy_offset * np.sin(doa_rad)
410  msg.pose.orientation.w = ori[0]
411  msg.pose.orientation.x = ori[1]
412  msg.pose.orientation.y = ori[2]
413  msg.pose.orientation.z = ori[3]
414  self.pub_doa.publish(msg)
415 
416  # speech audio
417  if is_voice:
418  self.speech_stopped = stamp
419  if stamp - self.speech_stopped < rospy.Duration(self.speech_continuation):
420  self.is_speeching = True
421  elif self.is_speeching:
422  buf = self.speech_audio_buffer
423  self.speech_audio_buffer = b""
424  self.is_speeching = False
425  duration = 8.0 * len(buf) * self.respeaker_audio.bitwidth
426  duration = duration / self.respeaker_audio.rate / self.respeaker_audio.bitdepth
427  rospy.loginfo("Speech detected for %.3f seconds" % duration)
428  if self.speech_min_duration <= duration < self.speech_max_duration:
429 
430  self.pub_speech_audio.publish(AudioData(data=buf))
431 
432 
433 if __name__ == '__main__':
434  rospy.init_node("respeaker_node")
436  rospy.spin()
respeaker_node.RespeakerNode.speech_prefetch
speech_prefetch
Definition: respeaker_node.py:308
respeaker_node.RespeakerNode.timer_led
timer_led
Definition: respeaker_node.py:337
respeaker_node.RespeakerAudio.__init__
def __init__(self, on_audio, channel=0, suppress_error=True)
Definition: respeaker_node.py:224
respeaker_node.RespeakerAudio.channel
channel
Definition: respeaker_node.py:229
respeaker_node.RespeakerAudio
Definition: respeaker_node.py:223
respeaker_node.RespeakerAudio.bitdepth
bitdepth
Definition: respeaker_node.py:233
respeaker_node.RespeakerAudio.bitwidth
bitwidth
Definition: respeaker_node.py:232
respeaker_node.RespeakerNode.info_timer
info_timer
Definition: respeaker_node.py:335
respeaker_node.RespeakerAudio.pyaudio
pyaudio
Definition: respeaker_node.py:227
respeaker_node.RespeakerNode.pub_doa
pub_doa
Definition: respeaker_node.py:323
respeaker_node.RespeakerInterface.version
def version(self)
Definition: respeaker_node.py:211
respeaker_node.RespeakerInterface.close
def close(self)
Definition: respeaker_node.py:216
respeaker_node.RespeakerNode.pub_doa_raw
pub_doa_raw
Definition: respeaker_node.py:322
respeaker_node.RespeakerNode.__init__
def __init__(self)
Definition: respeaker_node.py:302
respeaker_node.RespeakerNode.speech_continuation
speech_continuation
Definition: respeaker_node.py:309
respeaker_node.RespeakerNode.dyn_srv
dyn_srv
Definition: respeaker_node.py:328
respeaker_node.RespeakerInterface.VENDOR_ID
int VENDOR_ID
Definition: respeaker_node.py:108
respeaker_node.RespeakerNode.on_shutdown
def on_shutdown(self)
Definition: respeaker_node.py:340
respeaker_node.RespeakerNode.on_status_led
def on_status_led(self, msg)
Definition: respeaker_node.py:368
respeaker_node.RespeakerNode.pub_speech_audio
pub_speech_audio
Definition: respeaker_node.py:325
respeaker_node.RespeakerNode.doa_yaw_offset
doa_yaw_offset
Definition: respeaker_node.py:307
respeaker_node.RespeakerNode.is_speeching
is_speeching
Definition: respeaker_node.py:316
respeaker_node.RespeakerNode.respeaker_audio
respeaker_audio
Definition: respeaker_node.py:330
respeaker_node.RespeakerInterface.__del__
def __del__(self)
Definition: respeaker_node.py:125
respeaker_node.RespeakerNode.speech_prefetch_bytes
speech_prefetch_bytes
Definition: respeaker_node.py:331
respeaker_node.RespeakerNode.sensor_frame_id
sensor_frame_id
Definition: respeaker_node.py:305
respeaker_node.RespeakerNode.update_rate
update_rate
Definition: respeaker_node.py:304
respeaker_node.RespeakerNode.speech_prefetch_buffer
speech_prefetch_buffer
Definition: respeaker_node.py:333
respeaker_node.RespeakerInterface.pixel_ring
pixel_ring
Definition: respeaker_node.py:119
respeaker_node.RespeakerAudio.stream_callback
def stream_callback(self, in_data, frame_count, time_info, status)
Definition: respeaker_node.py:282
respeaker_node.RespeakerNode.speech_audio_buffer
speech_audio_buffer
Definition: respeaker_node.py:315
respeaker_node.RespeakerInterface.set_vad_threshold
def set_vad_threshold(self, db)
Definition: respeaker_node.py:200
respeaker_node.RespeakerAudio.channels
channels
Definition: respeaker_node.py:228
respeaker_node.RespeakerInterface.dev
dev
Definition: respeaker_node.py:113
respeaker_node.RespeakerAudio.on_audio
on_audio
Definition: respeaker_node.py:225
respeaker_node.RespeakerAudio.stop
def stop(self)
Definition: respeaker_node.py:296
respeaker_node.RespeakerAudio.__del__
def __del__(self)
Definition: respeaker_node.py:269
respeaker_node.RespeakerNode.sub_led
sub_led
Definition: respeaker_node.py:338
respeaker_node.RespeakerInterface
Definition: respeaker_node.py:107
respeaker_node.RespeakerInterface.write
def write(self, name, value)
Definition: respeaker_node.py:133
respeaker_node.RespeakerInterface.set_led_trace
def set_led_trace(self)
Definition: respeaker_node.py:192
angles::shortest_angular_distance
def shortest_angular_distance(from_angle, to_angle)
respeaker_node.RespeakerAudio.stream
stream
Definition: respeaker_node.py:259
respeaker_node.RespeakerNode.on_audio
def on_audio(self, data)
Definition: respeaker_node.py:376
respeaker_node.RespeakerNode.config
config
Definition: respeaker_node.py:327
respeaker_node.RespeakerNode
Definition: respeaker_node.py:301
respeaker_node.RespeakerNode.pub_vad
pub_vad
Definition: respeaker_node.py:321
respeaker_node.RespeakerNode.on_config
def on_config(self, config, level)
Definition: respeaker_node.py:354
respeaker_node.RespeakerInterface.is_voice
def is_voice(self)
Definition: respeaker_node.py:203
respeaker_node.RespeakerNode.pub_audio
pub_audio
Definition: respeaker_node.py:324
respeaker_node.RespeakerNode.speech_min_duration
speech_min_duration
Definition: respeaker_node.py:311
respeaker_node.RespeakerAudio.rate
rate
Definition: respeaker_node.py:231
respeaker_node.RespeakerNode.speech_max_duration
speech_max_duration
Definition: respeaker_node.py:310
respeaker_node.RespeakerInterface.PRODUCT_ID
int PRODUCT_ID
Definition: respeaker_node.py:109
respeaker_node.RespeakerInterface.set_led_think
def set_led_think(self)
Definition: respeaker_node.py:188
respeaker_node.RespeakerNode.respeaker
respeaker
Definition: respeaker_node.py:314
respeaker_node.ignore_stderr
def ignore_stderr(enable=True)
Definition: respeaker_node.py:39
respeaker_node.RespeakerInterface.direction
def direction(self)
Definition: respeaker_node.py:207
respeaker_node.RespeakerNode.on_timer
def on_timer(self, event)
Definition: respeaker_node.py:386
respeaker_node.RespeakerInterface.set_led_color
def set_led_color(self, r, g, b, a)
Definition: respeaker_node.py:196
respeaker_node.RespeakerAudio.start
def start(self)
Definition: respeaker_node.py:292
respeaker_node.RespeakerInterface.read
def read(self, name)
Definition: respeaker_node.py:154
respeaker_node.RespeakerNode.speech_stopped
speech_stopped
Definition: respeaker_node.py:317
respeaker_node.RespeakerInterface.__init__
def __init__(self)
Definition: respeaker_node.py:112
respeaker_node.RespeakerAudio.device_index
device_index
Definition: respeaker_node.py:230
respeaker_node.RespeakerInterface.TIMEOUT
int TIMEOUT
Definition: respeaker_node.py:110
respeaker_node.RespeakerNode.prev_doa
prev_doa
Definition: respeaker_node.py:319
respeaker_node.RespeakerNode.prev_is_voice
prev_is_voice
Definition: respeaker_node.py:318
respeaker_node.RespeakerNode.doa_xy_offset
doa_xy_offset
Definition: respeaker_node.py:306


respeaker_ros
Author(s): Yuki Furuta
autogenerated on Wed Mar 2 2022 00:53:30