You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.5 KiB
93 lines
2.5 KiB
#include <ruby.h>
|
|
#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);
|
|
}
|