導入
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);
できること
- 基本周波数の推定: Dio、Harvest、StoneMask。
- スペクトル包絡の推定: CheapTrick。
- 非周期性指標の推定: D4C。
- 波形の合成: 一括合成と、実時間合成。
- スペクトル包絡と非周期性指標の符号化。
- WAVの入出力と、解析パラメーターのファイル形式。
特長
- 計測したどの処理も、原典のC++より高速です。表は、説明書の性能の節にあります。
- マネージドヒープを確保しません。ガベージコレクションが、解析と合成の経路を目にすることはありません。
- MSVCとGCCでビルドした原典と照合しています。出力は、ほとんどの処理でビット単位で一致し、残りでも最小単位の数個以内の差です。
- .NET 8以降で、WindowsとLinuxのx64とARM64に対応します。Native AOTにも対応し、同梱するネイティブライブラリはありません。
リンク
- 説明書: 動作要件、APIリファレンス、制限事項。
- NuGetのパッケージ
- リリース
- WORLD: M. Morise氏による原典です。