sbire 0.0.8 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/sbire +1 -1
- data/lib/sbire.rb +9 -91
- data/lib/sbire/audio_converter.rb +72 -0
- data/lib/sbire/audio_recorder.rb +23 -0
- data/lib/sbire/command.rb +84 -0
- data/lib/sbire/command_manager.rb +29 -0
- data/lib/sbire/notifier.rb +10 -0
- data/lib/sbire/os.rb +25 -0
- data/lib/sbire/pid_manager.rb +20 -0
- data/lib/sbire/save_manager.rb +36 -0
- data/lib/sbire/sbire_config.rb +44 -0
- metadata +17 -20
- data/lib/audio_converter.rb +0 -70
- data/lib/audio_recorder.rb +0 -21
- data/lib/command_manager.rb +0 -27
- data/lib/notifier.rb +0 -8
- data/lib/os.rb +0 -23
- data/lib/pid_manager.rb +0 -12
- data/lib/save_manager.rb +0 -34
- data/lib/sbire_config.rb +0 -42
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 23a66e9330db17e711a672a9f27b315383b4adbb
|
4
|
+
data.tar.gz: ccfd9923fbf7e9eef0f4c6dbba29a7c58d6076ca
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6a41d6e3dc882502f8bddc81076342196557bca4a603ee9120cd4a8e0e171c168c402b8351a10da4ec2a447581566e9bfb2d7530ddefdee93e677fea8391cad2
|
7
|
+
data.tar.gz: 55a55882ec81f07801d7353c5ef21a5c7bc92646535d123e9d51fec82e00ce1561b4cabe89101b08617423814430a88e9540ab5f48f98b132818ca589215be41
|
data/bin/sbire
CHANGED
data/lib/sbire.rb
CHANGED
@@ -1,92 +1,10 @@
|
|
1
|
-
require_relative '
|
2
|
-
require_relative '
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative '
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
1
|
+
require_relative 'sbire/command'
|
2
|
+
require_relative 'sbire/notifier'
|
3
|
+
require_relative 'sbire/audio_converter'
|
4
|
+
require_relative 'sbire/command_manager'
|
5
|
+
require_relative 'sbire/audio_recorder'
|
6
|
+
require_relative 'sbire/save_manager'
|
7
|
+
require_relative 'sbire/sbire_config'
|
8
|
+
require_relative 'sbire/pid_manager'
|
9
|
+
require_relative 'sbire/os'
|
9
10
|
require 'rest_client'
|
10
|
-
|
11
|
-
class Sbire
|
12
|
-
|
13
|
-
attr_accessor :command
|
14
|
-
|
15
|
-
def self.run(argv)
|
16
|
-
self.new(argv).call
|
17
|
-
end
|
18
|
-
|
19
|
-
def initialize(argv)
|
20
|
-
@command = argv.first
|
21
|
-
end
|
22
|
-
|
23
|
-
def call
|
24
|
-
if ["start", "stop", "save", "install"].include?(command)
|
25
|
-
send(command)
|
26
|
-
else
|
27
|
-
show("Command not found")
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
def start
|
33
|
-
stop
|
34
|
-
show("Sbire is listening your voice")
|
35
|
-
audio_recorder.start
|
36
|
-
audio_converter.start do |results, index|
|
37
|
-
command_manager.execute(results, index)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def stop
|
42
|
-
audio_recorder.stop
|
43
|
-
audio_converter.stop
|
44
|
-
end
|
45
|
-
|
46
|
-
def save
|
47
|
-
stop
|
48
|
-
show("Sbire is listening your voice")
|
49
|
-
audio_recorder.start
|
50
|
-
recreate_text_file
|
51
|
-
audio_converter.start do |results, index|
|
52
|
-
save_manager.save(results, index) if results
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def install
|
57
|
-
home = Dir.home
|
58
|
-
config_file = "config_#{OS.familly}.yml"
|
59
|
-
FileUtils.mkdir_p("#{home}/.sbire/out")
|
60
|
-
dirname = File.dirname(__FILE__)
|
61
|
-
path = "#{dirname}/../files/#{config_file}"
|
62
|
-
FileUtils.copy(path, "#{home}/.sbire/config.yml")
|
63
|
-
end
|
64
|
-
|
65
|
-
def recreate_text_file
|
66
|
-
File.write(SbireConfig.text_file, '')
|
67
|
-
end
|
68
|
-
|
69
|
-
def command_manager
|
70
|
-
@command_manager ||= CommandManager.new(SbireConfig.command_path)
|
71
|
-
end
|
72
|
-
|
73
|
-
def audio_recorder
|
74
|
-
@audio_recorder ||= AudioRecorder.new(SbireConfig.out_file, pid_manager)
|
75
|
-
end
|
76
|
-
|
77
|
-
def audio_converter
|
78
|
-
@audio_converter ||= AudioConverter.new(pid_manager)
|
79
|
-
end
|
80
|
-
|
81
|
-
def save_manager
|
82
|
-
@save_manager ||= SaveManager.new
|
83
|
-
end
|
84
|
-
|
85
|
-
def show(message)
|
86
|
-
Notifier.call(message)
|
87
|
-
end
|
88
|
-
|
89
|
-
def pid_manager
|
90
|
-
@pid_manager ||= PidManager.new
|
91
|
-
end
|
92
|
-
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'rest_client'
|
4
|
+
|
5
|
+
module Sbire
|
6
|
+
class AudioConverter
|
7
|
+
attr_accessor :pid_manager
|
8
|
+
def initialize(pid_manager)
|
9
|
+
@pid_manager = pid_manager
|
10
|
+
end
|
11
|
+
|
12
|
+
def start(&block)
|
13
|
+
FileUtils.rm_rf("#{SbireConfig.out_path}/.")
|
14
|
+
pid = listen_audio(block)
|
15
|
+
pid_manager.store(self, pid)
|
16
|
+
end
|
17
|
+
|
18
|
+
def stop
|
19
|
+
pid_manager.kill(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def listen_audio(block)
|
25
|
+
fork do
|
26
|
+
index = 1
|
27
|
+
stop = false
|
28
|
+
hypotheses = []
|
29
|
+
|
30
|
+
while stop == false
|
31
|
+
Thread.new(index) do |i|
|
32
|
+
if File.exist?(filename(i + 1))
|
33
|
+
index += 1
|
34
|
+
hypotheses[i - 1] = send_to_google(filename(i))
|
35
|
+
block.call(hypotheses, i - 1)
|
36
|
+
stop = true if ENV["mode"] == "test"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
sleep 0.1
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def send_to_google(path)
|
45
|
+
file = File.read(path)
|
46
|
+
begin
|
47
|
+
response = RestClient.post url,
|
48
|
+
file,
|
49
|
+
content_type: 'audio/x-flac; rate=16000'
|
50
|
+
read_response(response.to_str) if response.code == 200
|
51
|
+
rescue => e
|
52
|
+
puts e
|
53
|
+
return [""]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def filename(index)
|
58
|
+
index = "%03d" % index
|
59
|
+
"#{SbireConfig.out_file}#{index}.flac"
|
60
|
+
end
|
61
|
+
|
62
|
+
def read_response(text)
|
63
|
+
data = JSON.parse(text)
|
64
|
+
data['hypotheses'].map {|ut| [ut['utterance'], ut['confidence']] }.first
|
65
|
+
end
|
66
|
+
|
67
|
+
def url
|
68
|
+
lang = SbireConfig.lang
|
69
|
+
"https://www.google.com/speech-api/v1/recognize?lang=#{lang}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Sbire
|
2
|
+
class AudioRecorder
|
3
|
+
attr_accessor :path, :pid_manager
|
4
|
+
def initialize(path, pid_manager)
|
5
|
+
@path = path
|
6
|
+
@pid_manager = pid_manager
|
7
|
+
end
|
8
|
+
|
9
|
+
def start
|
10
|
+
pid = record_audio
|
11
|
+
pid_manager.store(self, pid)
|
12
|
+
end
|
13
|
+
|
14
|
+
def stop
|
15
|
+
pid_manager.kill(self)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def record_audio
|
20
|
+
fork { exec "sox -t alsa -r 22050 default #{path}.flac -q silence -l 1 0 1% 1 1.0 1% rate 16k : newfile : restart" }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Sbire
|
2
|
+
class Command
|
3
|
+
|
4
|
+
attr_accessor :command
|
5
|
+
|
6
|
+
def self.run(argv)
|
7
|
+
self.new(argv).call
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(argv)
|
11
|
+
@command = argv.first
|
12
|
+
end
|
13
|
+
|
14
|
+
def call
|
15
|
+
if ["start", "stop", "save", "install"].include?(command)
|
16
|
+
send(command)
|
17
|
+
else
|
18
|
+
show("Command not found")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def start
|
24
|
+
stop
|
25
|
+
show("Sbire is listening your voice")
|
26
|
+
audio_recorder.start
|
27
|
+
audio_converter.start do |results, index|
|
28
|
+
command_manager.execute(results, index)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def stop
|
33
|
+
audio_recorder.stop
|
34
|
+
audio_converter.stop
|
35
|
+
end
|
36
|
+
|
37
|
+
def save
|
38
|
+
stop
|
39
|
+
show("Sbire is listening your voice")
|
40
|
+
audio_recorder.start
|
41
|
+
recreate_text_file
|
42
|
+
audio_converter.start do |results, index|
|
43
|
+
save_manager.save(results, index) if results
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def install
|
48
|
+
home = Dir.home
|
49
|
+
config_file = "config_#{OS.familly}.yml"
|
50
|
+
FileUtils.mkdir_p("#{home}/.sbire/out")
|
51
|
+
dirname = File.dirname(__FILE__)
|
52
|
+
path = "#{dirname}/../../files/#{config_file}"
|
53
|
+
FileUtils.copy(path, "#{home}/.sbire/config.yml")
|
54
|
+
end
|
55
|
+
|
56
|
+
def recreate_text_file
|
57
|
+
File.write(SbireConfig.text_file, '')
|
58
|
+
end
|
59
|
+
|
60
|
+
def command_manager
|
61
|
+
@command_manager ||= CommandManager.new(SbireConfig.command_path)
|
62
|
+
end
|
63
|
+
|
64
|
+
def audio_recorder
|
65
|
+
@audio_recorder ||= AudioRecorder.new(SbireConfig.out_file, pid_manager)
|
66
|
+
end
|
67
|
+
|
68
|
+
def audio_converter
|
69
|
+
@audio_converter ||= AudioConverter.new(pid_manager)
|
70
|
+
end
|
71
|
+
|
72
|
+
def save_manager
|
73
|
+
@save_manager ||= SaveManager.new
|
74
|
+
end
|
75
|
+
|
76
|
+
def show(message)
|
77
|
+
Notifier.call(message)
|
78
|
+
end
|
79
|
+
|
80
|
+
def pid_manager
|
81
|
+
@pid_manager ||= PidManager.new
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Sbire
|
4
|
+
class CommandManager
|
5
|
+
attr_accessor :commands
|
6
|
+
|
7
|
+
def initialize(path)
|
8
|
+
@commands = YAML.load_file(path) if File.exist?(path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute(hypotheses, index)
|
12
|
+
current_hypothese = hypotheses[index]
|
13
|
+
unless current_hypothese.first.empty?
|
14
|
+
command = find(current_hypothese)
|
15
|
+
system("#{command} &")
|
16
|
+
return command
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
def find(hypotheses)
|
22
|
+
hypothese = hypotheses.first.downcase
|
23
|
+
if commands
|
24
|
+
commands.each_pair {|key, value| return key if value.include?(hypothese)}
|
25
|
+
end
|
26
|
+
return hypothese
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/sbire/os.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Sbire
|
2
|
+
class OS
|
3
|
+
def self.familly
|
4
|
+
return "win" if OS.windows?
|
5
|
+
return "linux" if OS.unix? || OS.linux?
|
6
|
+
return "mac" if OS.mac?
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.windows?
|
10
|
+
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.mac?
|
14
|
+
(/darwin/ =~ RUBY_PLATFORM) != nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.unix?
|
18
|
+
!OS.windows?
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.linux?
|
22
|
+
OS.unix? and not OS.mac?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Sbire
|
2
|
+
class PidManager
|
3
|
+
def store(object, pid)
|
4
|
+
File.open("/tmp/#{class_name(object)}.pid", 'w') {|file| file.write(pid)}
|
5
|
+
end
|
6
|
+
|
7
|
+
def kill(object)
|
8
|
+
if File.exists?("/tmp/#{class_name(object)}.pid")
|
9
|
+
pid = File.read("/tmp/#{class_name(object)}.pid")
|
10
|
+
system("kill #{pid}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def class_name(object)
|
17
|
+
object.class.name.split('::').last
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Sbire
|
2
|
+
class SaveManager
|
3
|
+
attr_accessor :last_index, :max_index
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@last_index = 0
|
7
|
+
@max_index = 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def save(hypotheses, index)
|
11
|
+
compute_max_index(index)
|
12
|
+
hypotheses = current_hypotheses(hypotheses)
|
13
|
+
unless hypotheses.include?(nil)
|
14
|
+
append_to_file(hypotheses)
|
15
|
+
@last_index = index + 1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def compute_max_index(index)
|
22
|
+
@max_index = index if @max_index < index
|
23
|
+
end
|
24
|
+
|
25
|
+
def current_hypotheses(hypotheses)
|
26
|
+
hypotheses.map { |hypothese| hypothese.first }[last_index..max_index]
|
27
|
+
end
|
28
|
+
|
29
|
+
def append_to_file(hypotheses)
|
30
|
+
text = hypotheses.join(" ") + " "
|
31
|
+
if text != " "
|
32
|
+
File.open(SbireConfig.text_file, 'ab+') {|file| file.write(text)}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Sbire
|
4
|
+
class SbireConfig
|
5
|
+
def self.config_path
|
6
|
+
"#{base_directory}/config.yml"
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.base_directory
|
10
|
+
"#{Dir.home}/.sbire"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.lang
|
14
|
+
config["lang"] ||= "en-US"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.out_path
|
18
|
+
config["out_path"] ||= "#{base_directory}/out/"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.out_file
|
22
|
+
config["out_file"] ||= "#{out_path}.audiofile"
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.text_file
|
26
|
+
config["text_file"] ||= "#{base_directory}/text"
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.command_path
|
30
|
+
config["command_path"] ||= "#{base_directory}/commands.yml"
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.notify_command
|
34
|
+
config["notify_command"]
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def self.config
|
40
|
+
return @config if @config
|
41
|
+
@config = YAML.load_file(config_path) || {}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sbire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.10
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Guirec Corbel
|
@@ -14,17 +13,15 @@ dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rest-client
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
description: Sbire is a command line tool that recognize your voice and execute commands
|
@@ -36,15 +33,16 @@ extensions: []
|
|
36
33
|
extra_rdoc_files: []
|
37
34
|
files:
|
38
35
|
- bin/sbire
|
39
|
-
- lib/audio_converter.rb
|
40
|
-
- lib/audio_recorder.rb
|
41
|
-
- lib/os.rb
|
42
36
|
- lib/sbire.rb
|
43
|
-
- lib/
|
44
|
-
- lib/
|
45
|
-
- lib/
|
46
|
-
- lib/
|
47
|
-
- lib/
|
37
|
+
- lib/sbire/audio_converter.rb
|
38
|
+
- lib/sbire/audio_recorder.rb
|
39
|
+
- lib/sbire/os.rb
|
40
|
+
- lib/sbire/command_manager.rb
|
41
|
+
- lib/sbire/save_manager.rb
|
42
|
+
- lib/sbire/sbire_config.rb
|
43
|
+
- lib/sbire/notifier.rb
|
44
|
+
- lib/sbire/pid_manager.rb
|
45
|
+
- lib/sbire/command.rb
|
48
46
|
- files/config_win.yml
|
49
47
|
- files/config_mac.yml
|
50
48
|
- files/config_linux.yml
|
@@ -52,26 +50,25 @@ files:
|
|
52
50
|
homepage: https://github.com/GCorbel/sbire
|
53
51
|
licenses:
|
54
52
|
- MIT
|
53
|
+
metadata: {}
|
55
54
|
post_install_message:
|
56
55
|
rdoc_options: []
|
57
56
|
require_paths:
|
58
57
|
- lib
|
59
58
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
59
|
requirements:
|
62
|
-
- -
|
60
|
+
- - '>='
|
63
61
|
- !ruby/object:Gem::Version
|
64
62
|
version: '0'
|
65
63
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
64
|
requirements:
|
68
|
-
- -
|
65
|
+
- - '>='
|
69
66
|
- !ruby/object:Gem::Version
|
70
67
|
version: '0'
|
71
68
|
requirements: []
|
72
69
|
rubyforge_project:
|
73
|
-
rubygems_version:
|
70
|
+
rubygems_version: 2.0.3
|
74
71
|
signing_key:
|
75
|
-
specification_version:
|
72
|
+
specification_version: 4
|
76
73
|
summary: The henchman who do what you say
|
77
74
|
test_files: []
|
data/lib/audio_converter.rb
DELETED
@@ -1,70 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'fileutils'
|
3
|
-
require 'rest_client'
|
4
|
-
|
5
|
-
class AudioConverter
|
6
|
-
attr_accessor :pid_manager
|
7
|
-
def initialize(pid_manager)
|
8
|
-
@pid_manager = pid_manager
|
9
|
-
end
|
10
|
-
|
11
|
-
def start(&block)
|
12
|
-
FileUtils.rm_rf("#{SbireConfig.out_path}/.")
|
13
|
-
pid = listen_audio(block)
|
14
|
-
pid_manager.store(self, pid)
|
15
|
-
end
|
16
|
-
|
17
|
-
def stop
|
18
|
-
pid_manager.kill(self)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def listen_audio(block)
|
24
|
-
fork do
|
25
|
-
index = 1
|
26
|
-
stop = false
|
27
|
-
hypotheses = []
|
28
|
-
|
29
|
-
while stop == false
|
30
|
-
Thread.new(index) do |i|
|
31
|
-
if File.exist?(filename(i + 1))
|
32
|
-
index += 1
|
33
|
-
hypotheses[i - 1] = send_to_google(filename(i))
|
34
|
-
block.call(hypotheses, i - 1)
|
35
|
-
stop = true if ENV["mode"] == "test"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
sleep 0.1
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def send_to_google(path)
|
44
|
-
file = File.read(path)
|
45
|
-
begin
|
46
|
-
response = RestClient.post url,
|
47
|
-
file,
|
48
|
-
content_type: 'audio/x-flac; rate=16000'
|
49
|
-
read_response(response.to_str) if response.code == 200
|
50
|
-
rescue => e
|
51
|
-
puts e
|
52
|
-
return [""]
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def filename(index)
|
57
|
-
index = "%03d" % index
|
58
|
-
"#{SbireConfig.out_file}#{index}.flac"
|
59
|
-
end
|
60
|
-
|
61
|
-
def read_response(text)
|
62
|
-
data = JSON.parse(text)
|
63
|
-
data['hypotheses'].map {|ut| [ut['utterance'], ut['confidence']] }.first
|
64
|
-
end
|
65
|
-
|
66
|
-
def url
|
67
|
-
lang = SbireConfig.lang
|
68
|
-
"https://www.google.com/speech-api/v1/recognize?lang=#{lang}"
|
69
|
-
end
|
70
|
-
end
|
data/lib/audio_recorder.rb
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
class AudioRecorder
|
2
|
-
attr_accessor :path, :pid_manager
|
3
|
-
def initialize(path, pid_manager)
|
4
|
-
@path = path
|
5
|
-
@pid_manager = pid_manager
|
6
|
-
end
|
7
|
-
|
8
|
-
def start
|
9
|
-
pid = record_audio
|
10
|
-
pid_manager.store(self, pid)
|
11
|
-
end
|
12
|
-
|
13
|
-
def stop
|
14
|
-
pid_manager.kill(self)
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
def record_audio
|
19
|
-
fork { exec "sox -t alsa -r 22050 default #{path}.flac -q silence -l 1 0 1% 1 1.0 1% rate 16k : newfile : restart" }
|
20
|
-
end
|
21
|
-
end
|
data/lib/command_manager.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
class CommandManager
|
4
|
-
attr_accessor :commands
|
5
|
-
|
6
|
-
def initialize(path)
|
7
|
-
@commands = YAML.load_file(path) if File.exist?(path)
|
8
|
-
end
|
9
|
-
|
10
|
-
def execute(hypotheses, index)
|
11
|
-
current_hypothese = hypotheses[index]
|
12
|
-
unless current_hypothese.first.empty?
|
13
|
-
command = find(current_hypothese)
|
14
|
-
system("#{command} &")
|
15
|
-
return command
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
def find(hypotheses)
|
21
|
-
hypothese = hypotheses.first.downcase
|
22
|
-
if commands
|
23
|
-
commands.each_pair {|key, value| return key if value.include?(hypothese)}
|
24
|
-
end
|
25
|
-
return hypothese
|
26
|
-
end
|
27
|
-
end
|
data/lib/notifier.rb
DELETED
data/lib/os.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
class OS
|
2
|
-
def self.familly
|
3
|
-
return "win" if OS.windows?
|
4
|
-
return "linux" if OS.unix? || OS.linux?
|
5
|
-
return "mac" if OS.mac?
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.windows?
|
9
|
-
(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM) != nil
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.mac?
|
13
|
-
(/darwin/ =~ RUBY_PLATFORM) != nil
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.unix?
|
17
|
-
!OS.windows?
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.linux?
|
21
|
-
OS.unix? and not OS.mac?
|
22
|
-
end
|
23
|
-
end
|
data/lib/pid_manager.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
class PidManager
|
2
|
-
def store(object, pid)
|
3
|
-
class_name = object.class.name
|
4
|
-
File.open("/tmp/#{class_name}.pid", 'w') {|file| file.write(pid)}
|
5
|
-
end
|
6
|
-
|
7
|
-
def kill(object)
|
8
|
-
class_name = object.class.name
|
9
|
-
pid = File.read("/tmp/#{class_name}.pid")
|
10
|
-
system("kill #{pid}")
|
11
|
-
end
|
12
|
-
end
|
data/lib/save_manager.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
class SaveManager
|
2
|
-
attr_accessor :last_index, :max_index
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
@last_index = 0
|
6
|
-
@max_index = 0
|
7
|
-
end
|
8
|
-
|
9
|
-
def save(hypotheses, index)
|
10
|
-
compute_max_index(index)
|
11
|
-
hypotheses = current_hypotheses(hypotheses)
|
12
|
-
unless hypotheses.include?(nil)
|
13
|
-
append_to_file(hypotheses)
|
14
|
-
@last_index = index + 1
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def compute_max_index(index)
|
21
|
-
@max_index = index if @max_index < index
|
22
|
-
end
|
23
|
-
|
24
|
-
def current_hypotheses(hypotheses)
|
25
|
-
hypotheses.map { |hypothese| hypothese.first }[last_index..max_index]
|
26
|
-
end
|
27
|
-
|
28
|
-
def append_to_file(hypotheses)
|
29
|
-
text = hypotheses.join(" ") + " "
|
30
|
-
if text != " "
|
31
|
-
File.open(SbireConfig.text_file, 'ab+') {|file| file.write(text)}
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/lib/sbire_config.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
|
3
|
-
class SbireConfig
|
4
|
-
def self.config_path
|
5
|
-
"#{base_directory}/config.yml"
|
6
|
-
end
|
7
|
-
|
8
|
-
def self.base_directory
|
9
|
-
"#{Dir.home}/.sbire"
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.lang
|
13
|
-
config["lang"] ||= "en-US"
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.out_path
|
17
|
-
config["out_path"] ||= "#{base_directory}/out/"
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.out_file
|
21
|
-
config["out_file"] ||= "#{out_path}.audiofile"
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.text_file
|
25
|
-
config["text_file"] ||= "#{base_directory}/text"
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.command_path
|
29
|
-
config["command_path"] ||= "#{base_directory}/commands.yml"
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.notify_command
|
33
|
-
config["notify_command"]
|
34
|
-
end
|
35
|
-
|
36
|
-
private
|
37
|
-
|
38
|
-
def self.config
|
39
|
-
return @config if @config
|
40
|
-
@config = YAML.load_file(config_path) || {}
|
41
|
-
end
|
42
|
-
end
|