noyes 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.0
1
+ 0.9.0
@@ -0,0 +1,64 @@
1
+ #include "ruby.h"
2
+ #include "noyes.h"
3
+ #include "rnoyes.h"
4
+
5
+ static int id_push;
6
+
7
+ VALUE cArrayList;
8
+
9
+ static void free_n_list(void *p) {
10
+ n_list_free(p);
11
+ }
12
+
13
+ static VALUE t_init(VALUE self) {
14
+ NList *st = n_list_new();
15
+ VALUE stv = Data_Wrap_Struct(cArrayList, 0, free_n_list, st);
16
+ rb_iv_set(self, "@n_list", stv);
17
+ return self;
18
+ }
19
+
20
+ static VALUE t_size(VALUE self) {
21
+ NList *array;
22
+ VALUE arrayv = rb_iv_get(self, "@n_list");
23
+ Data_Get_Struct(arrayv, NList, array);
24
+ return INT2FIX(n_list_size(array));
25
+ }
26
+
27
+ static VALUE t_add(VALUE self, VALUE obj) {
28
+ NList *array;
29
+ VALUE arrayv = rb_iv_get(self, "@n_list");
30
+ Data_Get_Struct(arrayv, NList, array);
31
+ n_list_add(array, (void*)obj);
32
+ return Qnil;
33
+ }
34
+
35
+ static VALUE t_get(VALUE self, VALUE obj) {
36
+ NList *array;
37
+ VALUE arrayv = rb_iv_get(self, "@n_list");
38
+ Data_Get_Struct(arrayv, NList, array);
39
+ return (VALUE)n_list_get(array, FIX2INT(obj));
40
+ }
41
+
42
+ static VALUE t_remove(VALUE self, VALUE start, VALUE finish) {
43
+ NList *array;
44
+ VALUE arrayv = rb_iv_get(self, "@n_list");
45
+ Data_Get_Struct(arrayv, NList, array);
46
+ int b = FIX2INT(start);
47
+ int e = FIX2INT(finish);
48
+ if (n_list_remove(array, b, e)) {
49
+ int s = n_list_size(array);
50
+ rb_raise(rb_eArgError, "start = %d, finish = %d with size = %d", b, e, s);
51
+ }
52
+ return Qnil;
53
+ }
54
+
55
+ void Init_n_list() {
56
+ VALUE m_noyes_c = rb_define_module("NoyesC");
57
+ cArrayList = rb_define_class_under(m_noyes_c, "ArrayList", rb_cObject);
58
+ rb_define_method(cArrayList, "initialize", t_init, 0);
59
+ rb_define_method(cArrayList, "size", t_size, 0);
60
+ rb_define_method(cArrayList, "add", t_add, 1);
61
+ rb_define_method(cArrayList, "get", t_get, 1);
62
+ rb_define_method(cArrayList, "remove", t_remove, 2);
63
+ id_push = rb_intern("push");
64
+ }
@@ -0,0 +1,36 @@
1
+ #include "ruby.h"
2
+ #include "noyes.h"
3
+ #include "rnoyes.h"
4
+
5
+ static int id_push;
6
+
7
+ VALUE cBentCentMarker;
8
+
9
+ static void bent_cent_marker_free(void *p) {
10
+ free_bent_cent_marker(p);
11
+ }
12
+
13
+ static VALUE t_init(VALUE self) {
14
+ BentCentMarker *pre = new_bent_cent_marker();
15
+ VALUE prev = Data_Wrap_Struct(cBentCentMarker, 0, bent_cent_marker_free, pre);
16
+ rb_iv_set(self, "@bent_cent_marker", prev);
17
+ return self;
18
+ }
19
+
20
+ static VALUE t_left_shift(VALUE self, VALUE obj) {
21
+ NMatrix1 *M = v_2_nmatrix1(obj);
22
+ BentCentMarker *pre;
23
+ VALUE prev = rb_iv_get(self, "@bent_cent_marker");
24
+ Data_Get_Struct(prev, BentCentMarker, pre);
25
+ int res = bent_cent_marker_apply(pre, M);
26
+ free_nmatrix1(M);
27
+ return res ? Qtrue : Qfalse;
28
+ }
29
+
30
+ void Init_bent_cent_marker() {
31
+ VALUE m_noyes_c = rb_define_module("NoyesC");
32
+ cBentCentMarker = rb_define_class_under(m_noyes_c, "BentCentMarker", rb_cObject);
33
+ rb_define_method(cBentCentMarker, "initialize", t_init, 0);
34
+ rb_define_method(cBentCentMarker, "<<", t_left_shift, 1);
35
+ id_push = rb_intern("push");
36
+ }
@@ -49,6 +49,21 @@ static VALUE t_melcos(VALUE self) {
49
49
  return result;
50
50
  }
