diff --git a/bindings/ruby/ext/ruby_whisper.h b/bindings/ruby/ext/ruby_whisper.h index c62a32ed3..aacdbf204 100644 --- a/bindings/ruby/ext/ruby_whisper.h +++ b/bindings/ruby/ext/ruby_whisper.h @@ -157,4 +157,11 @@ typedef struct { } \ } while (0) +#define GetParakeetSegment(obj, rwps) do { \ + TypedData_Get_Struct((obj), ruby_whisper_parakeet_segment, &ruby_whisper_parakeet_segment_type, (rwps)); \ + if (!(rwps)->context) { \ + rb_raise(rb_eRuntimeError, "Not initialized"); \ + } \ +} while (0) + #endif diff --git a/bindings/ruby/ext/ruby_whisper_parakeet_segment.c b/bindings/ruby/ext/ruby_whisper_parakeet_segment.c index 35ce9c15d..76a2fcd18 100644 --- a/bindings/ruby/ext/ruby_whisper_parakeet_segment.c +++ b/bindings/ruby/ext/ruby_whisper_parakeet_segment.c @@ -1,6 +1,26 @@ #include "ruby_whisper.h" +#define ITERATE_ATTRS(ITERATOR) \ + ITERATOR(start_time, t0, TIME) \ + ITERATOR(end_time, t1, TIME) \ + ITERATOR(text, text, STRING) + +#define VAL_FROM_TIME(v) (LONG2NUM((v) * 10)) +#define VAL_FROM_STRING(v) (rb_str_new2(v)) +#define READER(type) VAL_FROM_##type +#define DEF_ATTR(rb_name, c_name, type) \ + static VALUE \ + ruby_whisper_parakeet_get_##rb_name(VALUE self) \ + { \ + ruby_whisper_parakeet_segment *rwps; \ + GetParakeetSegment(self, rwps); \ + ruby_whisper_parakeet_context *rwpc; \ + GetParakeetContext(rwps->context, rwpc); \ + return READER(type)(parakeet_full_get_segment_##c_name(rwpc->context, rwps->index)); \ + } + extern VALUE cParakeetSegment; +extern const rb_data_type_t ruby_whisper_parakeet_context_type; static void rb_whisper_parakeet_segment_mark(void *p) @@ -50,10 +70,25 @@ ruby_whisper_parakeet_segment_init(VALUE context, int index) return segment; } +ITERATE_ATTRS(DEF_ATTR) + void init_ruby_whisper_parakeet_segment(VALUE *mParakeet) { cParakeetSegment = rb_define_class_under(*mParakeet, "Segment", rb_cObject); rb_define_alloc_func(cParakeetSegment, ruby_whisper_parakeet_segment_s_allocate); + +#define REGISTER_ATTR(rb_name, c_name, type) \ + rb_define_method(cParakeetSegment, #rb_name, ruby_whisper_parakeet_get_##rb_name, 0); + + ITERATE_ATTRS(REGISTER_ATTR) + +#undef REGISTER_ATTR } + +#undef DEF_ATTR +#undef READER +#undef VAL_FROM_STRING +#undef VAL_FROM_TIME +#undef ITERATE_ATTRS diff --git a/bindings/ruby/test/test_parakeet_segment.rb b/bindings/ruby/test/test_parakeet_segment.rb index 150543326..019fca36f 100644 --- a/bindings/ruby/test/test_parakeet_segment.rb +++ b/bindings/ruby/test/test_parakeet_segment.rb @@ -7,8 +7,14 @@ class TestParakeetSegment < TestBase end def test_segment + whole_text = "" @parakeet.each_segment do |segment| assert_instance_of Parakeet::Segment, segment + assert_kind_of Integer, segment.start_time + assert segment.end_time >= segment.start_time + assert_kind_of String, segment.text + whole_text << segment.text end + assert_match(/ask not what your country can do for you, ask what you can do for your country/, whole_text) end end