Add audio_raw_to_speech, basics of gCloud Speech API - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
DIR Log
DIR Files
DIR Refs
DIR README
---
DIR commit 49da42535f1e1495e42047d6b74981fdb935d712
DIR parent f8d63a649b497a9fa9c647c0ca552ae085abdcc1
HTML Author: HD Moore <x@hdm.io>
Date: Fri, 29 Apr 2016 12:24:34 -0500
Add audio_raw_to_speech, basics of gCloud Speech API
Diffstat:
A bin/audio_raw_to_speech.rb | 76 +++++++++++++++++++++++++++++++
M bin/verify_install.rb | 8 ++++++++
M config/warvox.conf | 8 ++++++++
M lib/warvox/audio/raw.rb | 12 ++++++++++++
M lib/warvox/config.rb | 8 ++++++++
5 files changed, 112 insertions(+), 0 deletions(-)
---
DIR diff --git a/bin/audio_raw_to_speech.rb b/bin/audio_raw_to_speech.rb
@@ -0,0 +1,76 @@
+#!/usr/bin/env ruby
+###################
+
+#
+# Load the library path
+#
+base = __FILE__
+while File.symlink?(base)
+ base = File.expand_path(File.readlink(base), File.dirname(base))
+end
+$:.unshift(File.join(File.expand_path(File.dirname(base)), '..', 'lib'))
+
+require 'warvox'
+
+require 'uri'
+require 'net/http'
+require 'json'
+
+def usage
+ $stderr.puts "Usage: #{$0} <input.raw> <output.json>"
+ exit
+end
+
+#
+# Script
+#
+
+inp = ARGV.shift
+out = ARGV.shift
+
+if (inp and inp == "-h") or not inp
+ usage()
+end
+
+raw = WarVOX::Audio::Raw.from_file(inp)
+res = nil
+flac = raw.to_flac
+akey = WarVOX::Config.gcloud_key
+
+if ! akey
+ $stderr.puts "Error: A gcloud API key needs to be configured"
+ exit(1)
+end
+
+uri = URI('https://speech.googleapis.com/v1/speech:recognize?key=' + akey)
+req = Net::HTTP::Post.new(uri, initheader = {'Content-Type' =>'application/json'})
+
+loop do
+ req.body =
+ {
+ "initialRequest" => {
+ "encoding" => "FLAC",
+ "sampleRate" => 16000,
+ },
+ "audioRequest" => {
+ "content" => [flac].pack("m*").gsub(/\s+/, '')
+ }
+ }.to_json
+
+
+ http = Net::HTTP.new(uri.hostname, uri.port)
+ http.use_ssl = true
+ res = http.request(req)
+
+ break if res.code.to_s == "200"
+ $stderr.puts "Retrying due to #{res.code} #{res.message}..."
+ sleep(1)
+end
+
+if out
+ ::File.open(out, "wb") do |fd|
+ fd.write(res.body)
+ end
+else
+ $stdout.write(res.body)
+end
DIR diff --git a/bin/verify_install.rb b/bin/verify_install.rb
@@ -56,6 +56,14 @@ end
puts "[*] The LAME binary appears to be available"
+if(not WarVOX::Config.tool_path('sox'))
+ puts "[*] ERROR: The 'sox binary could not be installed"
+ puts "[*] $ sudo apt-get install sox"
+ exit
+end
+puts "[*] The SOX binary appears to be available"
+
+
puts " "
puts "[*] Congratulations! You are almost ready to run WarVOX"
puts " "
DIR diff --git a/config/warvox.conf b/config/warvox.conf
@@ -8,8 +8,10 @@
tools:
gnuplot: gnuplot
lame: lame
+ sox: sox
iaxrecord: "%BASE%/bin/iaxrecord.rb"
+
#
# Maximum processing jobs, normally this is set to your processor core count,
# but you can limit it further here. Keep in mind that each analysis job also
@@ -32,3 +34,9 @@ classifiers: "%BASE%/config/classifiers"
# Configure the signature directory
#
signatures: "%BASE%/config/signatures"
+
+#
+# Configure cloud integrations
+#
+apis:
+ gcloud: "%BASE%/config/gcloud.key"
DIR diff --git a/lib/warvox/audio/raw.rb b/lib/warvox/audio/raw.rb
@@ -1,3 +1,5 @@
+require 'open3'
+
module WarVOX
module Audio
class Raw
@@ -72,6 +74,16 @@ class Raw
raw
end
+ def to_flac
+ sox = WarVOX::Config.tool_path('sox')
+ if ! sox
+ raise RuntimeError, "The sox binary could not be find, make sure it is installed"
+ end
+
+ o, s = Open3.capture2("#{sox} -t raw -b 16 -e signed-integer -r 8000 - -t flac -r 16000 -", :binmode => true, :stdin_data => self.to_raw)
+ o
+ end
+
def to_flow(opts={})
lo_lim = (opts[:lo_lim] || 100).to_i
DIR diff --git a/lib/warvox/config.rb b/lib/warvox/config.rb
@@ -49,6 +49,14 @@ module Config
end
+ def self.gcloud_key
+ info = YAML.load_file(WarVOX::Conf)
+ return nil if not info
+ return nil if not info['apis']
+ return nil if not info['apis']['gcloud']
+ ::File.read(File.expand_path(info['apis']['gcloud'].gsub('%BASE%', WarVOX::Base)))
+ end
+
def self.signatures_path
info = YAML.load_file(WarVOX::Conf)
return nil if not info