diarize-ruby 0.3.7 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: acabfb7160ffeb0ee59815441c7108aebd3dbc57
4
- data.tar.gz: 1e1ac96bdeb06c3546ef652f1b8324f38c42316f
3
+ metadata.gz: a0ca7dc41b19eb2fe4496e20cb87f260ebf52141
4
+ data.tar.gz: 85d3e9cda2554f69737ffb11fee7ff0b5e9b54e9
5
5
  SHA512:
6
- metadata.gz: f453a319e2d7e4084fa95fa33240a78773bcf6d7dddf8551b02337a5a9ed294ebc48317c52ba2d845fb2f095f86397038e0759124aa4409721a1f3d5cf2f7786
7
- data.tar.gz: 6be77004bd7ba178fba11f5b3e8510357f7c2708b5fc49bfc302a570af8b6e0727603cd776373e157c1227e7e354b1abf3bec63810d87f5df7b72a7148e99dbc
6
+ metadata.gz: 219f481f7243ac904a35af383530b0308ddb0476afae76efcd954ac444112f9509080beabbd6797ff3e33266f48e75cce22af25385cf9170572d35c73d9feb61
7
+ data.tar.gz: 844543077abb226237e1e6ccdb28a3564a977360361686a820b00e190dd243f0545f8ee8313f25effaf192a4622e543482da561d78ade9567d331ad633515397
data/CHANGELOG.md CHANGED
@@ -1,3 +1,11 @@
1
+ ## [v0.3.8] - 2016-11-29
2
+
3
+ - Speaker#load_model to return Java object instead of Rjb wrapper
4
+ - Added sha to SuperVector
5
+ - Added `as_json`/`to_json` for speakers
6
+ - `to_rdf`, `as_json` and `to_json` to return supervector_sha for speaker identification
7
+ - Refactored Rjb wrapper into separate folder
8
+
1
9
  ## [v0.3.7] - 2016-11-18
2
10
 
3
11
  - Sort segments by start time by default
data/lib/diarize.rb CHANGED
@@ -9,9 +9,11 @@ require "matrix"
9
9
 
10
10
  require "uri"
11
11
  require "open-uri"
12
- require "digest/md5"
12
+ require "digest"
13
13
  require "to_rdf"
14
14
 
15
+ require "rjb/java_object_wrapper"
16
+
15
17
  require "diarize/version"
16
18
  require "diarize/audio"
17
19
  require "diarize/segment"
@@ -19,105 +21,3 @@ require "diarize/speaker"
19
21
  require "diarize/segmentation"
20
22
  require "diarize/super_vector"
21
23
  require "diarize/server"
