sbire 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 23a66e9330db17e711a672a9f27b315383b4adbb
4
- data.tar.gz: ccfd9923fbf7e9eef0f4c6dbba29a7c58d6076ca
3
+ metadata.gz: 1b95928f61c106d66ace43ecd8cb62f90aaa719f
4
+ data.tar.gz: 3fb14d64359c679e08c4d4369243c4aa603f13d8
5
5
  SHA512:
6
- metadata.gz: 6a41d6e3dc882502f8bddc81076342196557bca4a603ee9120cd4a8e0e171c168c402b8351a10da4ec2a447581566e9bfb2d7530ddefdee93e677fea8391cad2
7
- data.tar.gz: 55a55882ec81f07801d7353c5ef21a5c7bc92646535d123e9d51fec82e00ce1561b4cabe89101b08617423814430a88e9540ab5f48f98b132818ca589215be41
6
+ metadata.gz: bb710a9f522f51769f9f5e1b9324f7ddf90e0bacc9279d07f6f570575c507f4bd56824dae8d19070a9226b9bec13fe304f4221620af7dcd3e68461c8ec9fa6d4
7
+ data.tar.gz: 55d2c350688d2339d9758f3b5e8acda7c6d606bd075c863fcad9fb1cf665963bdd0a3e023c1e81529476b43927668cd1294ac2c029be3dfdef47e3bd06d571c6
data/README.md CHANGED
@@ -1,22 +1,23 @@
1
1
  # Sbire
2
2
 
3
- In french, a "Sbire" is a henchman. It's the guy who do what you say. Sbire is program which is capable to listen what you said and execute the command associated.
3
+ "Sbire" is the French word for henchman. Sbire is program which is capable to listen what you said and execute the command associated.
4
4
 
5
5
  ## Installation
6
6
 
7
- On linux :
7
+ Linux :
8
8
 
9
- sudo apt-get install sox notify-osd ruby1.9.1
9
+ sudo apt-get install sox notify-osd ruby1.9.1 xdotool
10
10
  gem install sbire
11
11
  sbire install
12
12
 
13
- On mac :
13
+ OSX:
14
14
 
15
15
  brew install sox
16
+ sudo port install xdotool
16
17
  gem install sbire
17
18
  sbire install
18
19
 
19
- On windows :
20
+ Windows :
20
21
 
