Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ruby: New segment callback #2506

Merged
merged 45 commits into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
246793c
Add Params#new_segment_callback= method
KitaitiMakoto Oct 17, 2024
2ccddb9
Add tests for Params#new_segment_callback=
KitaitiMakoto Oct 17, 2024
0c1ff90
Group tests for #transcribe
KitaitiMakoto Oct 17, 2024
1d2d772
Don't use static for thread-safety
KitaitiMakoto Oct 17, 2024
37aa3c6
Set new_segment_callback only when necessary
KitaitiMakoto Oct 17, 2024
3fec5d3
Remove redundant check
KitaitiMakoto Oct 17, 2024
be67fa2
[skip ci] Add Ruby version README
KitaitiMakoto Oct 18, 2024
58d3fb6
Revert "Group tests for #transcribe"
KitaitiMakoto Oct 19, 2024
cee8c6a
Revert "Add tests for Params#new_segment_callback="
KitaitiMakoto Oct 19, 2024
b589895
Add test for Context#full_n_segments
KitaitiMakoto Oct 19, 2024
8990107
Add Context#full_n_segments
KitaitiMakoto Oct 19, 2024
a175c5c
Add tests for lang API
KitaitiMakoto Oct 19, 2024
1c74fdc
Add lang API
KitaitiMakoto Oct 19, 2024
588aa1c
Add tests for Context#full_lang_id API
KitaitiMakoto Oct 19, 2024
6e62076
Add Context#full_lang_id
KitaitiMakoto Oct 19, 2024
ad55836
Add abnormal test cases for lang
KitaitiMakoto Oct 19, 2024
e0255a5
Raise appropriate errors from lang APIs
KitaitiMakoto Oct 19, 2024
09eb66d
Add tests for Context#full_get_segment_t{0,1} API
KitaitiMakoto Oct 19, 2024
4f261f6
Add Context#full_get_segment_t{0,1}
KitaitiMakoto Oct 19, 2024
d69e0be
Add tests for Context#full_get_segment_speaker_turn_next API
KitaitiMakoto Oct 19, 2024
9902dcc
Add Context#full_get_segment_speaker_turn_next
KitaitiMakoto Oct 19, 2024
beba539
Add tests for Context#full_get_segment_text
KitaitiMakoto Oct 19, 2024
63830b6
Add Context#full_get_setgment_text
KitaitiMakoto Oct 19, 2024
0d1ec5f
Add tests for Params#new_segment_callback=
KitaitiMakoto Oct 20, 2024
084f450
Run new segment callback
KitaitiMakoto Oct 20, 2024
6128e05
Split tests to multiple files
KitaitiMakoto Oct 20, 2024
c2de24a
Use container struct for new segment callback
KitaitiMakoto Oct 20, 2024
3f28013
Add tests for Params#new_segment_callback_user_data=
KitaitiMakoto Oct 20, 2024
bb4e81c
Add Whisper::Params#new_user_callback_user_data=
KitaitiMakoto Oct 20, 2024
f411507
Add GC-related test for new segment callback
KitaitiMakoto Oct 20, 2024
79617d7
Protect new segment callback related structs from GC
KitaitiMakoto Oct 20, 2024
eae174e
Add meaningful test for build
KitaitiMakoto Oct 20, 2024
30c00c1
Rename: new_segment_callback_user_data -> new_segment_callback_container
KitaitiMakoto Oct 20, 2024
e7f75f1
Add tests for Whisper::Segment
KitaitiMakoto Oct 21, 2024
326055a
Add Whisper::Segment and Whisper::Context#each_segment
KitaitiMakoto Oct 21, 2024
1132c9e
Extract c_ruby_whisper_callback_container_allocate()
KitaitiMakoto Oct 21, 2024
ba0fbec
Add test for Whisper::Params#on_new_segment
KitaitiMakoto Oct 22, 2024
56c2dfd
Add Whisper::Params#on_new_egment
KitaitiMakoto Oct 22, 2024
87797cc
Assign symbol IDs to variables
KitaitiMakoto Oct 23, 2024
d94710c
Make extsources.yaml simpler
KitaitiMakoto Oct 23, 2024
a0cfc22
Update README
KitaitiMakoto Oct 23, 2024
2f925ca
Add document comments
KitaitiMakoto Oct 24, 2024
c94c8d4
Add test for calling Whisper::Params#on_new_segment multiple times
KitaitiMakoto Oct 24, 2024
c5564fc
Add file dependencies to GitHub actions config and .gitignore
KitaitiMakoto Oct 28, 2024
7a6640a
Add more files to ext/.gitignore
KitaitiMakoto Oct 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add Whisper::Params#on_new_egment
  • Loading branch information