22
-
23
- # Extenions to the {Ruby-Java Bridge}[http://rjb.rubyforge.org/] module that
24
- # adds a generic Java object wrapper class.
25
- module Rjb
26
- # A generic wrapper for a Java object loaded via the Ruby Java Bridge. The
27
- # wrapper class handles intialization and stringification, and passes other
28
- # method calls down to the underlying Java object. Objects returned by the
29
- # underlying Java object are converted to the appropriate Ruby object.
30
- #
31
- # This object is enumerable, yielding items in the order defined by the Java
32
- # object's iterator.
33
- class JavaObjectWrapper
34
- include Enumerable
35
-
36
- # The underlying Java object.
37
- attr_reader :java_object
38
-
39
- # Initialize with a Java object <em>obj</em>. If <em>obj</em> is a
40
- # String, assume it is a Java class name and instantiate it. Otherwise,
41
- # treat <em>obj</em> as an instance of a Java object.
42
- def initialize(obj, *args)
43
- @java_object = obj.class == String ?
44
- Rjb::import(obj).send(:new, *args) : obj
45
- end
46
-
47
- # Enumerate all the items in the object using its iterator. If the object
48
- # has no iterator, this function yields nothing.
49
- def each
50
- if @java_object.getClass.getMethods.any? {|m| m.getName == "iterator"}
51
- i = @java_object.iterator
52
- while i.hasNext
53
- yield wrap_java_object(i.next)
54
- end
55
- end
56
- end # each
57
-
58
- # Reflect unhandled method calls to the underlying Java object.
59
- def method_missing(m, *args)
60
- wrap_java_object(@java_object.send(m, *args))
61
- end
62
-
63
- # Convert a value returned by a call to the underlying Java object to the
64
- # appropriate Ruby object as follows:
65
- # * RJB objects are placed inside a generic JavaObjectWrapper wrapper.
66
- # * <tt>java.util.ArrayList</tt> objects are converted to Ruby Arrays.
67
- # * <tt>java.util.HashSet</tt> objects are converted to Ruby Sets
68
- # * Other objects are left unchanged.
69
- #
70
- # This function is applied recursively to items in collection objects such
71
- # as set and arrays.
72
- def wrap_java_object(object)
73
- if object.kind_of?(Array)
74
- object.collect {|item| wrap_java_object(item)}
75
- # Ruby-Java Bridge Java objects all have a _classname member which tells
76
- # the name of their Java class.
77
- elsif object.respond_to?(:_classname)
78
- case object._classname
79
- when /java\.util\.ArrayList/
80
- # Convert java.util.ArrayList objects to Ruby arrays.
81
- array_list = []
82
- object.size.times do
83
- |i| array_list << wrap_java_object(object.get(i))
84
- end
85
- array_list
86
- when /java\.util\.HashSet/
87
- # Convert java.util.HashSet objects to Ruby sets.
88
- set = Set.new
89
- i = object.iterator
90
- while i.hasNext
91
- set << wrap_java_object(i.next)
92
- end
93
- set
94
- else
95
- # Pass other RJB objects off to a handler.
96
- wrap_rjb_object(object)
97
- end # case
98
- else
99
- # Return non-RJB objects unchanged.
100
- object
101
- end # if
102
- end # wrap_java_object
103
-
104
- # By default, all RJB classes other than <tt>java.util.ArrayList</tt> and
105
- # <tt>java.util.HashSet</tt> go in a generic wrapper. Derived classes may
106
- # change this behavior.
107
- def wrap_rjb_object(object)
108
- JavaObjectWrapper.new(object)
109
- end
110
-
111
- # Show the classname of the underlying Java object.
112
- def inspect
113
- "<#{@java_object._classname}>"
114
- end
115
-
116
- # Use the underlying Java object's stringification.
117
- def to_s
118
- toString
119
- end
120
-
121
- protected :wrap_java_object, :wrap_rjb_object
122
- end # JavaObjectWrapper
123
- end # Rjb
data/lib/diarize/audio.rb CHANGED
@@ -155,7 +155,7 @@ module Diarize
155
155
 
156
156
  # Populating the speakers with their GMMs
157
157
  gmm_vect.each_with_index do |speaker_model, i|
158
- speakers[i].model = speaker_model
158
+ speakers[i].model = speaker_model.java_object
159
159
  end
160
160
  end
161
161
 
@@ -1,90 +1,110 @@
1
1
  module Diarize
2
2
  class Speaker
3
+ include ToRdf
4
+
3
5
  @@log_likelihood_threshold = -33
4
6
  @@detection_threshold = 0.2
7
+ @@speakers = {}
5
8
 
6
- @@speakers = {}
7
-
8
- attr_accessor :model_uri, :model, :normalized
9
+ attr_accessor :model_uri, :model
9
10
  attr_reader :gender
11
+ attr_writer :normalized
10
12
 
11
13
  def initialize(uri = nil, gender = nil, model_file = nil)
12
- @model = Speaker.load_model(model_file) if model_file
13
- @uri = uri
14
- @gender = gender
14
+ @model = Speaker.load_model(model_file) if model_file
15
+ @uri = uri
16
+ @gender = gender
15
17
  @normalized = false
16
18
  end
17
19
 
18
- def self.ubm
19
- speaker = Speaker.new
20
- speaker.normalized = true
21
- speaker.model = Speaker.load_model(File.join(File.expand_path(File.dirname(__FILE__)), 'ubm.gmm'))
22
- speaker
23
- end
20
+ class << self
24
21
 
