#include #include "ruby_whisper.h" VALUE mWhisper; VALUE cContext; VALUE cParams; static void ruby_whisper_free(ruby_whisper *rw) { if (rw->context) { whisper_free(rw->context); rw->context = NULL; } } static void ruby_whisper_params_free(ruby_whisper_params *rwp) { if (rwp->params) { free(rwp->params); rwp->params = NULL; } } void rb_whisper_mark(ruby_whisper *rw) { // call rb_gc_mark on any ruby references in rw } void rb_whisper_free(ruby_whisper *rw) { ruby_whisper_free(rw); free(rw); } void rb_whisper_params_mark(ruby_whisper_params *rwp) { } void rb_whisper_params_free(ruby_whisper_params *rwp) { ruby_whisper_params_free(rwp); free(rwp); } static VALUE ruby_whisper_allocate(VALUE klass) { ruby_whisper *rw; rw = ALLOC(ruby_whisper); rw->context = NULL; return Data_Wrap_Struct(klass, rb_whisper_mark, rb_whisper_free, rw); } static VALUE ruby_whisper_params_allocate(VALUE klass) { ruby_whisper_params *rwp; rwp = ALLOC(ruby_whisper_params); rwp->params = ALLOC(struct whisper_full_params); return Data_Wrap_Struct(klass, rb_whisper_params_mark, rb_whisper_params_free, rwp); } static VALUE ruby_whisper_initialize(int argc, VALUE *argv, VALUE self) { ruby_whisper *rw; VALUE whisper_model_file_path; // TODO: we can support init from buffer here too maybe another ruby object to expose rb_scan_args(argc, argv, "01", &whisper_model_file_path); Data_Get_Struct(self, ruby_whisper, rw); if (!rb_respond_to(whisper_model_file_path, rb_intern("to_s"))) { rb_raise(rb_eRuntimeError, "Expected file path to model to initialize Whisper::Context"); } rw->context = whisper_init_from_file(StringValueCStr(whisper_model_file_path)); return self; } /* * params.auto_detection = true|false */ static VALUE ruby_whisper_params_set_auto_detection(VALUE self, VALUE value) { ruby_whisper_params *rwp; Data_Get_Struct(self, ruby_whisper_params, rwp); if (value == Qfalse || value == Qnil) { rwp->params->language = "auto"; } else { rwp->params->language = NULL; } return value; } void Init_whisper() { mWhisper = rb_define_module("Whisper"); cContext = rb_define_class_under(mWhisper, "Context", rb_cObject); cParams = rb_define_class_under(mWhisper, "Params", rb_cObject); rb_define_alloc_func(cContext, ruby_whisper_allocate); rb_define_method(cContext, "initialize", ruby_whisper_initialize, -1); rb_define_alloc_func(cParams, ruby_whisper_params_allocate); rb_define_method(cParams, "auto_detection=", ruby_whisper_params_set_auto_detection, 1); }