pocketsphinx-ruby 0.3.0 → 0.4.0

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: 1be9c28022d45172119190075e2c4f340f129022
4
- data.tar.gz: f00d504978967e201a795874fcdee1038cb96d03
3
+ metadata.gz: 1299af5883e11346cca23dff74ba7015670384d0
4
+ data.tar.gz: 504770d54160fcf2bbcfc80e9910dd4283063e9a
5
5
  SHA512:
6
- metadata.gz: 3407c5ce61d32c3576ce1fa6d16bc3249e0f74fc990b7b5dc8005c545e108cdca776e52e985354636a96ad626db2de90f71c5dd499ab29171b7b25a314cd5c26
7
- data.tar.gz: b8be240f48b2962dd417c19589be7dba6a5b5460c9046deb66972507fe4655718884ad60d86ab8838c3428c946913e2e38ba5524bc1403f320ad01ee43a8e7f2
6
+ metadata.gz: 6dfaec5b4603b38344646fa77e41d941d70ac0455fb3932eecb8949f7e463d2f08c7f64d033df14067dd5e51e227f7b2aa180aa25eeec365e6603b55b03ea2fa
7
+ data.tar.gz: 0fa93e6bd7b2a37b3a0775c0ce045cb9666a13d97a0ef740798732268eea250e59d0cde41c3a1da7ce37afc0072c85917d31665defe7c9e46dec16be0dafc1f1
@@ -1,11 +1,10 @@
1
1
  language: ruby
2
2
  rvm:
3
+ - 2.4.1
4
+ - 2.3.4
3
5
  - 2.2.2
4
6
  - 2.1.6
5
- - 2.0.0
6
- - 1.9.3
7
- - rbx-2.2.9
8
- - jruby-1.7.19
7
+ - jruby-9.1.9.0
9
8
  before_install:
10
9
  - sudo apt-get update -qq