25
- def mean_log_likelihood
26
- @mean_log_likelihood ? @mean_log_likelihood : model.mean_log_likelihood # Will be NaN if model was loaded from somewhere
27
- end
22
+ def ubm
23
+ speaker = Speaker.new
24
+ speaker.normalized = true
25
+ speaker.model = Speaker.load_model(File.join(File.expand_path(File.dirname(__FILE__)), 'ubm.gmm'))
26
+ speaker
27
+ end
28
28
 
29
- def mean_log_likelihood=(mll)
30
- @mean_log_likelihood = mll
31
- end
29
+ def detection_threshold=(threshold)
30
+ @@detection_threshold = threshold
31
+ end
32
32
 
33
- def save_model(filename)
34
- # TODO perhaps a warning if a normalised model is being saved?
35
- write_gmm(filename, @model)
36
- end
33
+ def detection_threshold
34
+ @@detection_threshold
35
+ end
37
36
 
38
- def self.detection_threshold=(threshold)
39
- @@detection_threshold = threshold
40
- end
37
+ def load_model(filename)
38
+ read_gmm(filename)
39
+ end
41
40
 
42
- def self.detection_threshold
43
- @@detection_threshold
44
- end
41
+ def find_or_create(uri, gender)
42
+ return @@speakers[uri] if @@speakers[uri]
43
+ @@speakers[uri] = Speaker.new(uri, gender)
44
+ end
45
45
 
46
- def self.load_model(filename)
47
- read_gmm(filename)
48
- end
46
+ def divergence(speaker1, speaker2)
47
+ # TODO bundle in mean_log_likelihood to weight down unlikely models?
48
+ return unless speaker1.model and speaker2.model
49
+ # MAP Gaussian divergence
50
+ # See "A model space framework for efficient speaker detection", Interspeech'05
51
+ divergence_lium(speaker1, speaker2)
52
+ end
49
53
 
50
- def self.find_or_create(uri, gender)
51
- return @@speakers[uri] if @@speakers[uri]
52
- @@speakers[uri] = Speaker.new(uri, gender)
53
- end
54
+ def divergence_lium(speaker1, speaker2)
55
+ Rjb::import('fr.lium.spkDiarization.libModel.Distance').GDMAP(speaker1.model, speaker2.model)
56
+ end
54
57
 
55
- def self.divergence(speaker1, speaker2)
56
- # TODO bundle in mean_log_likelihood to weight down unlikely models?
57
- return unless speaker1.model and speaker2.model
58
- # MAP Gaussian divergence
59
- # See "A model space framework for efficient speaker detection", Interspeech'05
60
- divergence_lium(speaker1, speaker2)
61
- end
58
+ def divergence_ruby(speaker1, speaker2)
59
+ SuperVector.divergence(speaker1.supervector, speaker2.supervector)
60
+ end
62
61
 
63
- def self.divergence_lium(speaker1, speaker2)
64
- # fr.lium.spkDiarization.libModel.Distance.GDMAP(speaker1.model, speaker2.model)
65
- Rjb::import('fr.lium.spkDiarization.libModel.Distance').GDMAP(speaker1.model, speaker2.model)
62
+ def match_sets(speakers1, speakers2)
63
+ matches = []
64
+ speakers1.each do |s1|
65
+ speakers2.each do |s2|
66
+ matches << [ s1, s2 ] if s1.same_speaker_as(s2)
67
+ end
68
+ end
69
+ matches
70
+ end
71
+
72
+ def match(speakers)
73
+ speakers.combination(2).select { |s1, s2| s1.same_speaker_as(s2) }
74
+ end
75
+
76
+ protected
77
+
78
+ def read_gmm(filename)
79
+ gmmlist = Rjb::JavaObjectWrapper.new("java.util.ArrayList")
80
+ input = Rjb::import('fr.lium.spkDiarization.lib.IOFile').new(filename, 'rb')
81
+ input.open
82
+ Rjb::import('fr.lium.spkDiarization.libModel.ModelIO').readerGMMContainer(input, gmmlist.java_object)
83
+ input.close
84
+ gmmlist.to_a.first.java_object
85
+ end
86
+
87
+ end # class
88
+
89
+ def mean_log_likelihood
90
+ @mean_log_likelihood ? @mean_log_likelihood : model.mean_log_likelihood # Will be NaN if model was loaded from somewhere
66
91
  end
