shithub: opus

Download patch

ref: 91c9524af3b8235bf6798e0c10975983ba97e440
parent: 4cf177412bc0a44dae785d7b39e99cfe431e837f
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Sun Nov 25 21:49:25 EST 2018

Getting there

--- a/dnn/lpcnet.c
+++ b/dnn/lpcnet.c
@@ -35,6 +35,8 @@
 
 #define FRAME_INPUT_SIZE (NB_FEATURES + EMBED_PITCH_OUT_SIZE)
 
+#define SAMPLE_INPUT_SIZE (2*EMBED_SIG_OUT_SIZE + EMBED_EXC_OUT_SIZE + FEATURE_DENSE2_OUT_SIZE)
+
 static int ulaw2lin(int u)
 {
     float s;
@@ -77,9 +79,22 @@
     RNN_CLEAR(lpc, LPC_ORDER);
 }
 
-int run_sample_network(NNetState *net, const float *condition, const float *lpc, int last_exc, int last_sig, int pred)
+int run_sample_network(NNetState *net, const float *condition, int last_exc, int last_sig, int pred)
 {
-    
+    float in_a[SAMPLE_INPUT_SIZE];
+    float in_b[GRU_A_STATE_SIZE+FEATURE_DENSE2_OUT_SIZE];
+    float pdf[DUAL_FC_OUT_SIZE];
+    compute_embedding(&embed_sig, &in_a[0], last_sig);
+    compute_embedding(&embed_sig, &in_a[EMBED_SIG_OUT_SIZE], pred);
+    compute_embedding(&embed_exc, &in_a[2*EMBED_SIG_OUT_SIZE], last_exc);
+    RNN_COPY(&in_a[2*EMBED_SIG_OUT_SIZE + EMBED_EXC_OUT_SIZE], condition, FEATURE_DENSE2_OUT_SIZE);
+    compute_gru(&gru_a, net->gru_a_state, in_a);
+    RNN_COPY(in_b, net->gru_a_state, GRU_A_STATE_SIZE);
+    RNN_COPY(&in_b[GRU_A_STATE_SIZE], condition, FEATURE_DENSE2_OUT_SIZE);
+    compute_gru(&gru_b, net->gru_b_state, in_b);
+    compute_mdense(&dual_fc, pdf, net->gru_b_state);
+    /* FIXME: Do the actual sampling here. */
+    return 0;
 }
 
 void generate_samples(LPCNetState *lpcnet, short *output, const float *features, int pitch, int N)
@@ -100,7 +115,7 @@
         pred = (int)floor(.5f + sum);
         last_sig_ulaw = lin2ulaw(lpcnet->last_sig[0]);
         pred_ulaw = lin2ulaw(pred);
-        exc = run_sample_network(&lpcnet->nnet, condition, lpc, lpcnet->last_exc, last_sig_ulaw, pred_ulaw);
+        exc = run_sample_network(&lpcnet->nnet, condition, lpcnet->last_exc, last_sig_ulaw, pred_ulaw);
         output[i] = pred + ulaw2lin(exc);
         RNN_MOVE(&lpcnet->last_sig[1], &lpcnet->last_sig[0], LPC_ORDER-1);
         lpcnet->last_sig[0] = output[i];
--