21
22
  Install ruby with [RubyInstall](http://rubyinstaller.org/)
22
23
  gem install sbire
@@ -24,38 +25,53 @@ On windows :
24
25
 
25
26
  ## Usage
26
27
 
27
- To execute a command :
28
+ To run a command :
28
29
 
29
30
  - Open a terminal
30
31
  - Type `sbire start`
31
- - Say the command you want ("Firefox" for example)
32
- - Type `sbire stop`
32
+ - Say the command ("Firefox" for example)
33
33
  - The command will be executed
34
34
 
35
+ To write where your cursor is :
36
+
37
+ - Open a terminal
38
+ - Type `sbire pipe`
39
+ - Say the text ("This project rocks" for example)
40
+ - It will write the text where your cursor is
41
+
35
42
  To write a text file :
36
43
 
37
44
  - Open a terminal
38
- - Type `sbire start`
39
- - Say what you want ("This project rocks" for example)
40
45
  - Type `sbire save`
46
+ - Say the text ("This project rocks" for example)
41
47
  - A file will be created in `~\.sbire\text`
42
48
 
43
- If you want to see what is put in the file in real time, you can do `tail -f ~\.sbire\text`.
49
+ To stop sbire, type `sbire stop`.
50
+
51
+ If you want to see what is written in the file in real time, run `tail -f ~\.sbire\text`.
44
52
 
45
53
  ## Configuration
46
54
 
47
- By default, the language is en-us. You can change it by changing the file `~\.sbire\config.yml` and put `lang: fr-FR` in it.
55
+ By default, the language is en-us. You can change it by changing the value of `lang` by your language. For example, to set it to French, write:
56
+ ```
57
+ lang: fr-FR`
58
+ ```
48
59
 
49
60
  ## Bind phrase and commands
50
61
 
51
- You can bind more complexe phrases with commands by adding a file`~\.sbire\commands.yml` and put in it something like this :
52
-
62
+ You can bind more complexe phrases with commands by adding a `~\.sbire\commands.yml` file and write for example:
63
+ ```
53
64
  "chromium-browser": ["open chrome", "chrome"]
54
65
  "skype": "open skype"
66
+ ```
67
+
68
+ ## Pipe the text with a custom command
69
+
70
+ By default, when you use `sbire pipe`, it will use a command to emulate the keyboard. You can change it by editing the file `~\.sbire\config.yml` and change the value of `pipe_command` by anything you want.
55
71
 
56
- ## Make a shortcut
72
+ ## Add a shortcut
57
73
 
58
- For an obscure reason, Ubuntu does not execute ruby commands binded with a keyboard shortcut. You must to install [xbindkeys](http://doc.ubuntu-fr.org/xbindkeys) to make it working.
74
+ For some obscure reason, Ubuntu does not run ruby commands binded with a keyboard shortcut. You must install [xbindkeys](http://doc.ubuntu-fr.org/xbindkeys) to make it work.
59
75
 
60
76
  ## Contributing
61
77
 
data/bin/sbire CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require_relative '../lib/sbire'
4
- Sbire::Command.new(ARGV).call
4
+ Sbire::Command.start
@@ -1,2 +1,3 @@
1
1
  lang: "en-us"
2
2
  notify_command: "notify-send '%{message}'"
3
+ pipe_command: "xdotool type '%{text}'"
@@ -1,2 +1,3 @@
1
1
  lang: "en-us"
2
2
  notify_command: "terminal-notifier -sender com.apple.Terminal -message %{message}"
3
+ pipe_command: "xdotool type '%{text}'"
@@ -1,2 +1,3 @@
1
1
  lang: "en-us"
2
2
  notify_command: "echo '%{message}'"
3
+ pipe_command: "echo '%{text}'"
@@ -1,10 +1,18 @@
1
+ require 'rest_client'
2
+ require 'thor'
3
+ require 'json'
4
+ require 'fileutils'
5
+ require 'rest_client'
6
+ require 'yaml'
7
+
8
+ require_relative 'sbire/sbire_config'
1
9
  require_relative 'sbire/command'
2
10
  require_relative 'sbire/notifier'
3
11
  require_relative 'sbire/audio_converter'
4
12
  require_relative 'sbire/command_manager'
5
13
  require_relative 'sbire/audio_recorder'
6
14
  require_relative 'sbire/save_manager'
7
- require_relative 'sbire/sbire_config'
15
+ require_relative 'sbire/pipe_manager'
16
+ require_relative 'sbire/stream_manager'
8
17
  require_relative 'sbire/pid_manager'
9
18
  require_relative 'sbire/os'
10
- require 'rest_client'
@@ -1,7 +1,3 @@
1
- require 'json'
2
- require 'fileutils'
3
- require 'rest_client'
4
-
5
1
  module Sbire
6
2
  class AudioConverter
7
3
  attr_accessor :pid_manager
@@ -47,7 +43,12 @@ module Sbire
47
43
  response = RestClient.post url,
48
44
  file,
49
45
  content_type: 'audio/x-flac; rate=16000'
50
- read_response(response.to_str) if response.code == 200
46
+ response = read_response(response.to_str) if response.code == 200
47
+ if response
48
+ return response
49
+ else
50
+ return empty_result
51
+ end
51
52
  rescue => e
52
53
  puts e
53
54
  return [""]
@@ -60,8 +61,16 @@ module Sbire
60
61
  end
61
62
 
62
63
  def read_response(text)
63
- data = JSON.parse(text)
64
- data['hypotheses'].map {|ut| [ut['utterance'], ut['confidence']] }.first
64
+ if text && text.empty?
65
+ empty_result
66
+ else
67
+ data = JSON.parse(text)
68
+ data['hypotheses'].map {|ut| [ut['utterance'], ut['confidence']] }.first
69
+ end
70
+ end
71
+
72
+ def empty_result
73
+ ['', 0]
65
74
  end
66
75
 
67
76
  def url
@@ -17,7 +17,7 @@ module Sbire
17
17
 
18
18
  private
19
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" }
20
+ fork { exec "sox -t alsa -r 22050 default #{path}.flac -q silence -l 1 0 2% 1 1.0 2% rate 16k : newfile : restart" }
21
21
  end
22
22
  end
23
23
  end
@@ -1,25 +1,10 @@
1
1
  module Sbire
2
- class Command
2
+ class Command < Thor
3
+ package_name "Sbire"
3
4
 
4
5
  attr_accessor :command
5
6
 
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
7
+ desc "start", "Start to listening your voice and execute associated commands"
23
8
  def start
24
9
  stop
25
10
  show("Sbire is listening your voice")
@@ -29,11 +14,13 @@ module Sbire
29
14
  end
30
15
  end
31
16
 
17
+ desc "stop", "Stop all dependencies of Sbire"
32
18
  def stop
33
19
  audio_recorder.stop
34
20
  audio_converter.stop
35
21
  end
36
22
 
23
+ desc "save", "Save what you say in ~/.sbire/text. You can customize the path by edition ~/.sbire/config.yml"
37
24
  def save
38
25
  stop
39
26
  show("Sbire is listening your voice")
@@ -44,6 +31,17 @@ module Sbire
44
31
  end
45
32
  end
46
33
 
34
+ desc "pipe", "Send what you say to another command. You can customize the commd by editing ~/.sbire/config.yml"
35
+ def pipe
36
+ stop
37
+ show("Sbire is listening your voice")
38
+ audio_recorder.start
39
+ audio_converter.start do |results, index|
40
+ pipe_manager.pipe(results, index) if results
41
+ end
42
+ end
43
+
44
+ desc "install", "Install Sbire"
47
45
  def install
48
46
  home = Dir.home
49
47
  config_file = "config_#{OS.familly}.yml"
@@ -53,6 +51,8 @@ module Sbire
53
51
  FileUtils.copy(path, "#{home}/.sbire/config.yml")
54
52
  end
55
53
 
54
+ private
55
+
56
56
  def recreate_text_file
57
57
  File.write(SbireConfig.text_file, '')
58
58
  end
@@ -73,6 +73,10 @@ module Sbire
73
73
  @save_manager ||= SaveManager.new
74
74
  end
75
75
 
76
+ def pipe_manager
77
+ @pipe_manager ||= PipeManager.new
78
+ end
79
+
76
80
  def show(message)
77
81
  Notifier.call(message)
78
82
  end
@@ -1,5 +1,3 @@
1
- require 'yaml'
2
-
3
1
  module Sbire
4
2
  class CommandManager
5
3
  attr_accessor :commands
@@ -1,5 +1,3 @@
1
- require_relative 'sbire_config'
2
-
3
1
  module Sbire
4
2
  class Notifier
5
3
  def self.call(message)
@@ -0,0 +1,20 @@
1
+ module Sbire
2
+ class PipeManager
3
+ def pipe(hypotheses, index)
4
+ stream_manager.execute(hypotheses, index) do |result|
5
+ send_command(result)
6
+ end
7
+ end
8
+
9
+ private
10
+
11
+ def stream_manager
12
+ @stream_manager ||= StreamManager.new
13
+ end
14
+
15
+ def send_command(text)
16
+ command = SbireConfig.pipe_command % { text: text }
17
+ system(command)
18
+ end
19
+ end
20
+ end
@@ -1,36 +1,19 @@
1
1
  module Sbire
2
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
3
  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
4
+ stream_manager.execute(hypotheses, index) do |result|
5
+ append_to_file(result)
16
6
  end
17
7
  end
18
8
 
19
9
  private
20
10
 
21
- def compute_max_index(index)
22
- @max_index = index if @max_index < index
11
+ def stream_manager
12
+ @stream_manager ||= StreamManager.new
23
13
  end
24
14
 
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
15
+ def append_to_file(text)
16
+ File.open(SbireConfig.text_file, 'ab+') {|file| file.write(text)}
34
17
  end
35
18
  end
36
19
  end
@@ -1,5 +1,3 @@
1
- require 'yaml'
2
-
3
1
  module Sbire
4
2
  class SbireConfig
5
3
  def self.config_path
@@ -7,7 +5,11 @@ module Sbire
7
5
  end
8
6
 
9
7
  def self.base_directory
10
- "#{Dir.home}/.sbire"
8
+ if ENV["mode"] == "test"
9
+ "./spec/fixtures"
10
+ else
11
+ "#{Dir.home}/.sbire"
12
+ end
11
13
  end
12
14
 
13
15
  def self.lang
@@ -34,6 +36,10 @@ module Sbire
34
36
  config["notify_command"]
35
37
  end
36
38
 
39
+ def self.pipe_command
40
+ config["pipe_command"]
41
+ end
42
+
37
43
  private
38
44
 
39
45
  def self.config
@@ -0,0 +1,38 @@
1
+ module Sbire
2
+ class StreamManager
3
+ attr_accessor :last_index, :max_index
4
+
5
+ def initialize
6
+ @last_index = 0
7
+ @max_index = 0
8
+ end
9
+
10
+ def execute(hypotheses, index, &block)
11
+ compute_max_index(index)
12
+ hypotheses = current_hypotheses(hypotheses)
13
+ unless hypotheses.include?(nil)
14
+ send_result(hypotheses, block)
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 send_result(hypotheses, block)
30
+ text = sanitize(hypotheses.join(" ")) + " "
31
+ block.call(text) if text != " "
32
+ end
33
+
34
+ def sanitize(text)
35
+ text.gsub('"', '\"')
36
+ end
37
+ end
38
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sbire
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Guirec Corbel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-28 00:00:00.000000000 Z
11
+ date: 2013-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - '>='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: thor
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Sbire is a command line tool that recognize your voice and execute commands
28
42
  linked
29
43
  email: guirec.corbel@gmail.com
@@ -34,8 +48,10 @@ extra_rdoc_files: []
34
48
  files:
35
49
  - bin/sbire
36
50
  - lib/sbire.rb
51
+ - lib/sbire/pipe_manager.rb
37
52
  - lib/sbire/audio_converter.rb
38
53
  - lib/sbire/audio_recorder.rb
54
+ - lib/sbire/stream_manager.rb
39
55
  - lib/sbire/os.rb
40
56
  - lib/sbire/command_manager.rb
41
57
  - lib/sbire/save_manager.rb