Skip to content

Commit 4ad7669

Browse files
committed
Adding more ways to load model
Can now load from file name, or from a memory buffer (e.g. for mmap())
1 parent ec979ef commit 4ad7669

File tree

3 files changed

+45
-7
lines changed

3 files changed

+45
-7
lines changed

examples/rnnoise_demo.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ int main(int argc, char **argv) {
3737
FILE *f1, *fout;
3838
DenoiseState *st;
3939
#ifdef USE_WEIGHTS_FILE
40-
FILE *model_file = fopen("weights_blob.bin", "r");
41-
RNNModel *model = rnnoise_model_from_file(model_file);
40+
RNNModel *model = rnnoise_model_from_filename("weights_blob.bin");
4241
st = rnnoise_create(model);
4342
#else
4443
st = rnnoise_create(NULL);
@@ -64,7 +63,6 @@ int main(int argc, char **argv) {
6463
fclose(f1);
6564
fclose(fout);
6665
#ifdef USE_WEIGHTS_FILE
67-
fclose(model_file);
6866
rnnoise_model_free(model);
6967
#endif
7068
return 0;

include/rnnoise.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,30 @@ RNNOISE_EXPORT void rnnoise_destroy(DenoiseState *st);
9393
*/
9494
RNNOISE_EXPORT float rnnoise_process_frame(DenoiseState *st, float *out, const float *in);
9595

96+
/**
97+
* Load a model from a memory buffer
98+
*
99+
* It must be deallocated with rnnoise_model_free() and the buffer must remain
100+
* valid until after the returned object is destroyed.
101+
*/
102+
RNNOISE_EXPORT RNNModel *rnnoise_model_from_buffer(const void *ptr, int len);
103+
104+
96105
/**
97106
* Load a model from a file
98107
*
99-
* It must be deallocated with rnnoise_model_free()
108+
* It must be deallocated with rnnoise_model_free() and the file must not be
109+
* closed until the returned object is destroyed.
100110
*/
101111
RNNOISE_EXPORT RNNModel *rnnoise_model_from_file(FILE *f);
102112

113+
/**
114+
* Load a model from a file name
115+
*
116+
* It must be deallocated with rnnoise_model_free()
117+
*/
118+
RNNOISE_EXPORT RNNModel *rnnoise_model_from_filename(const char *filename);
119+
103120
/**
104121
* Free a custom model
105122
*

src/denoise.c

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,18 +224,40 @@ static void apply_window(float *x) {
224224
}
225225

226226
struct RNNModel {
227-
unsigned char *blob;
227+
/* Set either blob or const_blob. */
228+
const void *const_blob;
229+
void *blob;
228230
int blob_len;
231+
FILE *file;
229232
};
230233

234+
RNNModel *rnnoise_model_from_buffer(const void *ptr, int len) {
235+
RNNModel *model;
236+
model = malloc(sizeof(*model));
237+
model->blob = NULL;
238+
model->const_blob = ptr;
239+
model->blob_len = len;
240+
return model;
241+
}
242+
243+
RNNModel *rnnoise_model_from_filename(const char *filename) {
244+
RNNModel *model;
245+
FILE *f = fopen(filename, "rb");
246+
model = rnnoise_model_from_file(f);
247+
model->file = f;
248+
return model;
249+
}
250+
231251
RNNModel *rnnoise_model_from_file(FILE *f) {
232252
RNNModel *model;
233253
model = malloc(sizeof(*model));
254+
model->file = NULL;
234255

235256
fseek(f, 0, SEEK_END);
236257
model->blob_len = ftell(f);
237258
fseek(f, 0, SEEK_SET);
238259

260+
model->const_blob = NULL;
239261
model->blob = malloc(model->blob_len);
240262
if (fread(model->blob, model->blob_len, 1, f) != 1)
241263
{
@@ -246,7 +268,8 @@ RNNModel *rnnoise_model_from_file(FILE *f) {
246268
}
247269

248270
void rnnoise_model_free(RNNModel *model) {
249-
free(model->blob);
271+
if (model->file != NULL) fclose(model->file);
272+
if (model->blob != NULL) free(model->blob);
250273
free(model);
251274
}
252275

@@ -264,7 +287,7 @@ int rnnoise_init(DenoiseState *st, RNNModel *model) {
264287
if (model != NULL) {
265288
WeightArray *list;
266289
int ret = 1;
267-
parse_weights(&list, model->blob, model->blob_len);
290+
parse_weights(&list, model->blob ? model->blob : model->const_blob, model->blob_len);
268291
if (list != NULL) {
269292
ret = init_rnnoise(&st->model, list);
270293
opus_free(list);

0 commit comments

Comments
 (0)