shithub: opus

Download patch

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

More plumbing

--- a/dnn/dump_lpcnet.py
+++ b/dnn/dump_lpcnet.py
@@ -190,7 +190,7 @@
 hf.write('typedef struct {\n')
 for i, name in enumerate(layer_list):
     hf.write('  float {}_state[{}_STATE_SIZE];\n'.format(name, name.upper())) 
-hf.write('} LPCNetState;\n')
+hf.write('} NNetState;\n')
 
 hf.write('\n\n#endif\n')
 
--- a/dnn/lpcnet.c
+++ b/dnn/lpcnet.c
@@ -24,17 +24,42 @@
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+#include <math.h>
 #include "nnet_data.h"
 #include "nnet.h"
 #include "common.h"
 #include "arch.h"
+#include "lpcnet.h"
 
 #define NB_FEATURES 38
 
 #define FRAME_INPUT_SIZE (NB_FEATURES + EMBED_PITCH_OUT_SIZE)
 
-void run_frame_network(LPCNetState *net, float *out, const float *features, int pitch)
+static int ulaw2lin(int u)
 {
+    float s;
+    float scale_1 = 32768.f/255.f;
+    u = u - 128;
+    s = u >= 0 ? 1 : -1;
+    u = abs(u);
+    return s*scale_1*(exp(u/128.*log(256))-1);
+}
+
+static int lin2ulaw(int x)
+{
+    float u;
+    float scale = 255.f/32768.f;
+    int s = x >= 0 ? 1 : -1;
+    x = abs(x);
+    u = (s*(128*log(1+scale*x)/log(256)));
+    u = 128 + u;
+    if (u < 0) u = 0;
+    if (u > 255) u = 255;
+    return (int)floor(.5 + u);
+}
+
+void run_frame_network(NNetState *net, float *condition, float *lpc, const float *features, int pitch)
+{
     int i;
     float in[FRAME_INPUT_SIZE];
     float conv1_out[FEATURE_CONV1_OUT_SIZE];
@@ -47,6 +72,38 @@
     celt_assert(FRAME_INPUT_SIZE == FEATURE_CONV2_OUT_SIZE);
     for (i=0;i<FEATURE_CONV2_OUT_SIZE;i++) conv2_out[i] += in[i];
     compute_dense(&feature_dense1, dense1_out, conv2_out);
-    compute_dense(&feature_dense2, out, dense1_out);
+    compute_dense(&feature_dense2, condition, dense1_out);
+    /* FIXME: Actually compute the LPC on the middle frame. */
+    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)
+{
+    
+}
+
+void generate_samples(LPCNetState *lpcnet, short *output, const float *features, int pitch, int N)
+{
+    int i;
+    float condition[FEATURE_DENSE2_OUT_SIZE];
+    float lpc[LPC_ORDER];
+    run_frame_network(&lpcnet->nnet, condition, lpc, features, pitch);
+    for (i=0;i<N;i++)
+    {
+        int j;
+        int pred;
+        int exc;
+        int last_sig_ulaw;
+        int pred_ulaw;
+        float sum = 0;
+        for (j=0;j<LPC_ORDER;j++) sum += lpcnet->last_sig[j]*lpc[j];
+        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);
+        output[i] = pred + ulaw2lin(exc);
+        RNN_MOVE(&lpcnet->last_sig[1], &lpcnet->last_sig[0], LPC_ORDER-1);
+        lpcnet->last_sig[0] = output[i];
+        lpcnet->last_exc = exc;
+    }
+}
--- /dev/null
+++ b/dnn/lpcnet.h
@@ -1,0 +1,44 @@
+/* Copyright (c) 2018 Mozilla */
+/*
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef _LPCNET_H_
+#define _LPCNET_H_
+
+
+#include "nnet_data.h"
+
+#define LPC_ORDER 16
+
+typedef struct {
+    NNetState nnet;
+    int last_exc;
+    short last_sig[LPC_ORDER];
+} LPCNetState;
+
+
+
+
+#endif
--