URI: 
       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