67
92
 
68
- def self.divergence_ruby(speaker1, speaker2)
69
- SuperVector.divergence(speaker1.supervector, speaker2.supervector)
93
+ def mean_log_likelihood=(mll)
94
+ @mean_log_likelihood = mll
70
95
  end
71
96
 
72
- def self.match_sets(speakers1, speakers2)
73
- matches = []
74
- speakers1.each do |s1|
75
- speakers2.each do |s2|
76
- matches << [ s1, s2 ] if s1.same_speaker_as(s2)
77
- end
78
- end
79
- matches
97
+ def save_model(filename)
98
+ # TODO perhaps a warning if a normalized model is being saved?
99
+ write_gmm(filename, @model)
80
100
  end
81
101
 
82
- def self.match(speakers)
83
- speakers.combination(2).select { |s1, s2| s1.same_speaker_as(s2) }
102
+ def normalized?
103
+ !!@normalized
84
104
  end
85
105
 
86
106
  def normalize!
87
- unless @normalized
107
+ unless normalized?
88
108
  # Applies M-Norm from "D-MAP: a Distance-Normalized MAP Estimation of Speaker Models for Automatic Speaker Verification"
89
109
  # to the associated GMM, placing it on a unit hyper-sphere with a UBM centre (model will be at distance one from the UBM
90
110
  # according to GDMAP)
@@ -113,12 +133,15 @@ module Diarize
113
133
  end
114
134
 
115
135
  def supervector
116
- # TODO: cache only when normalized
117
- @supervector ||= SuperVector.generate_from_model(model)
136
+ if normalized?
137
+ @supervector ||= begin
138
+ SuperVector.generate_from_model(model)
139
+ end
140
+ else
141
+ SuperVector.generate_from_model(model)
142
+ end
118
143
  end
119
144
 
120
- include ToRdf
121
-
122
145
  def namespaces
123
146
  super.merge 'ws' => 'http://wsarchive.prototype0.net/ontology/'
124
147
  end
@@ -132,23 +155,31 @@ module Diarize
132
155
  end
133
156
 
134
157
  def rdf_mapping
135
- { 'ws:gender' => gender, 'ws:model' => model_uri, 'ws:mean_log_likelihood' => model.mean_log_likelihood, 'ws:supervector_hash' => supervector.hash.to_s }
158
+ {
159
+ 'ws:gender' => gender,
160
+ 'ws:model' => model_uri,
161
+ 'ws:mean_log_likelihood' => mean_log_likelihood,
162
+ 'ws:supervector_hash' => supervector.hash.to_s,
163
+ 'ws:supervector_sha' => supervector.sha
164
+ }
136
165
  end
137
166
 
138
- protected
167
+ def as_json
168
+ {
169
+ 'gender' => gender,
170
+ 'model' => model_uri,
171
+ 'mean_log_likelihood' => mean_log_likelihood,
172
+ 'supervector_hash' => supervector.hash.to_s,
173
+ 'supervector_sha' => supervector.sha
174
+ }
175
+ end
139
176
 
140
- def self.read_gmm(filename)
141
- # gmmlist = java.util.ArrayList.new
142
- gmmlist = Rjb::JavaObjectWrapper.new("java.util.ArrayList")
143
- # input = fr.lium.spkDiarization.lib.IOFile.new(filename, 'rb')
144
- input = Rjb::import('fr.lium.spkDiarization.lib.IOFile').new(filename, 'rb')
145
- input.open
146
- # fr.lium.spkDiarization.libModel.ModelIO.readerGMMContainer(input, gmmlist)
147
- Rjb::import('fr.lium.spkDiarization.libModel.ModelIO').readerGMMContainer(input, gmmlist.java_object)
148
- input.close
149
- gmmlist.to_a.first.java_object
177
+ def to_json
178
+ as_json.to_json
150
179
  end