11
10
  - sudo apt-get install -y swig
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ **v0.3.1 - 16/07/17**
4
+
5
+ * SphinxBase API change [removes `err_set_debug_level`](https://github.com/cmusphinx/sphinxbase/commit/69c473ca648b8e2f8e453f27a405107a245bbcdd).
6
+
7
+
3
8
  **v0.3.0 - 17/04/15**
4
9
 
5
10
  * Add Words support to Decoder
data/README.md CHANGED
@@ -224,3 +224,8 @@ An error like this probably means that you have an old version of the Pocketsphi
224
224
  3. Commit your changes (`git commit -am 'Add some feature'`)
225
225
  4. Push to the branch (`git push origin my-new-feature`)
226
226
  5. Create a new Pull Request
227
+
228
+ ### Projects Using pocketsphinx-ruby
229
+
230
+ * [Isabella](https://github.com/chrisvfritz/isabella) - A voice-computing assistant built in Ruby.
231
+ * [sphinxtrain-ruby](https://github.com/watsonbox/sphinxtrain-ruby) - A Toolkit for training/adapting CMU Sphinx acoustic models.
@@ -6,12 +6,16 @@ module Pocketsphinx
6
6
 
7
7
  typedef :pointer, :decoder
8
8
  typedef :pointer, :configuration
9
+ typedef :pointer, :logmath
9
10
 
10
11
  # Allows expect(API::Pocketsphinx).to receive(:ps_init) in JRuby specs
11
12
  def self.ps_init(*args)
12
13
  ps_init_private(*args)
13
14
  end
14
15
 
16
+ attach_function :ps_get_logmath, [:decoder], :logmath
17
+ attach_function :logmath_exp, [:logmath, :int], :double
18
+
15
19
  attach_function :ps_init_private, :ps_init, [:configuration], :decoder
16
20
  attach_function :ps_reinit, [:decoder, :configuration], :int
17
21
  attach_function :ps_default_search_args, [:pointer], :void
@@ -22,6 +26,7 @@ module Pocketsphinx
22
26
  attach_function :ps_end_utt, [:decoder], :int
23
27
  attach_function :ps_get_in_speech, [:decoder], :uint8
24
28
  attach_function :ps_get_hyp, [:decoder, :pointer], :string
29
+ attach_function :ps_get_prob, [:decoder], :int32
25
30
  attach_function :ps_set_jsgf_string, [:decoder, :string, :string], :int
26
31
  attach_function :ps_unset_search, [:decoder, :string], :int
27
32
  attach_function :ps_get_search, [:decoder], :string
@@ -19,7 +19,6 @@ module Pocketsphinx
19
19
  attach_function :cmd_ln_set_int_r, [:pointer, :string, :int], :void
20
20
  attach_function :cmd_ln_str_r, [:pointer, :string], :string
21
21
  attach_function :cmd_ln_set_str_r, [:pointer, :string, :string], :void
22
- attach_function :err_set_debug_level, [:int], :int
23
22
  attach_function :err_set_logfile, [:string], :int
24
23
  attach_function :err_set_logfp, [:pointer], :void
25
24
  end
@@ -12,7 +12,6 @@ module Pocketsphinx
12
12
  # Since JSGF strings are not supported in Pocketsphinx configuration (only files),
13
13
  # we use the post_init_decoder hook to configure the JSGF
14
14
  def post_init_decoder(decoder)
15
- decoder.unset_search
16
15
  decoder.set_jsgf_string(grammar.raw)
17
16
  decoder.set_search
18
17
  end
@@ -6,9 +6,12 @@ module Pocketsphinx
6
6
 
7
7
  class Hypothesis < SimpleDelegator
8
8
  attr_accessor :path_score
9
+ attr_accessor :posterior_prob
9
10
 
10
- def initialize(string, path_score)
11
+ def initialize(string, path_score, posterior_prob = nil)
11
12
  @path_score = path_score
13
+ @posterior_prob = posterior_prob
14
+
12
15
  super(string)
13
16
  end
14
17
  end
@@ -116,10 +119,12 @@ module Pocketsphinx
116
119
  mp_path_score = FFI::MemoryPointer.new(:int32, 1)
117
120
 
118
121
  hypothesis = ps_api.ps_get_hyp(ps_decoder, mp_path_score)
122
+ posterior_prob = ps_api.ps_get_prob(ps_decoder)
119
123
 
120
124
  hypothesis.nil? ? nil : Hypothesis.new(
121
125
  hypothesis,
122
- mp_path_score.get_int32(0)
126
+ log_prob_to_linear(mp_path_score.get_int32(0)),
127
+ log_prob_to_linear(posterior_prob)
123
128
  )
124
129
  end
125
130
 
@@ -206,5 +211,11 @@ module Pocketsphinx
206
211
  configuration.post_init_decoder(self)
207
212
  end
208
213
  end
214
+
215
+ # Convert logarithmic probability to linear floating point
216
+ def log_prob_to_linear(log_prob)
217
+ logmath = ps_api.ps_get_logmath(ps_decoder)
218
+ ps_api.logmath_exp(logmath, log_prob)
219
+ end
209
220
  end
210
221
  end
@@ -108,9 +108,10 @@ module Pocketsphinx
108
108
  def recognize_continuous(max_samples, buffer)
109
109
  process_audio(buffer, max_samples).tap do
110
110
  if hypothesis = decoder.hypothesis
111
+ decoder.end_utterance
112
+
111
113
  yield hypothesis
112
114
 
113
- decoder.end_utterance
114
115
  decoder.start_utterance
115
116
  end
116
117
  end
@@ -126,10 +127,12 @@ module Pocketsphinx
126
127
  end
127
128
 
128
129
  decoder.end_utterance
129
- hypothesis = decoder.hypothesis
130
- decoder.start_utterance
131
130
 
132
- yield hypothesis if hypothesis
131
+ if hypothesis = decoder.hypothesis
132
+ yield hypothesis
133
+ end
134
+
135
+ decoder.start_utterance
133
136
  end
134
137
 
135
138
  process_audio(buffer, max_samples)
@@ -1,3 +1,3 @@
1
1
  module Pocketsphinx
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -22,6 +22,6 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency "bundler", "~> 1.6"
24
24
  spec.add_development_dependency "rake"
25
- spec.add_development_dependency "rspec", "~> 3.1.0"
25
+ spec.add_development_dependency "rspec", "~> 3.6.0"
26
26
  spec.add_development_dependency "coveralls"
27
27
  end
@@ -65,7 +65,7 @@ describe Pocketsphinx::Configuration do
65
65
 
66
66
  describe '#setting_names' do
67
67
  it 'contains the names of all possible system settings' do
68
- expect(subject.setting_names.count).to eq(114)
68
+ expect(subject.setting_names.count).to eq(113)
69
69
  end
70
70
  end
71
71
 
@@ -74,9 +74,9 @@ describe Pocketsphinx::Configuration do
74
74
  expect(subject.details 'vad_threshold').to eq({
75
75
  name: "vad_threshold",
76
76
  type: :float,
77
- default: 2.0,
77
+ default: 3.0,
78
78
  required: false,
79
- value: 2.0,
79
+ value: 3.0,
80
80
  info: "Threshold for decision between noise and silence frames. Log-ratio between signal level and noise level."
81
81
  })
82
82
  end
@@ -84,7 +84,7 @@ describe Pocketsphinx::Configuration do
84
84
  it 'gives details for all settings when no name is specified' do
85
85
  details = subject.details
86
86
 
87
- expect(details.count).to eq(114)
87
+ expect(details.count).to eq(113)
88
88
  expect(details.first).to eq({
89
89
  name: "agc",
90
90
  type: :string,
@@ -143,7 +143,7 @@ describe Pocketsphinx::Decoder do
143
143
  describe '#hypothesis' do
144
144
  it 'calls libpocketsphinx' do
145
145
  expect(ps_api)
146
- .to receive(:ps_get_hyp) do |ps_decoder, mp_path_score|
146
+ .to receive(:ps_get_hyp).ordered do |ps_decoder, mp_path_score|
147
147
  expect(ps_decoder).to eq(subject.ps_decoder)
148
148
  expect(mp_path_score).to be_a(FFI::MemoryPointer)
149
149
 
@@ -152,10 +152,17 @@ describe Pocketsphinx::Decoder do
152
152
  "Hypothesis"
153
153
  end
154
154
 
155
+ expect(ps_api).to receive(:ps_get_prob).with(subject.ps_decoder).ordered.and_return(1)
156
+ expect(ps_api).to receive(:ps_get_logmath).with(subject.ps_decoder).ordered.and_return(:logmath)
157
+ expect(ps_api).to receive(:logmath_exp).with(:logmath, 20).ordered.and_return(0.5)
158
+ expect(ps_api).to receive(:ps_get_logmath).with(subject.ps_decoder).ordered.and_return(:logmath)
159
+ expect(ps_api).to receive(:logmath_exp).with(:logmath, 1).ordered.and_return(0.4)
160
+
155
161
  hypothesis = subject.hypothesis
156
162
 
157
163
  expect(hypothesis).to eq("Hypothesis")
158
- expect(hypothesis.path_score).to eq(20)
164
+ expect(hypothesis.path_score).to eq(0.5)
165
+ expect(hypothesis.posterior_prob).to eq(0.4)
159
166
  end
160
167
  end
161
168
 
@@ -11,14 +11,17 @@ describe Pocketsphinx::Decoder do
11
11
  end
12
12
 
13
13
  it 'reads cmninit configuration values from default acoustic model feat.params' do
14
- expect(configuration.details('cmninit')[:default]).to eq("8.0")
15
- expect(configuration.details('cmninit')[:value]).to eq("40,3,-1")
14
+ expect(configuration.details('cmninit')[:default]).to eq("40,3,-1")
15
+ expect(configuration.details('cmninit')[:value]).to eq("41.00,-5.29,-0.12,5.09,2.48,-4.07,-1.37,-1.78,-5.08,-2.05,-6.45,-1.42,1.17")
16
16
  end
17
17
 
18
18
  describe '#decode' do
19
19
  it 'correctly decodes the speech in goforward.raw' do
20
20
  subject.decode File.open('spec/assets/audio/goforward.raw', 'rb')
21
21
  expect(subject.hypothesis).to eq("go forward ten meters")
22
+
23
+ expect(subject.hypothesis.path_score).to eq(0.49327822492667395)
24
+ expect(subject.hypothesis.posterior_prob).to eq(0.037719430745321664)
22
25
  end
23
26
 
24
27
  # FIXME: This test illustrates a current issue discussed in:
@@ -40,9 +43,9 @@ describe Pocketsphinx::Decoder do
40
43
  it 'reports words with start/end frame values' do
41
44
  subject.decode File.open('spec/assets/audio/goforward.raw', 'rb')
42
45
 
43
- expect(subject.words.map(&:word)).to eq(["<s>", "go", "forward", "ten", "meters", "</s>"])
44
- expect(subject.words.map(&:start_frame)).to eq([0, 46, 64, 117, 153, 212])
45
- expect(subject.words.map(&:end_frame)).to eq([45, 63, 116, 152, 211, 260])
46
+ expect(subject.words.map(&:word)).to eq(["<s>", "<sil>", "go", "forward", "ten", "meters", "</s>"])
47
+ expect(subject.words.map(&:start_frame)).to eq([0, 25, 46, 64, 117, 153, 212])
48
+ expect(subject.words.map(&:end_frame)).to eq([24, 45, 63, 116, 152, 211, 260])
46
49
  end
47
50
  end
48
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pocketsphinx-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Howard Wilson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-17 00:00:00.000000000 Z
11
+ date: 2017-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 3.1.0
61
+ version: 3.6.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 3.1.0
68
+ version: 3.6.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: coveralls
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -157,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
157
  version: '0'
158
158
  requirements: []
159
159
  rubyforge_project:
160
- rubygems_version: 2.2.2
160
+ rubygems_version: 2.5.1
161
161
  signing_key:
162
162
  specification_version: 4
163
163
  summary: Ruby speech recognition with Pocketsphinx