51
51
 
52
+ static VALUE t_dft(VALUE classmod, VALUE data, VALUE size) {
53
+ NMatrix1 *M = v_2_nmatrix1(data);
54
+ NMatrix *R = dft(M->data, M->rows, FIX2INT(size));
55
+ VALUE result = rb_ary_new2(R->cols);
56
+ int i;
57
+ for (i=0;i<R->cols;++i) {
58
+ VALUE real = rb_float_new(R->data[0][i]);
59
+ VALUE imag = rb_float_new(R->data[1][i]);
60
+ rb_ary_store(result, i, rb_complex_new(real, imag));
61
+ }
62
+ free_nmatrix1(M);
63
+ free_nmatrix(R);
64
+ return result;
65
+ }
66
+
52
67
  void Init_dct() {
53
68
  VALUE m_noyes_c = rb_define_module("NoyesC");
54
69
  cDiscreteCosineTransform = rb_define_class_under(m_noyes_c,
@@ -56,5 +71,6 @@ void Init_dct() {
56
71
  rb_define_method(cDiscreteCosineTransform, "initialize", t_init, -2);
57
72
  rb_define_method(cDiscreteCosineTransform, "<<", t_left_shift, 1);
58
73
  rb_define_method(cDiscreteCosineTransform, "melcos", t_melcos, 0);
74
+ rb_define_module_function(m_noyes_c, "dft", t_dft, 2);
59
75
  id_push = rb_intern("push");
60
76
  }
@@ -0,0 +1,72 @@
1
+ #include <string.h>
2
+ #include <stdlib.h>
3
+ #include <stdio.h>
4
+ #include "n_array_list.h"
5
+
6
+ #define NLIST_INITIAL_CAPACITY 10
7
+ #define NLIST_DELTA_CAPACITY 10
8
+ #undef TRUE
9
+ #define TRUE 1
10
+ #undef FALSE
11
+ #define FALSE 0
12
+
13
+ NList * n_list_new() {
14
+ NList * self;
15
+ self = malloc(sizeof(NList));
16
+ self->capacity = NLIST_INITIAL_CAPACITY;
17
+ self->data = malloc(sizeof(void*) * self->capacity);
18
+ self->size = 0;
19
+ return self;
20
+ }
21
+
22
+ void n_list_free(NList * self) {
23
+ free(self->data);
24
+ free(self);
25
+ }
26
+
27
+ int n_list_add(NList * self, void * object) {
28
+ int old_size = n_list_size(self);
29
+ int new_capacity;
30
+ void ** new_data;
31
+
32
+ (self->size)++;
33
+ if (old_size == self->capacity) {
34
+ new_capacity = self->capacity + NLIST_DELTA_CAPACITY;
35
+ new_data = malloc(sizeof(void*) * new_capacity);
36
+ memcpy(new_data, self->data, sizeof(void*) * old_size);
37
+ free(self->data);
38
+ (self->data) = new_data;
39
+ self->capacity = new_capacity;
40
+ }
41
+ self->data[old_size] = object;
42
+ return TRUE;
43
+ }
44
+
45
+ int n_list_remove(NList * self, int start, int finish) {
46
+ if (start > finish || finish > self->size)
47
+ return 1;
48
+
49
+ memmove(self->data + start, self->data + finish,
50
+ sizeof(void*) * (self->size - finish));
51
+ self->size = self->size - (finish - start);
52
+ if (self->size < self->capacity - 2 * NLIST_DELTA_CAPACITY) {
53
+ int new_capacity = self->size + NLIST_DELTA_CAPACITY;
54
+ self->data = realloc(self->data, sizeof(void*) * new_capacity);
55
+ self->capacity = new_capacity;
56
+ }
57
+ return 0;
58
+ }
59
+
60
+ void * n_list_get(const NList * self, const int index) {
61
+ if (index < 0 || index > self->size)
62
+ return NULL;
63
+ return self->data[index];
64
+ }
65
+
66
+ int n_list_is_empty(const NList * self) {
67
+ return 0 == n_list_size(self);
68
+ }
69
+
70
+ int n_list_size(const NList * self) {
71
+ return self->size;
72
+ }
@@ -0,0 +1,18 @@
1
+ #ifndef _N_ARRAY_LIST_H_
2
+ #define _N_ARRAY_LIST_H_
3
+
4
+ typedef struct {
5
+ int capacity;
6
+ void **data;
7
+ int size;
8
+ } NList;
9
+
10
+ NList * n_list_new();
11
+ void n_list_free(NList * self);
12
+ int n_list_size(const NList * self);
13
+ int n_list_add(NList * self, void * object);
14
+ int n_list_remove(NList * self, int start, int finish);
15
+ void * n_list_get(const NList * self, const int index);
16
+ int n_list_is_empty(const NList * self);
17
+
18
+ #endif
@@ -0,0 +1,48 @@
1
+ #include "noyes.h"
2
+ #include "math.h"
3
+ #include "stdlib.h"
4
+
5
+ BentCentMarker * new_bent_cent_marker() {
6
+ BentCentMarker *self = malloc(sizeof(BentCentMarker));
7
+ self->adjustment = 0.003;
8
+ self->average_number = 1.0;
9
+ self->background = 100.0;
10
+ self->level = 0.0;
11
+ self->min_signal = 0.0;
12
+ self->threshold = 10.0;
13
+ return self;
14
+ }
15
+
16
+ void free_bent_cent_marker(BentCentMarker *self) {
17
+ free(self);
18
+ }
19
+
20
+ double bent_cent_log_rms(BentCentMarker *self, NMatrix1 *pcm) {
21
+ double sum_of_squares = 0.0;
22
+ int i;
23
+ for (i=0;i<pcm->rows;++i) {
24
+ sum_of_squares += pcm->data[i] * pcm->data[i];
25
+ }
26
+ double rms = sqrt(sum_of_squares/pcm->rows);
27
+ rms = fmax(rms,1.0);
28
+ return log(rms) * 20;
29
+ }
30
+
31
+ int bent_cent_marker_apply(BentCentMarker *self, NMatrix1 *pcm) {
32
+ int is_speech = 0;
33
+ double current = bent_cent_log_rms(self, pcm);
34
+ if (current >= self->min_signal) {
35
+ self->level = ((self->level * self->average_number) + current) /
36
+ (self->average_number + 1);
37
+ if (current < self->background) {
38
+ self->background = current;
39
+ } else {
40
+ self->background += (current - self->background) * self->adjustment;
41
+ }
42
+ if (self->level < self->background) {
43
+ self->level = self->background;
44
+ }
45
+ is_speech = self->level - self->background > self->threshold;
46
+ }
47
+ return is_speech;
48
+ }
@@ -0,0 +1,67 @@
1
+ #include "noyes.h"
2
+ #undef TRUE
3
+ #define TRUE 1
4
+ #undef FALSE
5
+ #define FALSE 0
6
+
7
+ SpeechTrimmer * new_speech_trimmer() {
8
+ SpeechTrimmer *self = malloc(sizeof(SpeechTrimmer));
9
+ self->leader = 5;
10
+ self->trailer = 5;
11
+ self->speech_started = FALSE;
12
+ self->bcm = new_bent_cent_marker();
13
+ self->false_count = 0;
14
+ self->true_count = 0;
15
+ self->queue = n_list_new();
16
+ self->eos_reached = FALSE;
17
+ self->scs = 20;
18
+ self->ecs = 50;
19
+ return self;
20
+ }
21
+
22
+ void free_speech_trimmer(SpeechTrimmer *self) {
23
+ free_bent_cent_marker(self->bcm);
24
+ n_list_free(self->queue);
25
+ free(self);
26
+ }
27
+
28
+ void speech_trimmer_enqueue(SpeechTrimmer *self, NMatrix1* pcm) {
29
+ if (self->eos_reached)
30
+ return;
31
+ n_list_add(self->queue, pcm);
32
+ if (bent_cent_marker_apply(self->bcm, pcm)) {
33
+ self->false_count = 0;
34
+ self->true_count += 1;
35
+ } else {
36
+ self->false_count += 1;
37
+ self->true_count = 0;
38
+ }
39
+ if (self->speech_started) {
40
+ if (self->false_count == self->ecs) {
41
+ self->eos_reached = TRUE;
42
+ int new_size = n_list_size(self->queue) - self->ecs + self->trailer;
43
+ n_list_remove(self->queue, new_size, n_list_size(self->queue));
44
+ }
45
+ } else if (self->true_count > self->scs) {
46
+ if (self->leader + self->scs < n_list_size(self->queue)) {
47
+ int start = n_list_size(self->queue) - self->leader - self->scs - 1;
48
+ n_list_remove(self->queue, 0, start);
49
+ }
50
+ self->speech_started = TRUE;
51
+ }
52
+ }
53
+
54
+ NMatrix1 * speech_trimmer_dequeue(SpeechTrimmer *self) {
55
+ if (n_list_size(self->queue) == 0)
56
+ return NULL;
57
+ if (self->eos_reached || (self->speech_started &&
58
+ n_list_size(self->queue) > self->ecs)) {
59
+ NMatrix1 * N = n_list_get(self->queue, 0);
60
+ n_list_remove(self->queue, 0, 1);
61
+ return N;
62
+ }
63
+ return NULL;
64
+ }
65
+ int speech_trimmer_eos(SpeechTrimmer *self) {
66
+ return self->eos_reached;
67
+ }
data/lib/c_impl/noyes.h CHANGED
@@ -145,6 +145,42 @@ Fast8kMfcc* new_fast_8k_mfcc();
145
145
  void free_fast_8k_mfcc(Fast8kMfcc *self);
146
146
  NMatrix *fast_8k_mfcc_apply(Fast8kMfcc *self, NMatrix1 *data);
147
147
 
148
+ // Silence removal with BentCentMarker and SpeechTrimmer
149
+ typedef struct {
150
+ double adjustment;
151
+ double average_number;
152
+ double background;
153
+ double level;
154
+ double min_signal;
155
+ double threshold;
156
+ } BentCentMarker;
157
+
158
+ BentCentMarker * new_bent_cent_marker();
159
+ void free_bent_cent_marker(BentCentMarker *self);
160
+ double bent_cent_marker_log_rms(BentCentMarker *self, NMatrix1 *data);
161
+ int bent_cent_marker_apply(BentCentMarker *self, NMatrix1 *data);
162
+
163
+ #include "n_array_list.h"
164
+
165
+ typedef struct {
166
+ int leader;
167
+ int trailer;
168
+ int speech_started;
169
+ int false_count;
170
+ int true_count;
171
+ int scs;
172
+ int ecs;
173
+ BentCentMarker *bcm;
174
+ NList *queue;
175
+ int eos_reached;
176
+ } SpeechTrimmer;
177
+
178
+ SpeechTrimmer * new_speech_trimmer();
179
+ void free_speech_trimmer(SpeechTrimmer *self);
180
+ void speech_trimmer_enqueue(SpeechTrimmer *self, NMatrix1* pcm);
181
+ NMatrix1 * speech_trimmer_dequeue(SpeechTrimmer *self);
182
+ int speech_trimmer_eos(SpeechTrimmer *self);
183
+
148
184
  #ifdef __cplusplus
149
185
  }
150
186
  #endif
data/lib/c_impl/noyes_c.c CHANGED
@@ -85,4 +85,7 @@ void Init_noyes_c() {
85
85
  Init_live_cmn();
86
86
  Init_fast_8k_mfcc();
87
87
  Init_dct();
88
+ Init_bent_cent_marker();
89
+ Init_speech_trimmer();
90
+ Init_n_list();
88
91
  }
data/lib/c_impl/rnoyes.h CHANGED
@@ -9,6 +9,8 @@ void Init_log_compressor();
9
9
  void Init_live_cmn();
10
10
  void Init_fast_8k_mfcc();
11
11
  void Init_dct();
12
+ void Init_bent_cent_marker();
13
+ void Init_speech_trimmer();
12
14
 
13
15
  VALUE nmatrix_2_v(NMatrix *d);
14
16
  NMatrix * v_2_nmatrix(VALUE value);
@@ -0,0 +1,52 @@
1
+ #include "ruby.h"
2
+ #include "noyes.h"
3
+ #include "rnoyes.h"
4
+
5
+ static int id_push;
6
+
7
+ VALUE cSpeechTrimmer;
8
+
9
+ static void speech_trimmer_free(void *p) {
10
+ free_speech_trimmer(p);
11
+ }
12
+
13
+ static VALUE t_init(VALUE self) {
14
+ SpeechTrimmer *st = new_speech_trimmer();
15
+ VALUE stv = Data_Wrap_Struct(cSpeechTrimmer, 0, speech_trimmer_free, st);
16
+ rb_iv_set(self, "@speech_trimmer", stv);
17
+ return self;
18
+ }
19
+
20
+ static VALUE t_enqueue(VALUE self, VALUE obj) {
21
+ NMatrix1 *M = v_2_nmatrix1(obj);
22
+ SpeechTrimmer *st;
23
+ Data_Get_Struct(rb_iv_get(self, "@speech_trimmer"), SpeechTrimmer, st);
24
+ speech_trimmer_enqueue(st, M);
25
+ return Qnil;
26
+ }
27
+
28
+ static VALUE t_dequeue(VALUE self) {
29
+ SpeechTrimmer *st;
30
+ Data_Get_Struct(rb_iv_get(self, "@speech_trimmer"), SpeechTrimmer, st);
31
+ NMatrix1 *N =speech_trimmer_dequeue(st);
32
+ VALUE result = nmatrix1_2_v(N);
33
+ free_nmatrix1(N);
34
+ return result;
35
+ }
36
+
37
+ static VALUE t_eos(VALUE self) {
38
+ SpeechTrimmer *st;
39
+ VALUE stv = rb_iv_get(self, "@speech_trimmer");
40
+ Data_Get_Struct(stv, SpeechTrimmer, st);
41
+ return speech_trimmer_dequeue(st) ? Qtrue : Qfalse;
42
+ }
43
+
44
+ void Init_speech_trimmer() {
45
+ VALUE m_noyes_c = rb_define_module("NoyesC");
46
+ cSpeechTrimmer = rb_define_class_under(m_noyes_c, "SpeechTrimmer", rb_cObject);
47
+ rb_define_method(cSpeechTrimmer, "initialize", t_init, 0);
48
+ rb_define_method(cSpeechTrimmer, "enqueue", t_enqueue, 1);
49
+ rb_define_method(cSpeechTrimmer, "dequeue", t_dequeue, 0);
50
+ rb_define_method(cSpeechTrimmer, "eos?", t_eos, 0);
51
+ id_push = rb_intern("push");
52
+ }
@@ -0,0 +1,19 @@
1
+ module Math
2
+ def self.max a, b
3
+ a > b ? a : b
4
+ end
5
+ def self.min a, b
6
+ a < b ? a : b
7
+ end
8
+ end
9
+ # I don't really undestand why Ruby 1.9 needs this. It seems that Math gets
10
+ # redefine to CMath at some point. So calling Math.max will fail in 1.9 unless
11
+ # I put these functions in CMath too.
12
+ module CMath
13
+ def self.max a, b
14
+ a > b ? a : b
15
+ end
16
+ def self.min a, b
17
+ a < b ? a : b
18
+ end
19
+ end
@@ -1,6 +1,5 @@
1
1
  require 'noyes'
2
2
  require 'common/file2pcm'
3
- include Noyes
4
3
 
5
4
  # The following flags are in network byte order (big endian) and are 4 bytes
6
5
  # long.
data/lib/common.rb CHANGED
@@ -4,3 +4,4 @@ require 'common/noyes_dsl'
4
4
  require 'common/noyes_math'
5
5
  require 'common/noyes_protocol'
6
6
  require 'common/send_incrementally'
7
+ require 'common/ruby_ext'
@@ -0,0 +1,13 @@
1
+ module NoyesJava
2
+ class BentCentMarker
3
+ def initialize
4
+ @bcm = Java::talkhouse.BentCentMarker.new
5
+ end
6
+ def logrms pcm
7
+ @bcm.logRMS pcm.to_java(Java::double)
8
+ end
9
+ def << pcm
10
+ @bcm.apply pcm.to_java(Java::double)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module NoyesJava
2
+ class SpeechTrimmer
3
+ def initialize
4
+ @st = Java::talkhouse.SpeechTrimmer.new
5
+ end
6
+ def enqueue pcm
7
+ @st.enqueue pcm.to_java(Java::double)
8
+ end
9
+ def dequeue
10
+ speech = @st.dequeue
11
+ speech.to_a if speech
12
+ end
13
+ def eos?
14
+ @st.eos
15
+ end
16
+ end
17
+ end
18
+
data/lib/noyes.rb CHANGED
@@ -10,3 +10,5 @@ require 'ruby_impl/discrete_fourier_transform'
10
10
  require 'ruby_impl/power_spec'
11
11
  require 'ruby_impl/preemphasis'
12
12
  require 'ruby_impl/segment'
13
+ require 'ruby_impl/bent_cent_marker'
14
+ require 'ruby_impl/speech_trimmer'
data/lib/noyes_java.rb CHANGED
@@ -11,4 +11,6 @@ require 'java_impl/discrete_fourier_transform'
11
11
  require 'java_impl/power_spec'
12
12
  require 'java_impl/preemphasis'
13
13
  require 'java_impl/segment'
14
+ require 'java_impl/bent_cent_marker'
15
+ require 'java_impl/speech_trimmer'
14
16
  require 'noyes.jar'
@@ -0,0 +1,40 @@
1
+ module Noyes
2
+ # Determines whether a PCM frame is speech or not using Bent
3
+ # Schmidt-Nielsen's algorithm. Basically, it's an energy-based detector
4
+ # where the background noise level is constantly estimated.
5
+ #
6
+ # The pcm data should be in 100 millisecond chunks. For example,
7
+ # At 8000 Hz there should 80 frames of pcm.
8
+ class BentCentMarker
9
+ def initialize
10
+ @adjustment = 0.003
11
+ @average_number = 1.0
12
+ @background = 100.0
13
+ @level = 0.0
14
+ @min_signal = 0.0
15
+ @threshold = 10.0
16
+ end
17
+ def logrms pcm
18
+ sum_of_squares = 0.0
19
+ pcm.each {|sample| sum_of_squares += sample * sample}
20
+ rms = Math.sqrt sum_of_squares / pcm.size;
21
+ rms = Math.max rms, 1
22
+ Math.log(rms) * 20
23
+ end
24
+ def << pcm
25
+ is_speech = false
26
+ current = logrms pcm
27
+ if current >= @min_signal
28
+ @level = ((@level * @average_number) + current) / (@average_number + 1)
29
+ if current < @background
30
+ @background = current
31
+ else
32
+ @background += (current - @background) * @adjustment
33
+ end
34
+ @level = @background if (@level < @background)
35
+ is_speech = @level - @background > @threshold
36
+ end
37
+ is_speech
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,54 @@
1
+ module Noyes
2
+ # SpeechTrimmer trims non-speech from both ends of an audio stream. Each time
3
+ # you enqueue audio into it you should dequeue audio out of it until dequeue
4
+ # returns nil. Then check for eos. If eos is true you are done.
5
+ # SpeechTrimmer is designed to work efficiently with live audio.
6
+ class SpeechTrimmer
7
+ def initialize
8
+ @leader = 5 # Cents of leading silence to retain.
9
+ @trailer = 5 # Cents of trailing silence to retain.
10
+ @speech_started = false
11
+ @cent_marker = BentCentMarker.new
12
+ @false_count=0
13
+ @true_count=0
14
+ @queue = []
15
+ @eos_reached = false
16
+ @scs = 20 # Centiseconds of speech before detection of utterance.
17
+ @ecs = 50 # Centiseconds of silence before end detection.
18
+ end
19
+
20
+ def enqueue pcm
21
+ return if @eos_reached
22
+ @queue << pcm
23
+ if @cent_marker << pcm
24
+ @false_count = 0
25
+ @true_count += 1
26
+ else
27
+ @false_count += 1
28
+ @true_count = 0
29
+ end
30
+ if @speech_started
31
+ if @false_count == @ecs
32
+ @eos_reached = true
33
+ # only keep trailer number of cents once eos is detected.
34
+ @queue = @queue[0, @queue.size - @ecs + @trailer]
35
+ end
36
+ elsif @true_count > @scs
37
+ # Discard most begining silence, keeping just a tad.
38
+ if @leader + @scs < @queue.size
39
+ start = @queue.size - @leader - 1 - @scs
40
+ @queue = @queue[start,@queue.size - start]
41
+ end
42
+ @speech_started = true
43
+ end
44
+ end
45
+ def dequeue
46
+ if @eos_reached || (@speech_started && @queue.size > @ecs)
47
+ @queue.shift
48
+ end
49
+ end
50
+ def eos?
51
+ @eos_reached
52
+ end
53
+ end
54
+ end
data/ship/noyes.jar CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: noyes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Woelfel
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-05-28 00:00:00 -04:00
12
+ date: 2010-06-22 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -37,6 +37,8 @@ extra_rdoc_files:
37
37
  - README
38
38
  files:
39
39
  - VERSION
40
+ - lib/c_impl/array_list.c
41
+ - lib/c_impl/bent_cent_marker.c
40
42
  - lib/c_impl/discrete_cosine_transform.c
41
43
  - lib/c_impl/extconf.rb
42
44
  - lib/c_impl/fast_8k_mfcc.c
@@ -44,6 +46,9 @@ files:
44
46
  - lib/c_impl/live_cmn.c
45
47
  - lib/c_impl/log_compressor.c
46
48
  - lib/c_impl/mel_filter.c
49
+ - lib/c_impl/n_array_list.c
50
+ - lib/c_impl/n_array_list.h
51
+ - lib/c_impl/n_bent_cent_marker.c
47
52
  - lib/c_impl/n_dft.c
48
53
  - lib/c_impl/n_discrete_cosine_transform.c
49
54
  - lib/c_impl/n_fast_8k_mfcc.c
@@ -55,12 +60,14 @@ files:
55
60
  - lib/c_impl/n_power_spec.c
56
61
  - lib/c_impl/n_preemphasis.c
57
62
  - lib/c_impl/n_segmenter.c
63
+ - lib/c_impl/n_speech_trimmer.c
58
64
  - lib/c_impl/noyes.h
59
65
  - lib/c_impl/noyes_c.c
60
66
  - lib/c_impl/power_spectrum.c
61
67
  - lib/c_impl/preemphasis.c
62
68
  - lib/c_impl/rnoyes.h
63
69
  - lib/c_impl/segmenter.c
70
+ - lib/c_impl/speech_trimmer.c
64
71
  - lib/common.rb
65
72
  - lib/common/file2pcm.rb
66
73
  - lib/common/mock_noyes_server.rb
@@ -68,8 +75,10 @@ files:
68
75
  - lib/common/noyes_math.rb
69
76
  - lib/common/noyes_protocol.rb
70
77
  - lib/common/parallel_filter.rb
78
+ - lib/common/ruby_ext.rb
71
79
  - lib/common/send_incrementally.rb
72
80
  - lib/common/serial_filter.rb
81
+ - lib/java_impl/bent_cent_marker.rb
73
82
  - lib/java_impl/dct.rb
74
83
  - lib/java_impl/delta.rb
75
84
  - lib/java_impl/discrete_fourier_transform.rb
@@ -82,9 +91,11 @@ files:
82
91
  - lib/java_impl/power_spec.rb
83
92
  - lib/java_impl/preemphasis.rb
84
93
  - lib/java_impl/segment.rb
94
+ - lib/java_impl/speech_trimmer.rb
85
95
  - lib/noyes.rb
86
96
  - lib/noyes_c.rb
87
97
  - lib/noyes_java.rb
98
+ - lib/ruby_impl/bent_cent_marker.rb
88
99
  - lib/ruby_impl/dct.rb
89
100
  - lib/ruby_impl/delta.rb
90
101
  - lib/ruby_impl/discrete_fourier_transform.rb
@@ -96,6 +107,7 @@ files:
96
107
  - lib/ruby_impl/power_spec.rb
97
108
  - lib/ruby_impl/preemphasis.rb
98
109
  - lib/ruby_impl/segment.rb
110
+ - lib/ruby_impl/speech_trimmer.rb
99
111
  - ship/noyes.jar
100
112
  - COPYING
101
113
  - FAQ