diff --git a/dnn/fwgan.c b/dnn/fwgan.c
index b349fe20843338f64fde0d2f2011aa34d25c144e..562ffe93aa4247b84c5d0a0c6b3720cf76d42724 100644
--- a/dnn/fwgan.c
+++ b/dnn/fwgan.c
@@ -35,6 +35,7 @@
 #include "lpcnet.h"
 #include "pitch.h"
 #include "nnet.h"
+#include "lpcnet_private.h"
 
 #define FEAT_IN_SIZE (BFCC_WITH_CORR_UPSAMPLER_FC_OUT_SIZE/4 + FWGAN_FRAME_SIZE/2)
 
@@ -269,6 +270,16 @@ void fwgan_init(FWGANState *st)
   /* FIXME: perform arch detection. */
 }
 
+int fwgan_load_model(FWGANState *st, const unsigned char *data, int len) {
+  WeightArray *list;
+  int ret;
+  parse_weights(&list, data, len);
+  ret = init_fwgan(&st->model, list);
+  free(list);
+  if (ret == 0) return 0;
+  else return -1;
+}
+
 static void fwgan_synthesize_impl(FWGANState *st, float *pcm, const float *lpc, const float *features)
 {
   int subframe;
diff --git a/dnn/fwgan.h b/dnn/fwgan.h
index b7fe28c0d48870adcd65e38778dd3eb5163ec813..acb7014d7c165d73ac30c2e52fe8f34725a4f7d6 100644
--- a/dnn/fwgan.h
+++ b/dnn/fwgan.h
@@ -72,6 +72,7 @@ typedef struct {
 } FWGANState;
 
 void fwgan_init(FWGANState *st);
+int fwgan_load_model(FWGANState *st, const unsigned char *data, int len);
 
 void fwgan_cont(FWGANState *st, const float *pcm0, const float *features0);