From c2c12db7f7d6819942dac256d5c7be38564ed292 Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Fri, 15 May 2026 02:59:57 +0900 Subject: [PATCH] Define Parakeet::Segment#deconstruct_keys --- .../ruby/ext/ruby_whisper_parakeet_segment.c | 54 +++++++++++++++++++ bindings/ruby/ext/ruby_whisper_segment.c | 12 ++--- 2 files changed, 60 insertions(+), 6 deletions(-) diff --git a/bindings/ruby/ext/ruby_whisper_parakeet_segment.c b/bindings/ruby/ext/ruby_whisper_parakeet_segment.c index 76a2fcd18..ec5446005 100644 --- a/bindings/ruby/ext/ruby_whisper_parakeet_segment.c +++ b/bindings/ruby/ext/ruby_whisper_parakeet_segment.c @@ -5,6 +5,15 @@ ITERATOR(end_time, t1, TIME) \ ITERATOR(text, text, STRING) +enum { +#define DEF_IDX(name, c_name, type) RUBY_WHISPER_PARAKEET_SEGMENT_##name, + + ITERATE_ATTRS(DEF_IDX) + RUBY_WHISPER_PARAKEET_SEGMENT_NUM_ATTRS, + +#undef DEF_IDX +}; + #define VAL_FROM_TIME(v) (LONG2NUM((v) * 10)) #define VAL_FROM_STRING(v) (rb_str_new2(v)) #define READER(type) VAL_FROM_##type @@ -20,6 +29,9 @@ } extern VALUE cParakeetSegment; +extern VALUE sym_start_time; +extern VALUE sym_end_time; +extern VALUE sym_text; extern const rb_data_type_t ruby_whisper_parakeet_context_type; static void @@ -72,6 +84,46 @@ ruby_whisper_parakeet_segment_init(VALUE context, int index) ITERATE_ATTRS(DEF_ATTR) +static VALUE +ruby_whisper_parakeet_segment_deconstruct_keys(VALUE self, VALUE keys) +{ + ruby_whisper_parakeet_segment *rwps; + GetParakeetSegment(self, rwps); + ruby_whisper_parakeet_context *rwpc; + GetParakeetContext(rwps->context, rwpc); + + VALUE hash = rb_hash_new(); + long n_keys; + if (NIL_P(keys)) { + keys = rb_ary_new3( + RUBY_WHISPER_PARAKEET_SEGMENT_NUM_ATTRS, + sym_start_time, + sym_end_time, + sym_text + ); + n_keys = RUBY_WHISPER_PARAKEET_SEGMENT_NUM_ATTRS; + } else { + n_keys = RARRAY_LEN(keys); + if (n_keys > RUBY_WHISPER_PARAKEET_SEGMENT_NUM_ATTRS) { + return hash; + } + } + for (int i = 0; i < n_keys; i++) { + VALUE key = rb_ary_entry(keys, i); + +#define CHECK_AND_SET_KEY(rb_name, c_name, type) \ + if (key == sym_##rb_name) { \ + rb_hash_aset(hash, key, ruby_whisper_parakeet_get_##rb_name(self)); \ + } + + ITERATE_ATTRS(CHECK_AND_SET_KEY) + +#undef CHECK_AND_SET_KEY + } + + return hash; +} + void init_ruby_whisper_parakeet_segment(VALUE *mParakeet) { @@ -85,6 +137,8 @@ init_ruby_whisper_parakeet_segment(VALUE *mParakeet) ITERATE_ATTRS(REGISTER_ATTR) #undef REGISTER_ATTR + + rb_define_method(cParakeetSegment, "deconstruct_keys", ruby_whisper_parakeet_segment_deconstruct_keys, 1); } #undef DEF_ATTR diff --git a/bindings/ruby/ext/ruby_whisper_segment.c b/bindings/ruby/ext/ruby_whisper_segment.c index ee0d66c4c..cf0372797 100644 --- a/bindings/ruby/ext/ruby_whisper_segment.c +++ b/bindings/ruby/ext/ruby_whisper_segment.c @@ -4,12 +4,12 @@ extern ID id___method__; extern ID id_to_enum; -static VALUE sym_start_time; -static VALUE sym_end_time; -static VALUE sym_text; -static VALUE sym_no_speech_prob; -static VALUE sym_speaker_turn_next; -static VALUE sym_n_tokens; +VALUE sym_start_time; +VALUE sym_end_time; +VALUE sym_text; +VALUE sym_no_speech_prob; +VALUE sym_speaker_turn_next; +VALUE sym_n_tokens; extern const rb_data_type_t ruby_whisper_type;