151
180
 
181
+ protected
182
+
152
183
  def write_gmm(filename, model)
153
184
  # gmmlist = java.util.ArrayList.new
154
185
  gmmlist = Rjb::JavaObjectWrapper.new("java.util.ArrayList")
@@ -160,5 +191,6 @@ module Diarize
160
191
  Rjb::import('fr.lium.spkDiarization.libModel.ModelIO').writerGMMContainer(output, gmmlist.java_object)
161
192
  output.close
162
193
  end
194
+
163
195
  end # Speaker
164
196
  end
@@ -71,5 +71,13 @@ module Diarize
71
71
  @vector.hash
72
72
  end
73
73
 
74
+ def sha
75
+ Digest::SHA256.hexdigest(hash.to_s)
76
+ end
77
+
78
+ def to_a
79
+ @vector.to_a
80
+ end
81
+
74
82
  end # SuperVector
75
83
  end
@@ -1,3 +1,3 @@
1
1
  module Diarize
2
- VERSION = "0.3.7"
2
+ VERSION = "0.3.8"
3
3
  end
@@ -0,0 +1,101 @@
1
+ # Extenions to the {Ruby-Java Bridge}[http://rjb.rubyforge.org/] module that
2
+ # adds a generic Java object wrapper class.
3
+ module Rjb
4
+ # A generic wrapper for a Java object loaded via the Ruby Java Bridge. The
5
+ # wrapper class handles intialization and stringification, and passes other
6
+ # method calls down to the underlying Java object. Objects returned by the
7
+ # underlying Java object are converted to the appropriate Ruby object.
8
+ #
9
+ # This object is enumerable, yielding items in the order defined by the Java
10
+ # object's iterator.
11
+ class JavaObjectWrapper
12
+ include Enumerable
13
+
14
+ # The underlying Java object.
15
+ attr_reader :java_object
16
+
17
+ # Initialize with a Java object <em>obj</em>. If <em>obj</em> is a
18
+ # String, assume it is a Java class name and instantiate it. Otherwise,
19
+ # treat <em>obj</em> as an instance of a Java object.
20
+ def initialize(obj, *args)
21
+ @java_object = obj.class == String ?
22
+ Rjb::import(obj).send(:new, *args) : obj
23
+ end
24
+
25
+ # Enumerate all the items in the object using its iterator. If the object
26
+ # has no iterator, this function yields nothing.
27
+ def each
28
+ if @java_object.getClass.getMethods.any? {|m| m.getName == "iterator"}
29
+ i = @java_object.iterator
30
+ while i.hasNext
31
+ yield wrap_java_object(i.next)
32
+ end
33
+ end
34
+ end # each
35
+
36
+ # Reflect unhandled method calls to the underlying Java object.
37
+ def method_missing(m, *args)
38
+ wrap_java_object(@java_object.send(m, *args))
39
+ end
40
+
41
+ # Convert a value returned by a call to the underlying Java object to the
42
+ # appropriate Ruby object as follows:
43
+ # * RJB objects are placed inside a generic JavaObjectWrapper wrapper.
44
+ # * <tt>java.util.ArrayList</tt> objects are converted to Ruby Arrays.
45
+ # * <tt>java.util.HashSet</tt> objects are converted to Ruby Sets
46
+ # * Other objects are left unchanged.
47
+ #
48
+ # This function is applied recursively to items in collection objects such
49
+ # as set and arrays.
50
+ def wrap_java_object(object)
51
+ if object.kind_of?(Array)
52
+ object.collect {|item| wrap_java_object(item)}
53
+ # Ruby-Java Bridge Java objects all have a _classname member which tells
54
+ # the name of their Java class.
55
+ elsif object.respond_to?(:_classname)
56
+ case object._classname
57
+ when /java\.util\.ArrayList/
58
+ # Convert java.util.ArrayList objects to Ruby arrays.
59
+ array_list = []
60
+ object.size.times do
61
+ |i| array_list << wrap_java_object(object.get(i))
62
+ end
63
+ array_list
64
+ when /java\.util\.HashSet/
65
+ # Convert java.util.HashSet objects to Ruby sets.
66
+ set = Set.new
67
+ i = object.iterator
68
+ while i.hasNext
69
+ set << wrap_java_object(i.next)
70
+ end
71
+ set
72
+ else
73
+ # Pass other RJB objects off to a handler.
74
+ wrap_rjb_object(object)
75
+ end # case
76
+ else
77
+ # Return non-RJB objects unchanged.
78
+ object
79
+ end # if
80
+ end # wrap_java_object
81
+
82
+ # By default, all RJB classes other than <tt>java.util.ArrayList</tt> and
83
+ # <tt>java.util.HashSet</tt> go in a generic wrapper. Derived classes may
84
+ # change this behavior.
85
+ def wrap_rjb_object(object)
86
+ JavaObjectWrapper.new(object)
87
+ end
88
+
89
+ # Show the classname of the underlying Java object.
90
+ def inspect
91
+ "<#{@java_object._classname}>"
92
+ end
93
+
94
+ # Use the underlying Java object's stringification.
95
+ def to_s
96
+ toString
97
+ end
98
+
99
+ protected :wrap_java_object, :wrap_rjb_object
100
+ end # JavaObjectWrapper
101
+ end # Rjb
data/test/speaker_test.rb CHANGED
@@ -2,6 +2,9 @@ require 'test_helper'
2
2
  require 'tempfile'
