2 # export AUDIODEV=plughw:CARD=ArrayUAC10,0
3 # rec -q -t alsa -c 1 -b 16 -r 16000 -t wav - silence -l 1 0.1 0.3% -1 2.0 0.3% | ./asr_vosk.rb -
6 require 'websocket-eventmachine-client'
9 require 'std_msgs/String'
11 KEYWORDS = ["wild thumper"]
14 "phrase_list": ["angle", "backward", "by", "centimeter", "compass", "current", "decrease", "default", "degree", "down", "eight", "eighteen", "eighty", "eleven", "fifteen", "fifty", "five", "forty", "forward", "four", "fourteen", "get", "go", "hundred", "increase", "left", "light", "lights", "meter", "mic", "minus", "motion", "mute", "nine", "nineteen", "ninety", "off", "on", "one", "position", "pressure", "right", "secure", "set", "seven", "seventeen", "seventy", "silence", "six", "sixteen", "sixty", "speed", "stop", "temp", "temperature", "ten", "thirteen", "thirty", "three", "to", "turn", "twelve", "twenty", "two", "up", "velocity", "voltage", "volume", "wild thumper", "zero"],
15 "sample_rate": 16000.0
21 @logger = Logger.new(STDOUT)
22 @commands_enabled = false
23 @publisher = node.advertise('asr_result', Std_msgs::String)
27 Signal.trap("INT") { send_eof }
28 @ws = WebSocket::EventMachine::Client.connect(:uri => 'ws://192.168.36.4:2700')
31 @ws.send '{"eof" : 1}'
34 # Loop over all input data
37 data = ARGF.read(16000)
39 @ws.send data, :type => :binary
48 @logger.info "Running.."
49 @ws.send CONFIG.to_json
56 @ws.onmessage do |msg, type|
61 @ws.onclose do |code, reason|
62 puts "Disconnected with status code: #{code}"
68 def handle_result(msg)
69 if msg.has_key? "result"
70 msg["result"].each do |result|
71 @logger.debug "word=" + result["word"]
74 # check for keywords first
76 @logger.debug "text=" + msg["text"]
77 if KEYWORDS.include? text
82 # not a keyword, handle command if enabled
84 final_result(msg["text"])
89 # Enables/Disables the speech command
90 def enable_commands(bEnable)
91 @commands_enabled = bEnable
94 # Resulting speech command
96 @logger.info "final: " + hyp
97 enable_commands(false)
99 # Publish vosk result as ros message
100 msg = Std_msgs::String.new
102 @publisher.publish(msg)
105 def keyword_detect(hyp)
106 @logger.debug "Got keyword: " + hyp
107 enable_commands(true)
112 node = ROS::Node.new('asr_vosk')
113 app = Speak.new(node)