5050#endif
5151
5252
53- /* The built-in model, used if no file is given as input */
54- extern const struct RNNModel rnnoise_model_orig ;
55-
5653/* ERB bandwidths going in reverse from 20 kHz and then replacing the 700 and 800
5754 with just 750 because having 32 bands is convenient for the DNN.
5855 B(1)=400;
@@ -226,6 +223,33 @@ static void apply_window(float *x) {
226223 }
227224}
228225
226+ struct RNNModel {
227+ unsigned char * blob ;
228+ int blob_len ;
229+ };
230+
231+ RNNModel * rnnoise_model_from_file (FILE * f ) {
232+ RNNModel * model ;
233+ model = malloc (sizeof (* model ));
234+
235+ fseek (f , 0 , SEEK_END );
236+ model -> blob_len = ftell (f );
237+ fseek (f , 0 , SEEK_SET );
238+
239+ model -> blob = malloc (model -> blob_len );
240+ if (fread (model -> blob , model -> blob_len , 1 , f ) != 1 )
241+ {
242+ rnnoise_model_free (model );
243+ return NULL ;
244+ }
245+ return model ;
246+ }
247+
248+ void rnnoise_model_free (RNNModel * model ) {
249+ free (model -> blob );
250+ free (model );
251+ }
252+
229253int rnnoise_get_size () {
230254 return sizeof (DenoiseState );
231255}
@@ -234,21 +258,41 @@ int rnnoise_get_frame_size() {
234258 return FRAME_SIZE ;
235259}
236260
237- extern const WeightArray rnnoise_arrays [];
238261int rnnoise_init (DenoiseState * st , RNNModel * model ) {
239262 memset (st , 0 , sizeof (* st ));
240- init_rnnoise (& st -> model , rnnoise_arrays );
241263#if !TRAINING
242- st -> arch = rnn_select_arch ();
264+ if (model != NULL ) {
265+ WeightArray * list ;
266+ int ret = 1 ;
267+ parse_weights (& list , model -> blob , model -> blob_len );
268+ if (list != NULL ) {
269+ ret = init_rnnoise (& st -> model , list );
270+ opus_free (list );
271+ }
272+ if (ret != 0 ) return -1 ;
273+ }
274+ #ifndef USE_WEIGHTS_FILE
275+ else {
276+ int ret = init_rnnoise (& st -> model , rnnoise_arrays );
277+ if (ret != 0 ) return -1 ;
278+ }
243279#endif
280+ st -> arch = rnn_select_arch ();
281+ #else
244282 (void )model ;
283+ #endif
245284 return 0 ;
246285}
247286
248287DenoiseState * rnnoise_create (RNNModel * model ) {
288+ int ret ;
249289 DenoiseState * st ;
250290 st = malloc (rnnoise_get_size ());
251- rnnoise_init (st , model );
291+ ret = rnnoise_init (st , model );
292+ if (ret != 0 ) {
293+ free (st );
294+ return NULL ;
295+ }
252296 return st ;
253297}
254298
0 commit comments