3
3
 
4
4
  class SpeakerTest < Test::Unit::TestCase
5
+ def setup
6
+ @model_file = File.join(File.dirname(__FILE__), 'data', 'speaker1.gmm')
7
+ end
5
8
 
6
9
  def test_detection_threshold
7
10
  Diarize::Speaker.detection_threshold = 0.1
@@ -28,8 +31,7 @@ class SpeakerTest < Test::Unit::TestCase
28
31
  end
29
32
 
30
33
  def test_initialize_with_model
31
- model_file = File.join(File.dirname(__FILE__), 'data', 'speaker1.gmm')
32
- speaker = Diarize::Speaker.new(nil, nil, model_file)
34
+ speaker = Diarize::Speaker.new(nil, nil, @model_file)
33
35
  assert_equal speaker.model.name, 'S0'
34
36
  end
35
37
 
@@ -66,8 +68,7 @@ class SpeakerTest < Test::Unit::TestCase
66
68
  end
67
69
 
68
70
  def test_divergence_is_symmetric
69
- model_file = File.join(File.dirname(__FILE__), 'data', 'speaker1.gmm')
70
- speaker1 = Diarize::Speaker.new(nil, nil, model_file)
71
+ speaker1 = Diarize::Speaker.new(nil, nil, @model_file)
71
72
  speaker2 = Diarize::Speaker.ubm
72
73
  assert Diarize::Speaker.divergence(speaker1, speaker2) > 0
73
74
  assert_equal Diarize::Speaker.divergence(speaker1, speaker2), Diarize::Speaker.divergence(speaker2, speaker1)
@@ -75,16 +76,14 @@ class SpeakerTest < Test::Unit::TestCase
75
76
  end
76
77
 
77
78
  def test_divergence_ruby_is_same_as_divergence_lium
78
- model_file = File.join(File.dirname(__FILE__), 'data', 'speaker1.gmm')
79
- speaker1 = Diarize::Speaker.new(nil, nil, model_file)
79
+ speaker1 = Diarize::Speaker.new(nil, nil, @model_file)
80
80
  speaker2 = Diarize::Speaker.ubm
81
81
  assert_equal Diarize::Speaker.divergence_lium(speaker1, speaker2).round(12), Diarize::Speaker.divergence_ruby(speaker1, speaker2).round(12)
82
82
  end
83
83
 
84
- def test_normalise
84
+ def test_normalize
85
85
  # Testing M-Norm
86
- model_file = File.join(File.dirname(__FILE__), 'data', 'speaker1.gmm')
87
- speaker1 = Diarize::Speaker.new(nil, nil, model_file)
86
+ speaker1 = Diarize::Speaker.new(nil, nil, @model_file)
88
87
  speaker2 = Diarize::Speaker.ubm
