mirror of
https://github.com/xiph/opus.git
synced 2025-05-23 19:59:12 +00:00
Add FWGAN to lpcnet_demo
This commit is contained in:
parent
e62fd5c5c9
commit
bf5eb5bf8d
3 changed files with 29 additions and 0 deletions
|
@ -109,6 +109,8 @@ void fwgan_cont(FWGANState *st, const float *pcm0, const float *features0)
|
||||||
compute_generic_dense(&model->fwc7_cont_fc_0, st->fwc7_state, cont_inputs, ACTIVATION_TANH);
|
compute_generic_dense(&model->fwc7_cont_fc_0, st->fwc7_state, cont_inputs, ACTIVATION_TANH);
|
||||||
|
|
||||||
/* FIXME: Do we need to handle initial features? How? */
|
/* FIXME: Do we need to handle initial features? How? */
|
||||||
|
|
||||||
|
st->cont_initialized = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void apply_gain(float *pcm, float c0, float *last_gain) {
|
static void apply_gain(float *pcm, float c0, float *last_gain) {
|
||||||
|
@ -213,6 +215,7 @@ void fwgan_synthesize(FWGANState *st, float *pcm, const float *features)
|
||||||
float lpc_weight;
|
float lpc_weight;
|
||||||
float fwgan_features[NB_FEATURES-1];
|
float fwgan_features[NB_FEATURES-1];
|
||||||
int i;
|
int i;
|
||||||
|
celt_assert(st->cont_initialized);
|
||||||
OPUS_COPY(fwgan_features, features, NB_FEATURES-2);
|
OPUS_COPY(fwgan_features, features, NB_FEATURES-2);
|
||||||
fwgan_features[NB_FEATURES-2] = features[NB_FEATURES-1]+.5;
|
fwgan_features[NB_FEATURES-2] = features[NB_FEATURES-1]+.5;
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
typedef struct {
|
typedef struct {
|
||||||
FWGAN model;
|
FWGAN model;
|
||||||
int arch;
|
int arch;
|
||||||
|
int cont_initialized;
|
||||||
double embed_phase;
|
double embed_phase;
|
||||||
float last_gain;
|
float last_gain;
|
||||||
float last_lpc[LPC_ORDER];
|
float last_lpc[LPC_ORDER];
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "lpcnet.h"
|
#include "lpcnet.h"
|
||||||
#include "freq.h"
|
#include "freq.h"
|
||||||
#include "os_support.h"
|
#include "os_support.h"
|
||||||
|
#include "fwgan.h"
|
||||||
|
|
||||||
#ifdef USE_WEIGHTS_FILE
|
#ifdef USE_WEIGHTS_FILE
|
||||||
# if __unix__
|
# if __unix__
|
||||||
|
@ -84,6 +85,7 @@ void free_blob(unsigned char *blob, int len) {
|
||||||
#define MODE_SYNTHESIS 3
|
#define MODE_SYNTHESIS 3
|
||||||
#define MODE_PLC 4
|
#define MODE_PLC 4
|
||||||
#define MODE_ADDLPC 5
|
#define MODE_ADDLPC 5
|
||||||
|
#define MODE_FWGAN_SYNTHESIS 6
|
||||||
|
|
||||||
void usage(void) {
|
void usage(void) {
|
||||||
fprintf(stderr, "usage: lpcnet_demo -features <input.pcm> <features.f32>\n");
|
fprintf(stderr, "usage: lpcnet_demo -features <input.pcm> <features.f32>\n");
|
||||||
|
@ -112,6 +114,7 @@ int main(int argc, char **argv) {
|
||||||
if (argc < 4) usage();
|
if (argc < 4) usage();
|
||||||
if (strcmp(argv[1], "-features") == 0) mode=MODE_FEATURES;
|
if (strcmp(argv[1], "-features") == 0) mode=MODE_FEATURES;
|
||||||
else if (strcmp(argv[1], "-synthesis") == 0) mode=MODE_SYNTHESIS;
|
else if (strcmp(argv[1], "-synthesis") == 0) mode=MODE_SYNTHESIS;
|
||||||
|
else if (strcmp(argv[1], "-fwgan-synthesis") == 0) mode=MODE_FWGAN_SYNTHESIS;
|
||||||
else if (strcmp(argv[1], "-plc") == 0) {
|
else if (strcmp(argv[1], "-plc") == 0) {
|
||||||
mode=MODE_PLC;
|
mode=MODE_PLC;
|
||||||
plc_options = argv[2];
|
plc_options = argv[2];
|
||||||
|
@ -184,6 +187,28 @@ int main(int argc, char **argv) {
|
||||||
fwrite(pcm, sizeof(pcm[0]), LPCNET_FRAME_SIZE, fout);
|
fwrite(pcm, sizeof(pcm[0]), LPCNET_FRAME_SIZE, fout);
|
||||||
}
|
}
|
||||||
lpcnet_destroy(net);
|
lpcnet_destroy(net);
|
||||||
|
} else if (mode == MODE_FWGAN_SYNTHESIS) {
|
||||||
|
FWGANState fwgan;
|
||||||
|
float zeros[320] = {0};
|
||||||
|
fwgan_init(&fwgan);
|
||||||
|
fwgan_cont(&fwgan, zeros, NULL);
|
||||||
|
#ifdef USE_WEIGHTS_FILE
|
||||||
|
fwgan_load_model(fwgan, data, len);
|
||||||
|
#endif
|
||||||
|
while (1) {
|
||||||
|
int i;
|
||||||
|
float in_features[NB_TOTAL_FEATURES];
|
||||||
|
float features[NB_FEATURES];
|
||||||
|
float fpcm[LPCNET_FRAME_SIZE];
|
||||||
|
opus_int16 pcm[LPCNET_FRAME_SIZE];
|
||||||
|
size_t ret;
|
||||||
|
ret = fread(in_features, sizeof(features[0]), NB_TOTAL_FEATURES, fin);
|
||||||
|
if (feof(fin) || ret != NB_TOTAL_FEATURES) break;
|
||||||
|
OPUS_COPY(features, in_features, NB_FEATURES);
|
||||||
|
fwgan_synthesize(&fwgan, fpcm, features);
|
||||||
|
for (i=0;i<LPCNET_FRAME_SIZE;i++) pcm[i] = (int)floor(.5 + MIN32(32767, MAX32(-32767, 32768.f*fpcm[i])));
|
||||||
|
fwrite(pcm, sizeof(pcm[0]), LPCNET_FRAME_SIZE, fout);
|
||||||
|
}
|
||||||
} else if (mode == MODE_PLC) {
|
} else if (mode == MODE_PLC) {
|
||||||
opus_int16 pcm[FRAME_SIZE];
|
opus_int16 pcm[FRAME_SIZE];
|
||||||
int count=0;
|
int count=0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue