mirror of
https://github.com/ggerganov/whisper.cpp
synced 2026-03-07 23:49:29 +01:00
* ruby : Bump version to 1.3.6 * Fix code in example * Add sample code to transcribe from MemoryView * Define GetVADContext macro * Use GetVADContext * Extract parse_full_args function * Use parse_full_args in ruby_whisper_full_parallel * Free samples after use * Check return value of parse_full_args() * Define GetVADParams macro * Add VAD::Context#segments_from_samples * Add tests for VAD::Context#segments_from_samples * Add signature for VAD::Context#segments_from_samples * Add sample code for VAD::Context#segments_from_samples * Add test for Whisper::Context#transcribe with Pathname * Make Whisper::Context#transcribe and Whisper::VAD::Context#detect accept Pathname * Update signature of Whisper::Context#transcribe * Fix variable name * Don't free memory view * Make parse_full_args return struct * Fallback when failed to get MemoryView * Add num of samples when too long * Check members of MemoryView * Fix a typo * Remove unnecessary include * Fix a typo * Fix a typo * Care the case of MemoryView doesn't fit spec * Add TODO comment * Add optimazation option to compiler flags * Use ALLOC_N instead of malloc * Add description to sample code * Rename and change args: parse_full_args -> parse_samples * Free samples when exception raised * Assign type check result to a variable * Define wrapper function of whisper_full * Change signature of parse_samples for rb_ensure * Ensure release MemoryView * Extract fill_samples function * Free samples memory when filling it failed * Free samples memory when transcription failed * Prepare transcription in wrapper funciton * Change function name * Simplify function boundary
139 lines
3.8 KiB
C
139 lines
3.8 KiB
C
#include "ruby_whisper.h"
|
|
|
|
#define N_KEY_NAMES 2
|
|
|
|
extern VALUE cVADSegment;
|
|
|
|
extern const rb_data_type_t ruby_whisper_vad_segments_type;
|
|
|
|
static VALUE sym_start_time;
|
|
static VALUE sym_end_time;
|
|
|
|
static void
|
|
rb_whisper_vad_segment_mark(void *p)
|
|
{
|
|
ruby_whisper_vad_segment *rwvs = (ruby_whisper_vad_segment *)p;
|
|
rb_gc_mark(rwvs->segments);
|
|
}
|
|
|
|
static size_t
|
|
ruby_whisper_vad_segment_memsize(const void *p)
|
|
{
|
|
const ruby_whisper_vad_segment *rwvs = p;
|
|
size_t size = sizeof(rwvs);
|
|
if (!rwvs) {
|
|
return 0;
|
|
}
|
|
if (rwvs->index) {
|
|
size += sizeof(rwvs->index);
|
|
}
|
|
return size;
|
|
}
|
|
|
|
static const rb_data_type_t ruby_whisper_vad_segment_type = {
|
|
"ruby_whisper_vad_segment",
|
|
{rb_whisper_vad_segment_mark, RUBY_DEFAULT_FREE, ruby_whisper_vad_segment_memsize,},
|
|
0, 0,
|
|
0
|
|
};
|
|
|
|
static VALUE
|
|
ruby_whisper_vad_segment_s_allocate(VALUE klass)
|
|
{
|
|
ruby_whisper_vad_segment *rwvs;
|
|
VALUE obj = TypedData_Make_Struct(klass, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs);
|
|
rwvs->segments = Qnil;
|
|
rwvs->index = -1;
|
|
return obj;
|
|
}
|
|
|
|
VALUE
|
|
rb_whisper_vad_segment_s_new(VALUE segments, int index)
|
|
{
|
|
ruby_whisper_vad_segment *rwvs;
|
|
const VALUE segment = ruby_whisper_vad_segment_s_allocate(cVADSegment);
|
|
TypedData_Get_Struct(segment, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs);
|
|
rwvs->segments = segments;
|
|
rwvs->index = index;
|
|
return segment;
|
|
}
|
|
|
|
static VALUE
|
|
ruby_whisper_vad_segment_get_start_time(VALUE self)
|
|
{
|
|
ruby_whisper_vad_segment *rwvs;
|
|
ruby_whisper_vad_segments *rwvss;
|
|
float t0;
|
|
|
|
TypedData_Get_Struct(self, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs);
|
|
TypedData_Get_Struct(rwvs->segments, ruby_whisper_vad_segments, &ruby_whisper_vad_segments_type, rwvss);
|
|
t0 = whisper_vad_segments_get_segment_t0(rwvss->segments, rwvs->index);
|
|
return DBL2NUM(t0 * 10);
|
|
}
|
|
|
|
static VALUE
|
|
ruby_whisper_vad_segment_get_end_time(VALUE self)
|
|
{
|
|
ruby_whisper_vad_segment *rwvs;
|
|
ruby_whisper_vad_segments *rwvss;
|
|
float t1;
|
|
|
|
TypedData_Get_Struct(self, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs);
|
|
TypedData_Get_Struct(rwvs->segments, ruby_whisper_vad_segments, &ruby_whisper_vad_segments_type, rwvss);
|
|
t1 = whisper_vad_segments_get_segment_t1(rwvss->segments, rwvs->index);
|
|
return DBL2NUM(t1 * 10);
|
|
}
|
|
|
|
static VALUE
|
|
ruby_whisper_vad_segment_deconstruct_keys(VALUE self, VALUE keys)
|
|
{
|
|
ruby_whisper_vad_segment *rwvs;
|
|
ruby_whisper_vad_segments *rwvss;
|
|
VALUE hash, key;
|
|
long n_keys;
|
|
int i;
|
|
|
|
TypedData_Get_Struct(self, ruby_whisper_vad_segment, &ruby_whisper_vad_segment_type, rwvs);
|
|
TypedData_Get_Struct(rwvs->segments, ruby_whisper_vad_segments, &ruby_whisper_vad_segments_type, rwvss);
|
|
|
|
hash = rb_hash_new();
|
|
if (NIL_P(keys)) {
|
|
keys = rb_ary_new3(
|
|
N_KEY_NAMES,
|
|
sym_start_time,
|
|
sym_end_time
|
|
);
|
|
n_keys = N_KEY_NAMES;
|
|
} else {
|
|
n_keys = RARRAY_LEN(keys);
|
|
if (n_keys > N_KEY_NAMES) {
|
|
return hash;
|
|
}
|
|
}
|
|
for (i = 0; i < n_keys; i++) {
|
|
key = rb_ary_entry(keys, i);
|
|
if (key == sym_start_time) {
|
|
rb_hash_aset(hash, key, ruby_whisper_vad_segment_get_start_time(self));
|
|
}
|
|
if (key == sym_end_time) {
|
|
rb_hash_aset(hash, key, ruby_whisper_vad_segment_get_end_time(self));
|
|
}
|
|
}
|
|
|
|
return hash;
|
|
}
|
|
|
|
void
|
|
init_ruby_whisper_vad_segment(VALUE *mVAD)
|
|
{
|
|
cVADSegment = rb_define_class_under(*mVAD, "Segment", rb_cObject);
|
|
|
|
sym_start_time = ID2SYM(rb_intern("start_time"));
|
|
sym_end_time = ID2SYM(rb_intern("end_time"));
|
|
|
|
rb_define_alloc_func(cVADSegment, ruby_whisper_vad_segment_s_allocate);
|
|
rb_define_method(cVADSegment, "start_time", ruby_whisper_vad_segment_get_start_time, 0);
|
|
rb_define_method(cVADSegment, "end_time", ruby_whisper_vad_segment_get_end_time, 0);
|
|
rb_define_method(cVADSegment, "deconstruct_keys", ruby_whisper_vad_segment_deconstruct_keys, 1);
|
|
}
|