inference method

AiliaVoiceResult inference(
  1. String inputFeature
)

Implementation

AiliaVoiceResult inference(String inputFeature) {
  AiliaVoiceResult result = AiliaVoiceResult(
    sampleRate: 0,
    nChannels: 0,
    pcm: List<double>.empty(),
  );

  if (!available) {
    print("Model not opened");
    return result;
  }

  if (debug){
    print("ailiaVoiceInference");
  }

  int status = ailiaVoice.ailiaVoiceInference(ppAilia!.value, inputFeature.toNativeUtf8().cast<ffi.Char>());
  throwError("ailiaVoiceInference", status);

  if (debug){
    print("ailiaVoiceGetWaveInfo");
  }

  final ffi.Pointer<ffi.UnsignedInt> samples = malloc<ffi.UnsignedInt>();
  final ffi.Pointer<ffi.UnsignedInt> channels = malloc<ffi.UnsignedInt>();
  final ffi.Pointer<ffi.UnsignedInt> samplingRate = malloc<ffi.UnsignedInt>();

  status = ailiaVoice.ailiaVoiceGetWaveInfo(
    ppAilia!.value,
    samples,
    channels,
    samplingRate,
  );
  throwError("ailiaVoiceGetWaveInfo", status);

  if (debug){
    print("ailiaVoiceGetWaves");
  }

  final ffi.Pointer<ffi.Float> buf =
      malloc<ffi.Float>(samples.value * channels.value);

  int sizeofFloat = 4;
  status = ailiaVoice.ailiaVoiceGetWave(
    ppAilia!.value,
    buf,
    samples.value * channels.value * sizeofFloat,
  );
  throwError("ailiaVoiceGetWaves", status);

  List<double> pcm = List<double>.empty(growable: true);
  for (int i = 0; i < samples.value * channels.value; i++) {
    pcm.add(buf[i]);
  }

  AiliaVoiceResult resultPcm = AiliaVoiceResult(
    sampleRate: samplingRate.value,
    nChannels: channels.value,
    pcm: pcm,
  );

  if (debug){
    print(
        "ailiaVoice output ${samples.value} ${samplingRate.value} ${channels.value}");
  }

  malloc.free(buf);
  malloc.free(samples);
  malloc.free(channels);
  malloc.free(samplingRate);

  return resultPcm;
}