KitaitiMakoto committed Oct 28, 2024
commit 56c2dfd028f5dcb384650bd19872da574b2450a7
33 changes: 31 additions & 2 deletions bindings/ruby/ext/ruby_whisper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ void rb_whisper_free(ruby_whisper *rw) {
void rb_whisper_params_mark(ruby_whisper_params *rwp) {
rb_gc_mark(rwp->new_segment_callback_container->user_data);
rb_gc_mark(rwp->new_segment_callback_container->callback);
rb_gc_mark(rwp->new_segment_callback_container->callbacks);
}

void rb_whisper_params_free(ruby_whisper_params *rwp) {
Expand All @@ -110,6 +111,7 @@ static ruby_whisper_callback_container * rb_whisper_callback_container_allocate(
container->context = nullptr;
container->user_data = Qnil;
container->callback = Qnil;
container->callbacks = rb_ary_new();
return container;
}

Expand Down Expand Up @@ -139,6 +141,9 @@ static VALUE ruby_whisper_initialize(int argc, VALUE *argv, VALUE self) {
return self;
}

// High level API
static VALUE rb_whisper_segment_initialize(VALUE context, int index);

/*
* transcribe a single file
* can emit to a block results
Expand Down Expand Up @@ -251,13 +256,28 @@ static VALUE ruby_whisper_transcribe(int argc, VALUE *argv, VALUE self) {
rwp->params.encoder_begin_callback_user_data = &is_aborted;
}

if (!NIL_P(rwp->new_segment_callback_container->callback)) {
if (!NIL_P(rwp->new_segment_callback_container->callback) || 0 != RARRAY_LEN(rwp->new_segment_callback_container->callbacks)) {
rwp->params.new_segment_callback = [](struct whisper_context * ctx, struct whisper_state * state, int n_new, void * user_data) {
const ruby_whisper_callback_container *container = (ruby_whisper_callback_container *)user_data;

// Currently, doesn't support state because
// those require to resolve GC-related problems.
rb_funcall(container->callback, rb_intern("call"), 4, *container->context, Qnil, INT2NUM(n_new), container->user_data);
if (!NIL_P(container->callback)) {
rb_funcall(container->callback, rb_intern("call"), 4, *container->context, Qnil, INT2NUM(n_new), container->user_data);
}
const long callbacks_len = RARRAY_LEN(container->callbacks);
if (0 == callbacks_len) {
return;
}
const int n_segments = whisper_full_n_segments_from_state(state);
for (int i = n_new; i > 0; i--) {
int i_segment = n_segments - i;
VALUE segment = rb_whisper_segment_initialize(*container->context, i_segment);
for (int j = 0; j < callbacks_len; j++) {
VALUE cb = rb_ary_entry(container->callbacks, j);
rb_funcall(cb, rb_intern("call"), 1, segment);
}
}
};
rwp->new_segment_callback_container->context = &self;
rwp->params.new_segment_callback_user_data = rwp->new_segment_callback_container;
Expand Down Expand Up @@ -532,6 +552,14 @@ static VALUE ruby_whisper_each_segment(VALUE self) {
return self;
}

static VALUE ruby_whisper_params_on_new_segment(VALUE self) {
ruby_whisper_params *rws;
Data_Get_Struct(self, ruby_whisper_params, rws);
const VALUE blk = rb_block_proc();
rb_ary_push(rws->new_segment_callback_container->callbacks, blk);
return Qnil;
}

static VALUE ruby_whisper_segment_get_start_time(VALUE self) {
ruby_whisper_segment *rws;
Data_Get_Struct(self, ruby_whisper_segment, rws);
Expand Down Expand Up @@ -635,6 +663,7 @@ void Init_whisper() {

rb_define_alloc_func(cSegment, ruby_whisper_segment_allocate);
rb_define_method(cContext, "each_segment", ruby_whisper_each_segment, 0);
rb_define_method(cParams, "on_new_segment", ruby_whisper_params_on_new_segment, 0);
rb_define_method(cSegment, "start_time", ruby_whisper_segment_get_start_time, 0);
rb_define_method(cSegment, "end_time", ruby_whisper_segment_get_end_time, 0);
rb_define_method(cSegment, "speaker_next_turn?", ruby_whisper_segment_get_speaker_turn_next, 0);
Expand Down
1 change: 1 addition & 0 deletions bindings/ruby/ext/ruby_whisper.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ typedef struct {
VALUE *context;
VALUE user_data;
VALUE callback;
VALUE callbacks;
} ruby_whisper_callback_container;

typedef struct {
Expand Down