WorldNet

WorldNetは、WORLDボコーダーを.NETで使えるようにしたライブラリです。原典のC++より高速に動きます。
原典との照合を済ませており、マネージドヒープも確保しません。

ブラウザーで試せます。導入は要らず、音声は外部へ送りません。


導入

dotnet add package WorldNet

使い方

次のプログラムは、モノラルのWAVファイルを読み込み、解析してから波形を合成します。F0の系列はHarvest、スペクトル包絡はCheapTrick、非周期性指標はD4Cで推定します。

using WorldNet;

int length = WaveFile.GetLength("input.wav");
double[] x = new double[length];
WaveFile.Read("input.wav", x, out int fs, out _);

using WorldArena arena = new();

HarvestOption harvestOption = HarvestOption.Default;
int f0Length = Harvest.GetSamplesForHarvest(fs, x.Length, harvestOption.FramePeriod);
double[] temporalPositions = new double[f0Length];
double[] f0 = new double[f0Length];
Harvest.Estimate(x, fs, harvestOption, temporalPositions, f0, arena);

CheapTrickOption cheapTrickOption = CheapTrickOption.Create(fs);
int fftSize = cheapTrickOption.FftSize;
int spectrumLength = (fftSize / 2) + 1;
double[] spectrogram = new double[f0Length * spectrumLength];
CheapTrick.Estimate(x, fs, cheapTrickOption, temporalPositions, f0, spectrogram, arena);

double[] aperiodicity = new double[f0Length * spectrumLength];
D4C.Estimate(x, fs, D4COption.Default, temporalPositions, f0, fftSize, aperiodicity, arena);

int yLength = Synthesis.GetSamplesForSynthesis(fs, f0Length, harvestOption.FramePeriod);
double[] y = new double[yLength];
Synthesis.Synthesize(f0, spectrogram, aperiodicity, fftSize, harvestOption.FramePeriod, fs, y, arena);

WaveFile.Write("output.wav", y, fs);

できること

特長

リンク