89
88
  assert Diarize::Speaker.divergence(speaker1, speaker2) != 1.0
90
89
  speaker1.normalize! # Putting speaker1.gmm at distance 1 from UBM
@@ -98,4 +97,38 @@ class SpeakerTest < Test::Unit::TestCase
98
97
  assert_equal old_supervector, speaker.supervector
99
98
  end
100
99
 
100
+ def test_to_rdf
101
+ speaker = Diarize::Speaker.new(URI.parse(""), "F", @model_file)
102
+ speaker.model_uri = URI.parse("https://www.example.com/model/1")
103
+ speaker.mean_log_likelihood = 0.9
104
+ to_rdf = speaker.to_rdf
105
+ assert_equal true, to_rdf.include?("ws:gender")
106
+ assert_equal true, to_rdf.include?("ws:model")
107
+ assert_equal true, to_rdf.include?("ws:mean_log_likelihood")
108
+ assert_equal true, to_rdf.include?("ws:supervector_hash")
109
+ assert_equal true, to_rdf.include?("https://www.example.com/model/1")
110
+ end
111
+
112
+ def test_as_json
113
+ speaker = Diarize::Speaker.new(URI.parse(""), "F", @model_file)
114
+ speaker.mean_log_likelihood = 0.9
115
+ as_json = speaker.as_json
116
+ assert_equal true, as_json.has_key?('gender')
117
+ assert_equal true, as_json.has_key?('model')
118
+ assert_equal true, as_json.has_key?('mean_log_likelihood')
119
+ assert_equal true, as_json.has_key?('supervector_hash')
120
+ assert_equal true, as_json.has_key?('supervector_sha')
121
+ end
122
+
123
+ def test_to_json
124
+ speaker = Diarize::Speaker.new(URI.parse(""), "F", @model_file)
125
+ speaker.mean_log_likelihood = 0.9
126
+ to_json = speaker.to_json
127
+ as_json = JSON.parse(to_json)
128
+ assert_equal true, as_json.has_key?('gender')
129
+ assert_equal true, as_json.has_key?('model')
130
+ assert_equal true, as_json.has_key?('mean_log_likelihood')
131
+ assert_equal true, as_json.has_key?('supervector_hash')
132
+ assert_equal true, as_json.has_key?('supervector_sha')
133
+ end
101
134
  end
@@ -21,4 +21,16 @@ class SuperVectorTest < Test::Unit::TestCase
21
21
  assert_equal sv.vector.hash, sv.hash
22
22
  end
23
23
 
24
+ def test_sha
25
+ model = Diarize::Speaker.load_model(File.join(File.dirname(__FILE__), 'data', 'speaker1.gmm'))
26
+ sv = Diarize::SuperVector.generate_from_model(model)
27
+ assert_equal Digest::SHA256.hexdigest(sv.hash.to_s), sv.sha
28
+ end
29
+
30
+ def test_to_a
31
+ model = Diarize::Speaker.load_model(File.join(File.dirname(__FILE__), 'data', 'speaker1.gmm'))
32
+ sv = Diarize::SuperVector.generate_from_model(model)
33
+ assert_equal sv.instance_variable_get("@vector").to_a, sv.to_a
34
+ end
35
+
24
36
  end
data/test/version_test.rb CHANGED
@@ -3,7 +3,7 @@ require 'test_helper'
3
3
  class VersionTest < Test::Unit::TestCase
4
4
 
5
5
  def test_current_version
6
- assert_equal "0.3.7", Diarize::VERSION
6
+ assert_equal "0.3.8", Diarize::VERSION
7
7
  end
8
8
 
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: diarize-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yves Raimond
@@ -153,6 +153,7 @@ files:
153
153
  - lib/diarize/super_vector.rb
154
154
  - lib/diarize/ubm.gmm
155
155
  - lib/diarize/version.rb
156
+ - lib/rjb/java_object_wrapper.rb
156
157
  - test/audio_test.rb
157
158
  - test/data/foo.wav
158
159
  - test/data/speaker1.gmm