sbire 0.0.1
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 +7 -0
- data/README.md +60 -0
- data/bin/sbire +4 -0
- data/lib/audio_converter.rb +34 -0
- data/lib/audio_recorder.rb +25 -0
- data/lib/command_manager.rb +24 -0
- data/lib/notifier.rb +5 -0
- data/lib/save_manager.rb +11 -0
- data/lib/sbire.rb +73 -0
- data/lib/sbire_config.rb +18 -0
- metadata +53 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: eb41a603c08dadb787fb09ab565377f095284b03
|
4
|
+
data.tar.gz: d5cc30071265b6028a0d96b7a641340951229623
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dd3a2e5d0f07d31b0a64d1d3118a73def68956dee981c8659e30619b7e258b33010d271ec9aa357075f8720595968edff0ab7a886bd33bd8ed095fa21c80dd3b
|
7
|
+
data.tar.gz: d2b5985816ee42e352eee31363caa794ee2f2d2ebd86be588b71558e56d3d4fec2512433e5bb2af9025c9831d3f7b2fd7e9925961351cfc178d48c8b86465e8d
|
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# Sbire
|
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.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
In Ubuntu :
|
8
|
+
|
9
|
+
sudo apt-get install sox notify-osd ruby1.9.1
|
10
|
+
gem install sbire
|
11
|
+
mkdir ~\.sbire\
|
12
|
+
|
13
|
+
In other systems : In the ToDo list
|
14
|
+
|
15
|
+
## Usage
|
16
|
+
|
17
|
+
To execute a command :
|
18
|
+
|
19
|
+
- Open a terminal
|
20
|
+
- Type `sbire start`
|
21
|
+
- Say the command you want ("Firefox" for example)
|
22
|
+
- Type `sbire stop`
|
23
|
+
- The command will be executed
|
24
|
+
|
25
|
+
To write a text file :
|
26
|
+
|
27
|
+
- Open a terminal
|
28
|
+
- Type `sbire start`
|
29
|
+
- Say what you want ("This project rocks" for example)
|
30
|
+
- Type `sbire save`
|
31
|
+
- A file will be created in `~\.sbire\sbire.txt`
|
32
|
+
|
33
|
+
## Configuration
|
34
|
+
|
35
|
+
By default, the language is en-US. You can change it by adding a file `~\.sbire\config.yml` and put `lang: fr-FR` in it.
|
36
|
+
|
37
|
+
## Bind phrase and commands
|
38
|
+
|
39
|
+
You can bind more complexe phrases with commands by adding a file`~\.sbire\commands.yml` and put in it something like this :
|
40
|
+
|
41
|
+
"chromium-browser": ["open chrome", "chrome"]
|
42
|
+
"skype": "open skype"
|
43
|
+
|
44
|
+
## Make a shortcut
|
45
|
+
|
46
|
+
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.
|
47
|
+
|
48
|
+
## ToDo list
|
49
|
+
|
50
|
+
- Make it work with leap motion
|
51
|
+
- Make it cross-platform
|
52
|
+
- Enable streaming to write texts
|
53
|
+
|
54
|
+
## Contributing
|
55
|
+
|
56
|
+
1. Fork it
|
57
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
58
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
59
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
60
|
+
5. Create new Pull Request
|
data/bin/sbire
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'curb'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
class AudioConverter
|
5
|
+
attr_accessor :file
|
6
|
+
|
7
|
+
def initialize(file_path)
|
8
|
+
@file = File.read(file_path)
|
9
|
+
end
|
10
|
+
|
11
|
+
def results
|
12
|
+
http_request.http_post
|
13
|
+
read_response(http_request)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def read_response(http_request)
|
18
|
+
data = JSON.parse(http_request.body)
|
19
|
+
data['hypotheses'].map {|ut| [ut['utterance'], ut['confidence']] }.first
|
20
|
+
end
|
21
|
+
|
22
|
+
def http_request
|
23
|
+
return @http_request if @http_request
|
24
|
+
http_request = Curl::Easy.new(url)
|
25
|
+
http_request.headers['Content-Type'] = "audio/x-flac; rate=22050"
|
26
|
+
http_request.post_body = "Content=#{file}"
|
27
|
+
@http_request = http_request
|
28
|
+
end
|
29
|
+
|
30
|
+
def url
|
31
|
+
lang = Sbire::CONFIG.lang
|
32
|
+
"https://www.google.com/speech-api/v1/recognize?lang=#{lang}"
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class AudioRecorder
|
2
|
+
attr_accessor :path
|
3
|
+
def initialize(path)
|
4
|
+
@path = path
|
5
|
+
end
|
6
|
+
|
7
|
+
def start
|
8
|
+
pid = record_audio
|
9
|
+
write_pid(pid)
|
10
|
+
end
|
11
|
+
|
12
|
+
def stop
|
13
|
+
pid = File.readlines(Sbire::PID_FILE)[0]
|
14
|
+
system("kill #{pid}")
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def write_pid(pid)
|
19
|
+
File.open(Sbire::PID_FILE, 'w') {|file| file.write(pid)}
|
20
|
+
end
|
21
|
+
|
22
|
+
def record_audio
|
23
|
+
fork { exec "sox -t alsa -r 22050 default #{path} -q" }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
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)
|
11
|
+
command = find(hypotheses)
|
12
|
+
system("#{command} &")
|
13
|
+
return command
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def find(hypotheses)
|
18
|
+
hypothese = hypotheses.first.downcase
|
19
|
+
if commands
|
20
|
+
commands.each_pair {|key, value| return key if value.include?(hypothese)}
|
21
|
+
end
|
22
|
+
return hypothese
|
23
|
+
end
|
24
|
+
end
|
data/lib/notifier.rb
ADDED
data/lib/save_manager.rb
ADDED
data/lib/sbire.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require_relative 'notifier'
|
2
|
+
require_relative 'audio_converter'
|
3
|
+
require_relative 'command_manager'
|
4
|
+
require_relative 'audio_recorder'
|
5
|
+
require_relative 'save_manager'
|
6
|
+
require_relative 'sbire_config'
|
7
|
+
require 'rest_client'
|
8
|
+
|
9
|
+
class Sbire
|
10
|
+
|
11
|
+
BASE_DIRECTORY = "#{Dir.home}/.sbire"
|
12
|
+
OUT_FILE = "#{BASE_DIRECTORY}/.audiofile.flac"
|
13
|
+
PID_FILE = "#{BASE_DIRECTORY}/.pid"
|
14
|
+
TEXT_FILE = "#{BASE_DIRECTORY}/sbire.txt"
|
15
|
+
CONFIG_PATH = "#{BASE_DIRECTORY}/config.yml"
|
16
|
+
COMMAND_PATH = "#{BASE_DIRECTORY}/commands.yml"
|
17
|
+
CONFIG = SbireConfig.new(CONFIG_PATH)
|
18
|
+
|
19
|
+
attr_accessor :command
|
20
|
+
|
21
|
+
def self.run(argv)
|
22
|
+
self.new(argv).call
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(argv)
|
26
|
+
@command = argv.first
|
27
|
+
end
|
28
|
+
|
29
|
+
def call
|
30
|
+
if command == "start" || command == "stop" || command == "save"
|
31
|
+
send(command)
|
32
|
+
else
|
33
|
+
show("Command not found")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def start
|
39
|
+
audio_recorder.start
|
40
|
+
show("Sbire is listening your voice")
|
41
|
+
end
|
42
|
+
|
43
|
+
def stop
|
44
|
+
show("Sbire is analyzing your voice")
|
45
|
+
audio_recorder.stop
|
46
|
+
hypotheses = audio_converter.results
|
47
|
+
show(command_manager.execute(hypotheses))
|
48
|
+
end
|
49
|
+
|
50
|
+
def save
|
51
|
+
show("Sbire is writing what you said")
|
52
|
+
audio_recorder.stop
|
53
|
+
hypotheses = audio_converter.results
|
54
|
+
SaveManager.new(hypotheses).save
|
55
|
+
show("Sbire has ended to write your voice")
|
56
|
+
end
|
57
|
+
|
58
|
+
def command_manager
|
59
|
+
@command_manager ||= CommandManager.new(COMMAND_PATH)
|
60
|
+
end
|
61
|
+
|
62
|
+
def audio_recorder
|
63
|
+
@audio_recorder ||= AudioRecorder.new(OUT_FILE)
|
64
|
+
end
|
65
|
+
|
66
|
+
def audio_converter
|
67
|
+
@audio_converter ||= AudioConverter.new(OUT_FILE)
|
68
|
+
end
|
69
|
+
|
70
|
+
def show(message)
|
71
|
+
Notifier.call(message)
|
72
|
+
end
|
73
|
+
end
|
data/lib/sbire_config.rb
ADDED
metadata
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sbire
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Guirec Corbel
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-10-27 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Sbire is a command line tool that recognize your voice and execute commands
|
14
|
+
linked
|
15
|
+
email: guirec.corbel@gmail.com
|
16
|
+
executables:
|
17
|
+
- sbire
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/sbire
|
22
|
+
- lib/audio_converter.rb
|
23
|
+
- lib/audio_recorder.rb
|
24
|
+
- lib/sbire.rb
|
25
|
+
- lib/command_manager.rb
|
26
|
+
- lib/save_manager.rb
|
27
|
+
- lib/sbire_config.rb
|
28
|
+
- lib/notifier.rb
|
29
|
+
- README.md
|
30
|
+
homepage: https://github.com/GCorbel/sbire
|
31
|
+
licenses: []
|
32
|
+
metadata: {}
|
33
|
+
post_install_message:
|
34
|
+
rdoc_options: []
|
35
|
+
require_paths:
|
36
|
+
- lib
|
37
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - '>='
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
requirements: []
|
48
|
+
rubyforge_project:
|
49
|
+
rubygems_version: 2.0.3
|
50
|
+
signing_key:
|
51
|
+
specification_version: 4
|
52
|
+
summary: The henchman who do what you say
|
53
|
+
test_files: []
|