Decompiled source of SherpaOnnxRuntime v1.0.0

sherpa-onnx.dll

Decompiled 3 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("Xiaomi Corporation")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright 2019-2023 Xiaomi Corporation")]
[assembly: AssemblyDescription("sherpa-onnx is an open-source real-time speech recognition toolkit developed\n    by the Next-gen Kaldi team. It supports streaming recognition on a variety of\n    platforms such as Android, iOS, Raspberry, Linux, Windows, macOS, etc.\n\n    It does not require Internet connection during recognition.\n\n    See the documentation https://k2-fsa.github.io/sherpa/onnx/index.html\n    for details.\n    ")]
[assembly: AssemblyFileVersion("1.12.23.0")]
[assembly: AssemblyInformationalVersion("1.12.23+7e227a529be6c383134a358c5744d0eb1cb5ae1f")]
[assembly: AssemblyProduct("sherpa-onnx")]
[assembly: AssemblyTitle("sherpa-onnx")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/k2-fsa/sherpa-onnx")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.12.23.0")]
[module: UnverifiableCode]
namespace SherpaOnnx;

public class AudioEvent
{
	private struct Impl
	{
		public IntPtr Name;

		public int Index;

		public float Prob;
	}

	private string _name;

	private int _index;

	private float _prob;

	public string Name => _name;

	public int Index => _index;

	public float Prob => _prob;

	public unsafe AudioEvent(IntPtr handle)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(handle, typeof(Impl));
		int num = 0;
		byte* ptr = (byte*)(void*)impl.Name;
		while (*ptr != 0)
		{
			ptr++;
			num++;
		}
		byte[] array = new byte[num];
		Marshal.Copy(impl.Name, array, 0, num);
		_name = Encoding.UTF8.GetString(array);
		_index = impl.Index;
		_prob = impl.Prob;
	}
}
public class AudioTagging : IDisposable
{
	private HandleRef _handle;

	public AudioTagging(AudioTaggingConfig config)
	{
		IntPtr handle = SherpaOnnxCreateAudioTagging(ref config);
		_handle = new HandleRef(this, handle);
	}

	public OfflineStream CreateStream()
	{
		return new OfflineStream(SherpaOnnxAudioTaggingCreateOfflineStream(_handle.Handle));
	}

	public AudioEvent[] Compute(OfflineStream stream, int topK = -1)
	{
		IntPtr intPtr = SherpaOnnxAudioTaggingCompute(_handle.Handle, stream.Handle, topK);
		List<AudioEvent> list = new List<AudioEvent>();
		if (intPtr == IntPtr.Zero)
		{
			return list.ToArray();
		}
		int num = 0;
		while (true)
		{
			IntPtr intPtr2 = Marshal.ReadIntPtr(intPtr, num * IntPtr.Size);
			if (intPtr2 == IntPtr.Zero)
			{
				break;
			}
			AudioEvent item = new AudioEvent(intPtr2);
			list.Add(item);
			num++;
		}
		SherpaOnnxAudioTaggingFreeResults(intPtr);
		return list.ToArray();
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~AudioTagging()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyAudioTagging(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateAudioTagging(ref AudioTaggingConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyAudioTagging(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxAudioTaggingCreateOfflineStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxAudioTaggingCompute(IntPtr handle, IntPtr stream, int topK);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxAudioTaggingFreeResults(IntPtr p);
}
public struct AudioTaggingConfig
{
	public AudioTaggingModelConfig Model;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Labels;

	public int TopK;

	public AudioTaggingConfig()
	{
		Model = new AudioTaggingModelConfig();
		Labels = "";
		TopK = 5;
	}
}
public struct AudioTaggingModelConfig
{
	public OfflineZipformerAudioTaggingModelConfig Zipformer;

	[MarshalAs(UnmanagedType.LPStr)]
	public string CED;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public AudioTaggingModelConfig()
	{
		Zipformer = new OfflineZipformerAudioTaggingModelConfig();
		CED = "";
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
	}
}
public class CircularBuffer : IDisposable
{
	private HandleRef _handle;

	public int Size => SherpaOnnxCircularBufferSize(_handle.Handle);

	public int Head => SherpaOnnxCircularBufferHead(_handle.Handle);

	public CircularBuffer(int capacity)
	{
		IntPtr handle = SherpaOnnxCreateCircularBuffer(capacity);
		_handle = new HandleRef(this, handle);
	}

	public void Push(float[] data)
	{
		SherpaOnnxCircularBufferPush(_handle.Handle, data, data.Length);
	}

	public float[] Get(int startIndex, int n)
	{
		IntPtr intPtr = SherpaOnnxCircularBufferGet(_handle.Handle, startIndex, n);
		float[] array = new float[n];
		Marshal.Copy(intPtr, array, 0, n);
		SherpaOnnxCircularBufferFree(intPtr);
		return array;
	}

	public void Pop(int n)
	{
		SherpaOnnxCircularBufferPop(_handle.Handle, n);
	}

	public void Reset()
	{
		SherpaOnnxCircularBufferReset(_handle.Handle);
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~CircularBuffer()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyCircularBuffer(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateCircularBuffer(int capacity);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyCircularBuffer(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxCircularBufferPush(IntPtr handle, float[] p, int n);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCircularBufferGet(IntPtr handle, int startIndex, int n);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxCircularBufferFree(IntPtr p);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxCircularBufferPop(IntPtr handle, int n);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxCircularBufferSize(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxCircularBufferHead(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxCircularBufferReset(IntPtr handle);
}
public class DenoisedAudio
{
	private struct Impl
	{
		public IntPtr Samples;

		public int NumSamples;

		public int SampleRate;
	}

	private HandleRef _handle;

	public IntPtr Handle => _handle.Handle;

	public int NumSamples => ((Impl)Marshal.PtrToStructure(Handle, typeof(Impl))).NumSamples;

	public int SampleRate => ((Impl)Marshal.PtrToStructure(Handle, typeof(Impl))).SampleRate;

	public float[] Samples
	{
		get
		{
			Impl impl = (Impl)Marshal.PtrToStructure(Handle, typeof(Impl));
			float[] array = new float[impl.NumSamples];
			Marshal.Copy(impl.Samples, array, 0, impl.NumSamples);
			return array;
		}
	}

	public DenoisedAudio(IntPtr p)
	{
		_handle = new HandleRef(this, p);
	}

	public bool SaveToWaveFile(string filename)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(Handle, typeof(Impl));
		byte[] bytes = Encoding.UTF8.GetBytes(filename);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return SherpaOnnxWriteWave(impl.Samples, impl.NumSamples, impl.SampleRate, array) == 1;
	}

	~DenoisedAudio()
	{
		Cleanup();
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyDenoisedAudio(Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyDenoisedAudio(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxWriteWave(IntPtr samples, int n, int sample_rate, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Filename);
}
internal static class Dll
{
	public const string Filename = "sherpa-onnx-c-api";
}
public struct FastClusteringConfig
{
	public int NumClusters;

	public float Threshold;

	public FastClusteringConfig()
	{
		NumClusters = -1;
		Threshold = 0.5f;
	}
}
public struct FeatureConfig
{
	public int SampleRate;

	public int FeatureDim;

	public FeatureConfig()
	{
		SampleRate = 16000;
		FeatureDim = 80;
	}
}
public struct HomophoneReplacerConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string DictDir;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Lexicon;

	[MarshalAs(UnmanagedType.LPStr)]
	public string RuleFsts;

	public HomophoneReplacerConfig()
	{
		DictDir = "";
		Lexicon = "";
		RuleFsts = "";
	}
}
public class KeywordResult
{
	private struct Impl
	{
		public IntPtr Keyword;
	}

	private string _keyword;

	public string Keyword => _keyword;

	public unsafe KeywordResult(IntPtr handle)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(handle, typeof(Impl));
		int num = 0;
		byte* ptr = (byte*)(void*)impl.Keyword;
		while (*ptr != 0)
		{
			ptr++;
			num++;
		}
		byte[] array = new byte[num];
		Marshal.Copy(impl.Keyword, array, 0, num);
		_keyword = Encoding.UTF8.GetString(array);
	}
}
public class KeywordSpotter : IDisposable
{
	private HandleRef _handle;

	public KeywordSpotter(KeywordSpotterConfig config)
	{
		IntPtr handle = SherpaOnnxCreateKeywordSpotter(ref config);
		_handle = new HandleRef(this, handle);
	}

	public OnlineStream CreateStream()
	{
		return new OnlineStream(SherpaOnnxCreateKeywordStream(_handle.Handle));
	}

	public OnlineStream CreateStream(string keywords)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(keywords);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return new OnlineStream(SherpaOnnxCreateKeywordStreamWithKeywords(_handle.Handle, array));
	}

	public bool IsReady(OnlineStream stream)
	{
		return IsReady(_handle.Handle, stream.Handle) != 0;
	}

	public void Decode(OnlineStream stream)
	{
		Decode(_handle.Handle, stream.Handle);
	}

	public void Reset(OnlineStream stream)
	{
		Reset(_handle.Handle, stream.Handle);
	}

	public void Decode(IEnumerable<OnlineStream> streams)
	{
		List<IntPtr> list = new List<IntPtr>();
		foreach (OnlineStream stream in streams)
		{
			list.Add(stream.Handle);
		}
		IntPtr[] array = list.ToArray();
		Decode(_handle.Handle, array, array.Length);
	}

	public KeywordResult GetResult(OnlineStream stream)
	{
		IntPtr result = GetResult(_handle.Handle, stream.Handle);
		KeywordResult result2 = new KeywordResult(result);
		DestroyResult(result);
		return result2;
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~KeywordSpotter()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyKeywordSpotter(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateKeywordSpotter(ref KeywordSpotterConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyKeywordSpotter(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateKeywordStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateKeywordStreamWithKeywords(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Keywords);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxIsKeywordStreamReady")]
	private static extern int IsReady(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDecodeKeywordStream")]
	private static extern void Decode(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxResetKeywordStream")]
	private static extern void Reset(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDecodeMultipleKeywordStreams")]
	private static extern void Decode(IntPtr handle, IntPtr[] streams, int n);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxGetKeywordResult")]
	private static extern IntPtr GetResult(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDestroyKeywordResult")]
	private static extern void DestroyResult(IntPtr result);
}
public struct KeywordSpotterConfig
{
	public FeatureConfig FeatConfig;

	public OnlineModelConfig ModelConfig;

	public int MaxActivePaths;

	public int NumTrailingBlanks;

	public float KeywordsScore;

	public float KeywordsThreshold;

	[MarshalAs(UnmanagedType.LPStr)]
	public string KeywordsFile;

	[MarshalAs(UnmanagedType.LPStr)]
	public string KeywordsBuf;

	public int KeywordsBufSize;

	public KeywordSpotterConfig()
	{
		FeatConfig = new FeatureConfig();
		ModelConfig = new OnlineModelConfig();
		MaxActivePaths = 4;
		NumTrailingBlanks = 1;
		KeywordsScore = 1f;
		KeywordsThreshold = 0.25f;
		KeywordsFile = "";
		KeywordsBuf = "";
		KeywordsBufSize = 0;
	}
}
public struct OfflineCanaryModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string SrcLang;

	[MarshalAs(UnmanagedType.LPStr)]
	public string TgtLang;

	public int UsePnc;

	public OfflineCanaryModelConfig()
	{
		Encoder = "";
		Decoder = "";
		SrcLang = "en";
		TgtLang = "en";
		UsePnc = 1;
	}
}
public struct OfflineDolphinModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineDolphinModelConfig()
	{
		Model = "";
	}
}
public struct OfflineFireRedAsrModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	public OfflineFireRedAsrModelConfig()
	{
		Encoder = "";
		Decoder = "";
	}
}
public struct OfflineFunAsrNanoModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string EncoderAdaptor;

	[MarshalAs(UnmanagedType.LPStr)]
	public string LLM;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Embedding;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokenizer;

	[MarshalAs(UnmanagedType.LPStr)]
	public string SystemPrompt;

	[MarshalAs(UnmanagedType.LPStr)]
	public string UserPrompt;

	public int MaxNewTokens;

	public float Temperature;

	public float TopP;

	public int Seed;

	public OfflineFunAsrNanoModelConfig()
	{
		EncoderAdaptor = "";
		LLM = "";
		Embedding = "";
		Tokenizer = "";
		SystemPrompt = "You are a helpful assistant.";
		UserPrompt = "语音转写:";
		MaxNewTokens = 512;
		Temperature = 1E-06f;
		TopP = 0.8f;
		Seed = 42;
	}
}
public struct OfflineLMConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public float Scale;

	public OfflineLMConfig()
	{
		Model = "";
		Scale = 0.5f;
	}
}
public struct OfflineMedAsrCtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineMedAsrCtcModelConfig()
	{
		Model = "";
	}
}
public struct OfflineModelConfig
{
	public OfflineTransducerModelConfig Transducer;

	public OfflineParaformerModelConfig Paraformer;

	public OfflineNemoEncDecCtcModelConfig NeMoCtc;

	public OfflineWhisperModelConfig Whisper;

	public OfflineTdnnModelConfig Tdnn;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokens;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	[MarshalAs(UnmanagedType.LPStr)]
	public string ModelType;

	[MarshalAs(UnmanagedType.LPStr)]
	public string ModelingUnit;

	[MarshalAs(UnmanagedType.LPStr)]
	public string BpeVocab;

	[MarshalAs(UnmanagedType.LPStr)]
	public string TeleSpeechCtc;

	public OfflineSenseVoiceModelConfig SenseVoice;

	public OfflineMoonshineModelConfig Moonshine;

	public OfflineFireRedAsrModelConfig FireRedAsr;

	public OfflineDolphinModelConfig Dolphin;

	public OfflineZipformerCtcModelConfig ZipformerCtc;

	public OfflineCanaryModelConfig Canary;

	public OfflineWenetCtcModelConfig WenetCtc;

	public OfflineOmnilingualAsrCtcModelConfig Omnilingual;

	public OfflineMedAsrCtcModelConfig MedAsr;

	public OfflineFunAsrNanoModelConfig FunAsrNano;

	public OfflineModelConfig()
	{
		Transducer = new OfflineTransducerModelConfig();
		Paraformer = new OfflineParaformerModelConfig();
		NeMoCtc = new OfflineNemoEncDecCtcModelConfig();
		Whisper = new OfflineWhisperModelConfig();
		Tdnn = new OfflineTdnnModelConfig();
		Tokens = "";
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
		ModelType = "";
		ModelingUnit = "cjkchar";
		BpeVocab = "";
		TeleSpeechCtc = "";
		SenseVoice = new OfflineSenseVoiceModelConfig();
		Moonshine = new OfflineMoonshineModelConfig();
		FireRedAsr = new OfflineFireRedAsrModelConfig();
		Dolphin = new OfflineDolphinModelConfig();
		ZipformerCtc = new OfflineZipformerCtcModelConfig();
		Canary = new OfflineCanaryModelConfig();
		WenetCtc = new OfflineWenetCtcModelConfig();
		Omnilingual = new OfflineOmnilingualAsrCtcModelConfig();
		MedAsr = new OfflineMedAsrCtcModelConfig();
		FunAsrNano = new OfflineFunAsrNanoModelConfig();
	}
}
public struct OfflineMoonshineModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Preprocessor;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string UncachedDecoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string CachedDecoder;

	public OfflineMoonshineModelConfig()
	{
		Preprocessor = "";
		Encoder = "";
		UncachedDecoder = "";
		CachedDecoder = "";
	}
}
public struct OfflineNemoEncDecCtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineNemoEncDecCtcModelConfig()
	{
		Model = "";
	}
}
public struct OfflineOmnilingualAsrCtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineOmnilingualAsrCtcModelConfig()
	{
		Model = "";
	}
}
public struct OfflineParaformerModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineParaformerModelConfig()
	{
		Model = "";
	}
}
public class OfflinePunctuation : IDisposable
{
	private HandleRef _handle;

	public OfflinePunctuation(OfflinePunctuationConfig config)
	{
		IntPtr handle = SherpaOnnxCreateOfflinePunctuation(ref config);
		_handle = new HandleRef(this, handle);
	}

	public unsafe string AddPunct(string text)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(text);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		IntPtr intPtr = SherpaOfflinePunctuationAddPunct(_handle.Handle, array);
		string result = "";
		int num = 0;
		byte* ptr = (byte*)(void*)intPtr;
		if (ptr != null)
		{
			while (*ptr != 0)
			{
				ptr++;
				num++;
			}
		}
		if (num > 0)
		{
			byte[] array2 = new byte[num];
			Marshal.Copy(intPtr, array2, 0, num);
			result = Encoding.UTF8.GetString(array2);
		}
		SherpaOfflinePunctuationFreeText(intPtr);
		return result;
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~OfflinePunctuation()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOfflinePunctuation(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOfflinePunctuation(ref OfflinePunctuationConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOfflinePunctuation(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOfflinePunctuationAddPunct(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Text);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOfflinePunctuationFreeText(IntPtr p);
}
public struct OfflinePunctuationConfig
{
	public OfflinePunctuationModelConfig Model;

	public OfflinePunctuationConfig()
	{
		Model = new OfflinePunctuationModelConfig();
	}
}
public struct OfflinePunctuationModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string CtTransformer;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public OfflinePunctuationModelConfig()
	{
		CtTransformer = "";
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
	}
}
public class OfflineRecognizer : IDisposable
{
	private HandleRef _handle;

	public OfflineRecognizer(OfflineRecognizerConfig config)
	{
		IntPtr handle = SherpaOnnxCreateOfflineRecognizer(ref config);
		_handle = new HandleRef(this, handle);
	}

	public void SetConfig(OfflineRecognizerConfig config)
	{
		SherpaOnnxOfflineRecognizerSetConfig(_handle.Handle, ref config);
	}

	public OfflineStream CreateStream()
	{
		return new OfflineStream(SherpaOnnxCreateOfflineStream(_handle.Handle));
	}

	public void Decode(OfflineStream stream)
	{
		Decode(_handle.Handle, stream.Handle);
	}

	public void Decode(IEnumerable<OfflineStream> streams)
	{
		List<IntPtr> list = new List<IntPtr>();
		foreach (OfflineStream stream in streams)
		{
			list.Add(stream.Handle);
		}
		IntPtr[] array = list.ToArray();
		Decode(_handle.Handle, array, array.Length);
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~OfflineRecognizer()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOfflineRecognizer(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOfflineRecognizer(ref OfflineRecognizerConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxOfflineRecognizerSetConfig(IntPtr handle, ref OfflineRecognizerConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOfflineRecognizer(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOfflineStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDecodeOfflineStream")]
	private static extern void Decode(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDecodeMultipleOfflineStreams")]
	private static extern void Decode(IntPtr handle, IntPtr[] streams, int n);
}
public struct OfflineRecognizerConfig
{
	public FeatureConfig FeatConfig;

	public OfflineModelConfig ModelConfig;

	public OfflineLMConfig LmConfig;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DecodingMethod;

	public int MaxActivePaths;

	[MarshalAs(UnmanagedType.LPStr)]
	public string HotwordsFile;

	public float HotwordsScore;

	[MarshalAs(UnmanagedType.LPStr)]
	public string RuleFsts;

	[MarshalAs(UnmanagedType.LPStr)]
	public string RuleFars;

	public float BlankPenalty;

	public HomophoneReplacerConfig Hr;

	public OfflineRecognizerConfig()
	{
		FeatConfig = new FeatureConfig();
		ModelConfig = new OfflineModelConfig();
		LmConfig = new OfflineLMConfig();
		DecodingMethod = "greedy_search";
		MaxActivePaths = 4;
		HotwordsFile = "";
		HotwordsScore = 1.5f;
		RuleFsts = "";
		RuleFars = "";
		BlankPenalty = 0f;
		Hr = new HomophoneReplacerConfig();
	}
}
public class OfflineRecognizerResult
{
	private struct Impl
	{
		public IntPtr Text;

		public IntPtr Timestamps;

		public int Count;

		public IntPtr Tokens;

		public IntPtr Durations;
	}

	private string _text;

	private string[] _tokens;

	private float[] _timestamps;

	private float[] _durations;

	public string Text => _text;

	public string[] Tokens => _tokens;

	public float[] Timestamps => _timestamps;

	public float[] Durations => _durations;

	public unsafe OfflineRecognizerResult(IntPtr handle)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(handle, typeof(Impl));
		int num = 0;
		byte* ptr = (byte*)(void*)impl.Text;
		while (*ptr != 0)
		{
			ptr++;
			num++;
		}
		byte[] array = new byte[num];
		Marshal.Copy(impl.Text, array, 0, num);
		_text = Encoding.UTF8.GetString(array);
		_tokens = new string[impl.Count];
		byte* ptr2 = (byte*)(void*)impl.Tokens;
		for (int i = 0; i < impl.Count; i++)
		{
			num = 0;
			byte* ptr3 = ptr2;
			while (*ptr2 != 0)
			{
				ptr2++;
				num++;
			}
			ptr2++;
			array = new byte[num];
			fixed (byte* ptr4 = array)
			{
				for (int j = 0; j < num; j++)
				{
					ptr4[j] = ptr3[j];
				}
			}
			_tokens[i] = Encoding.UTF8.GetString(array);
		}
		if (impl.Timestamps != IntPtr.Zero)
		{
			float* ptr5 = (float*)(void*)impl.Timestamps;
			_timestamps = new float[impl.Count];
			fixed (float* ptr6 = _timestamps)
			{
				for (int k = 0; k < impl.Count; k++)
				{
					ptr6[k] = ptr5[k];
				}
			}
		}
		if (!(impl.Durations != IntPtr.Zero))
		{
			return;
		}
		float* ptr7 = (float*)(void*)impl.Durations;
		_durations = new float[impl.Count];
		fixed (float* ptr8 = _durations)
		{
			for (int l = 0; l < impl.Count; l++)
			{
				ptr8[l] = ptr7[l];
			}
		}
	}
}
public struct OfflineSenseVoiceModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Language;

	public int UseInverseTextNormalization;

	public OfflineSenseVoiceModelConfig()
	{
		Model = "";
		Language = "";
		UseInverseTextNormalization = 0;
	}
}
public delegate int OfflineSpeakerDiarizationProgressCallback(int numProcessedChunks, int numTotalChunks, IntPtr arg);
public class OfflineSpeakerDiarization : IDisposable
{
	private HandleRef _handle;

	public int SampleRate => SherpaOnnxOfflineSpeakerDiarizationGetSampleRate(_handle.Handle);

	public OfflineSpeakerDiarization(OfflineSpeakerDiarizationConfig config)
	{
		IntPtr handle = SherpaOnnxCreateOfflineSpeakerDiarization(ref config);
		_handle = new HandleRef(this, handle);
	}

	public void SetConfig(OfflineSpeakerDiarizationConfig config)
	{
		SherpaOnnxOfflineSpeakerDiarizationSetConfig(_handle.Handle, ref config);
	}

	public OfflineSpeakerDiarizationSegment[] Process(float[] samples)
	{
		IntPtr result = SherpaOnnxOfflineSpeakerDiarizationProcess(_handle.Handle, samples, samples.Length);
		return ProcessImpl(result);
	}

	public OfflineSpeakerDiarizationSegment[] ProcessWithCallback(float[] samples, OfflineSpeakerDiarizationProgressCallback callback, IntPtr arg)
	{
		IntPtr result = SherpaOnnxOfflineSpeakerDiarizationProcessWithCallback(_handle.Handle, samples, samples.Length, callback, arg);
		return ProcessImpl(result);
	}

	private unsafe OfflineSpeakerDiarizationSegment[] ProcessImpl(IntPtr result)
	{
		if (result == IntPtr.Zero)
		{
			return new OfflineSpeakerDiarizationSegment[0];
		}
		int num = SherpaOnnxOfflineSpeakerDiarizationResultGetNumSegments(result);
		IntPtr intPtr = SherpaOnnxOfflineSpeakerDiarizationResultSortByStartTime(result);
		OfflineSpeakerDiarizationSegment[] array = new OfflineSpeakerDiarizationSegment[num];
		int num2 = 12;
		for (int i = 0; i != num; i++)
		{
			IntPtr handle = new IntPtr((byte*)(void*)intPtr + i * num2);
			array[i] = new OfflineSpeakerDiarizationSegment(handle);
		}
		SherpaOnnxOfflineSpeakerDiarizationDestroySegment(intPtr);
		SherpaOnnxOfflineSpeakerDiarizationDestroyResult(result);
		return array;
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~OfflineSpeakerDiarization()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOfflineSpeakerDiarization(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOfflineSpeakerDiarization(ref OfflineSpeakerDiarizationConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOfflineSpeakerDiarization(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxOfflineSpeakerDiarizationGetSampleRate(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxOfflineSpeakerDiarizationResultGetNumSegments(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxOfflineSpeakerDiarizationProcess(IntPtr handle, float[] samples, int n);

	[DllImport("sherpa-onnx-c-api", CallingConvention = CallingConvention.Cdecl)]
	private static extern IntPtr SherpaOnnxOfflineSpeakerDiarizationProcessWithCallback(IntPtr handle, float[] samples, int n, OfflineSpeakerDiarizationProgressCallback callback, IntPtr arg);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxOfflineSpeakerDiarizationDestroyResult(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxOfflineSpeakerDiarizationResultSortByStartTime(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxOfflineSpeakerDiarizationDestroySegment(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxOfflineSpeakerDiarizationSetConfig(IntPtr handle, ref OfflineSpeakerDiarizationConfig config);
}
public struct OfflineSpeakerDiarizationConfig
{
	public OfflineSpeakerSegmentationModelConfig Segmentation;

	public SpeakerEmbeddingExtractorConfig Embedding;

	public FastClusteringConfig Clustering;

	public float MinDurationOn;

	public float MinDurationOff;

	public OfflineSpeakerDiarizationConfig()
	{
		Segmentation = new OfflineSpeakerSegmentationModelConfig();
		Embedding = new SpeakerEmbeddingExtractorConfig();
		Clustering = new FastClusteringConfig();
		MinDurationOn = 0.3f;
		MinDurationOff = 0.5f;
	}
}
public class OfflineSpeakerDiarizationSegment
{
	private struct Impl
	{
		public float Start;

		public float End;

		public int Speaker;
	}

	public float Start;

	public float End;

	public int Speaker;

	public OfflineSpeakerDiarizationSegment(IntPtr handle)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(handle, typeof(Impl));
		Start = impl.Start;
		End = impl.End;
		Speaker = impl.Speaker;
	}
}
public struct OfflineSpeakerSegmentationModelConfig
{
	public OfflineSpeakerSegmentationPyannoteModelConfig Pyannote;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public OfflineSpeakerSegmentationModelConfig()
	{
		Pyannote = new OfflineSpeakerSegmentationPyannoteModelConfig();
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
	}
}
public struct OfflineSpeakerSegmentationPyannoteModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineSpeakerSegmentationPyannoteModelConfig()
	{
		Model = "";
	}
}
public class OfflineSpeechDenoiser : IDisposable
{
	private HandleRef _handle;

	public int SampleRate => SherpaOnnxOfflineSpeechDenoiserGetSampleRate(_handle.Handle);

	public OfflineSpeechDenoiser(OfflineSpeechDenoiserConfig config)
	{
		IntPtr handle = SherpaOnnxCreateOfflineSpeechDenoiser(ref config);
		_handle = new HandleRef(this, handle);
	}

	public DenoisedAudio Run(float[] samples, int sampleRate)
	{
		return new DenoisedAudio(SherpaOnnxOfflineSpeechDenoiserRun(_handle.Handle, samples, samples.Length, sampleRate));
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~OfflineSpeechDenoiser()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOfflineSpeechDenoiser(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOfflineSpeechDenoiser(ref OfflineSpeechDenoiserConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOfflineSpeechDenoiser(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxOfflineSpeechDenoiserGetSampleRate(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxOfflineSpeechDenoiserRun(IntPtr handle, float[] samples, int n, int sampleRate);
}
public struct OfflineSpeechDenoiserConfig
{
	public OfflineSpeechDenoiserModelConfig Model;

	public OfflineSpeechDenoiserConfig()
	{
		Model = new OfflineSpeechDenoiserModelConfig();
	}
}
public struct OfflineSpeechDenoiserGtcrnModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineSpeechDenoiserGtcrnModelConfig()
	{
		Model = "";
	}
}
public struct OfflineSpeechDenoiserModelConfig
{
	public OfflineSpeechDenoiserGtcrnModelConfig Gtcrn;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public OfflineSpeechDenoiserModelConfig()
	{
		Gtcrn = new OfflineSpeechDenoiserGtcrnModelConfig();
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
	}
}
public class OfflineStream : IDisposable
{
	private HandleRef _handle;

	public OfflineRecognizerResult Result
	{
		get
		{
			IntPtr result = GetResult(_handle.Handle);
			OfflineRecognizerResult result2 = new OfflineRecognizerResult(result);
			DestroyResult(result);
			return result2;
		}
	}

	public IntPtr Handle => _handle.Handle;

	public OfflineStream(IntPtr p)
	{
		_handle = new HandleRef(this, p);
	}

	public void AcceptWaveform(int sampleRate, float[] samples)
	{
		AcceptWaveform(Handle, sampleRate, samples, samples.Length);
	}

	~OfflineStream()
	{
		Cleanup();
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOfflineStream(Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOfflineStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxAcceptWaveformOffline")]
	private static extern void AcceptWaveform(IntPtr handle, int sampleRate, float[] samples, int n);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxGetOfflineStreamResult")]
	private static extern IntPtr GetResult(IntPtr handle);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDestroyOfflineRecognizerResult")]
	private static extern void DestroyResult(IntPtr handle);
}
public struct OfflineTdnnModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineTdnnModelConfig()
	{
		Model = "";
	}
}
public struct OfflineTransducerModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Joiner;

	public OfflineTransducerModelConfig()
	{
		Encoder = "";
		Decoder = "";
		Joiner = "";
	}
}
public delegate int OfflineTtsCallback(IntPtr samples, int n);
public delegate int OfflineTtsCallbackProgress(IntPtr samples, int n, float progress);
public class OfflineTts : IDisposable
{
	private HandleRef _handle;

	public int SampleRate => SherpaOnnxOfflineTtsSampleRate(_handle.Handle);

	public int NumSpeakers => SherpaOnnxOfflineTtsNumSpeakers(_handle.Handle);

	public OfflineTts(OfflineTtsConfig config)
	{
		IntPtr handle = SherpaOnnxCreateOfflineTts(ref config);
		_handle = new HandleRef(this, handle);
	}

	public OfflineTtsGeneratedAudio Generate(string text, float speed, int speakerId)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(text);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return new OfflineTtsGeneratedAudio(SherpaOnnxOfflineTtsGenerate(_handle.Handle, array, speakerId, speed));
	}

	public OfflineTtsGeneratedAudio GenerateWithCallback(string text, float speed, int speakerId, OfflineTtsCallback callback)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(text);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return new OfflineTtsGeneratedAudio(SherpaOnnxOfflineTtsGenerateWithCallback(_handle.Handle, array, speakerId, speed, callback));
	}

	public OfflineTtsGeneratedAudio GenerateWithCallbackProgress(string text, float speed, int speakerId, OfflineTtsCallbackProgress callback)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(text);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return new OfflineTtsGeneratedAudio(SherpaOnnxOfflineTtsGenerateWithProgressCallback(_handle.Handle, array, speakerId, speed, callback));
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~OfflineTts()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOfflineTts(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOfflineTts(ref OfflineTtsConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOfflineTts(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxOfflineTtsSampleRate(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxOfflineTtsNumSpeakers(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxOfflineTtsGenerate(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Text, int sid, float speed);

	[DllImport("sherpa-onnx-c-api", CallingConvention = CallingConvention.Cdecl)]
	private static extern IntPtr SherpaOnnxOfflineTtsGenerateWithCallback(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Text, int sid, float speed, OfflineTtsCallback callback);

	[DllImport("sherpa-onnx-c-api", CallingConvention = CallingConvention.Cdecl)]
	private static extern IntPtr SherpaOnnxOfflineTtsGenerateWithProgressCallback(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Text, int sid, float speed, OfflineTtsCallbackProgress callback);
}
public struct OfflineTtsConfig
{
	public OfflineTtsModelConfig Model;

	[MarshalAs(UnmanagedType.LPStr)]
	public string RuleFsts;

	public int MaxNumSentences;

	[MarshalAs(UnmanagedType.LPStr)]
	public string RuleFars;

	public float SilenceScale;

	public OfflineTtsConfig()
	{
		Model = new OfflineTtsModelConfig();
		RuleFsts = "";
		MaxNumSentences = 1;
		RuleFars = "";
		SilenceScale = 0.2f;
	}
}
public class OfflineTtsGeneratedAudio
{
	private struct Impl
	{
		public IntPtr Samples;

		public int NumSamples;

		public int SampleRate;
	}

	private HandleRef _handle;

	public IntPtr Handle => _handle.Handle;

	public int NumSamples => ((Impl)Marshal.PtrToStructure(Handle, typeof(Impl))).NumSamples;

	public int SampleRate => ((Impl)Marshal.PtrToStructure(Handle, typeof(Impl))).SampleRate;

	public float[] Samples
	{
		get
		{
			Impl impl = (Impl)Marshal.PtrToStructure(Handle, typeof(Impl));
			float[] array = new float[impl.NumSamples];
			Marshal.Copy(impl.Samples, array, 0, impl.NumSamples);
			return array;
		}
	}

	public OfflineTtsGeneratedAudio(IntPtr p)
	{
		_handle = new HandleRef(this, p);
	}

	public bool SaveToWaveFile(string filename)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(Handle, typeof(Impl));
		byte[] bytes = Encoding.UTF8.GetBytes(filename);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return SherpaOnnxWriteWave(impl.Samples, impl.NumSamples, impl.SampleRate, array) == 1;
	}

	~OfflineTtsGeneratedAudio()
	{
		Cleanup();
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOfflineTtsGeneratedAudio(Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOfflineTtsGeneratedAudio(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxWriteWave(IntPtr samples, int n, int sample_rate, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Filename);
}
public struct OfflineTtsKittenModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Voices;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokens;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DataDir;

	public float LengthScale;

	public OfflineTtsKittenModelConfig()
	{
		Model = "";
		Voices = "";
		Tokens = "";
		DataDir = "";
		LengthScale = 1f;
	}
}
public struct OfflineTtsKokoroModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Voices;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokens;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DataDir;

	public float LengthScale;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DictDir;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Lexicon;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Lang;

	public OfflineTtsKokoroModelConfig()
	{
		Model = "";
		Voices = "";
		Tokens = "";
		DataDir = "";
		LengthScale = 1f;
		DictDir = "";
		Lexicon = "";
		Lang = "";
	}
}
public struct OfflineTtsMatchaModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string AcousticModel;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Vocoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Lexicon;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokens;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DataDir;

	public float NoiseScale;

	public float LengthScale;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DictDir;

	public OfflineTtsMatchaModelConfig()
	{
		AcousticModel = "";
		Vocoder = "";
		Lexicon = "";
		Tokens = "";
		DataDir = "";
		NoiseScale = 0.667f;
		LengthScale = 1f;
		DictDir = "";
	}
}
public struct OfflineTtsModelConfig
{
	public OfflineTtsVitsModelConfig Vits;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public OfflineTtsMatchaModelConfig Matcha;

	public OfflineTtsKokoroModelConfig Kokoro;

	public OfflineTtsKittenModelConfig Kitten;

	public OfflineTtsZipVoiceModelConfig ZipVoice;

	public OfflineTtsModelConfig()
	{
		Vits = new OfflineTtsVitsModelConfig();
		Matcha = new OfflineTtsMatchaModelConfig();
		Kokoro = new OfflineTtsKokoroModelConfig();
		Kitten = new OfflineTtsKittenModelConfig();
		ZipVoice = new OfflineTtsZipVoiceModelConfig();
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
	}
}
public struct OfflineTtsVitsModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Lexicon;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokens;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DataDir;

	public float NoiseScale;

	public float NoiseScaleW;

	public float LengthScale;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DictDir;

	public OfflineTtsVitsModelConfig()
	{
		Model = "";
		Lexicon = "";
		Tokens = "";
		DataDir = "";
		NoiseScale = 0.667f;
		NoiseScaleW = 0.8f;
		LengthScale = 1f;
		DictDir = "";
	}
}
public struct OfflineTtsZipVoiceModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokens;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Vocoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DataDir;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Lexicon;

	public float FeatScale;

	public float Tshift;

	public float TargetRms;

	public float GuidanceScale;

	public OfflineTtsZipVoiceModelConfig()
	{
		Tokens = "";
		Encoder = "";
		Decoder = "";
		Vocoder = "";
		DataDir = "";
		Lexicon = "";
		FeatScale = 0.1f;
		Tshift = 0.5f;
		TargetRms = 0.1f;
		GuidanceScale = 1f;
	}
}
public struct OfflineWenetCtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineWenetCtcModelConfig()
	{
		Model = "";
	}
}
public struct OfflineWhisperModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Language;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Task;

	public int TailPaddings;

	public OfflineWhisperModelConfig()
	{
		Encoder = "";
		Decoder = "";
		Language = "";
		Task = "transcribe";
		TailPaddings = -1;
	}
}
public struct OfflineZipformerAudioTaggingModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineZipformerAudioTaggingModelConfig()
	{
		Model = "";
	}
}
public struct OfflineZipformerCtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OfflineZipformerCtcModelConfig()
	{
		Model = "";
	}
}
public struct OnlineCtcFstDecoderConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Graph;

	public int MaxActive;

	public OnlineCtcFstDecoderConfig()
	{
		Graph = "";
		MaxActive = 3000;
	}
}
public struct OnlineModelConfig
{
	public OnlineTransducerModelConfig Transducer;

	public OnlineParaformerModelConfig Paraformer;

	public OnlineZipformer2CtcModelConfig Zipformer2Ctc;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Tokens;

	public int NumThreads;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string ModelType;

	[MarshalAs(UnmanagedType.LPStr)]
	public string ModelingUnit;

	[MarshalAs(UnmanagedType.LPStr)]
	public string BpeVocab;

	[MarshalAs(UnmanagedType.LPStr)]
	public string TokensBuf;

	public int TokensBufSize;

	public OnlineNemoCtcModelConfig NemoCtc;

	public OnlineToneCtcModelConfig ToneCtc;

	public OnlineModelConfig()
	{
		Transducer = new OnlineTransducerModelConfig();
		Paraformer = new OnlineParaformerModelConfig();
		Zipformer2Ctc = new OnlineZipformer2CtcModelConfig();
		Tokens = "";
		NumThreads = 1;
		Provider = "cpu";
		Debug = 0;
		ModelType = "";
		ModelingUnit = "cjkchar";
		BpeVocab = "";
		TokensBuf = "";
		TokensBufSize = 0;
		NemoCtc = new OnlineNemoCtcModelConfig();
		ToneCtc = new OnlineToneCtcModelConfig();
	}
}
public struct OnlineNemoCtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OnlineNemoCtcModelConfig()
	{
		Model = "";
	}
}
public struct OnlineParaformerModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	public OnlineParaformerModelConfig()
	{
		Encoder = "";
		Decoder = "";
	}
}
public class OnlineRecognizer : IDisposable
{
	private HandleRef _handle;

	public OnlineRecognizer(OnlineRecognizerConfig config)
	{
		IntPtr handle = SherpaOnnxCreateOnlineRecognizer(ref config);
		_handle = new HandleRef(this, handle);
	}

	public OnlineStream CreateStream()
	{
		return new OnlineStream(SherpaOnnxCreateOnlineStream(_handle.Handle));
	}

	public bool IsReady(OnlineStream stream)
	{
		return IsReady(_handle.Handle, stream.Handle) != 0;
	}

	public bool IsEndpoint(OnlineStream stream)
	{
		return SherpaOnnxOnlineStreamIsEndpoint(_handle.Handle, stream.Handle) != 0;
	}

	public void Decode(OnlineStream stream)
	{
		Decode(_handle.Handle, stream.Handle);
	}

	public void Decode(IEnumerable<OnlineStream> streams)
	{
		List<IntPtr> list = new List<IntPtr>();
		foreach (OnlineStream stream in streams)
		{
			list.Add(stream.Handle);
		}
		IntPtr[] array = list.ToArray();
		Decode(_handle.Handle, array, array.Length);
	}

	public OnlineRecognizerResult GetResult(OnlineStream stream)
	{
		IntPtr result = GetResult(_handle.Handle, stream.Handle);
		OnlineRecognizerResult result2 = new OnlineRecognizerResult(result);
		DestroyResult(result);
		return result2;
	}

	public void Reset(OnlineStream stream)
	{
		SherpaOnnxOnlineStreamReset(_handle.Handle, stream.Handle);
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~OnlineRecognizer()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOnlineRecognizer(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOnlineRecognizer(ref OnlineRecognizerConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOnlineRecognizer(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateOnlineStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxIsOnlineStreamReady")]
	private static extern int IsReady(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDecodeOnlineStream")]
	private static extern void Decode(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDecodeMultipleOnlineStreams")]
	private static extern void Decode(IntPtr handle, IntPtr[] streams, int n);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxGetOnlineStreamResult")]
	private static extern IntPtr GetResult(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api", EntryPoint = "SherpaOnnxDestroyOnlineRecognizerResult")]
	private static extern void DestroyResult(IntPtr result);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxOnlineStreamReset(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxOnlineStreamIsEndpoint(IntPtr handle, IntPtr stream);
}
public struct OnlineRecognizerConfig
{
	public FeatureConfig FeatConfig;

	public OnlineModelConfig ModelConfig;

	[MarshalAs(UnmanagedType.LPStr)]
	public string DecodingMethod;

	public int MaxActivePaths;

	public int EnableEndpoint;

	public float Rule1MinTrailingSilence;

	public float Rule2MinTrailingSilence;

	public float Rule3MinUtteranceLength;

	[MarshalAs(UnmanagedType.LPStr)]
	public string HotwordsFile;

	public float HotwordsScore;

	public OnlineCtcFstDecoderConfig CtcFstDecoderConfig;

	[MarshalAs(UnmanagedType.LPStr)]
	public string RuleFsts;

	[MarshalAs(UnmanagedType.LPStr)]
	public string RuleFars;

	public float BlankPenalty;

	[MarshalAs(UnmanagedType.LPStr)]
	public string HotwordsBuf;

	public int HotwordsBufSize;

	public HomophoneReplacerConfig Hr;

	public OnlineRecognizerConfig()
	{
		FeatConfig = new FeatureConfig();
		ModelConfig = new OnlineModelConfig();
		DecodingMethod = "greedy_search";
		MaxActivePaths = 4;
		EnableEndpoint = 0;
		Rule1MinTrailingSilence = 1.2f;
		Rule2MinTrailingSilence = 2.4f;
		Rule3MinUtteranceLength = 20f;
		HotwordsFile = "";
		HotwordsScore = 1.5f;
		CtcFstDecoderConfig = new OnlineCtcFstDecoderConfig();
		RuleFsts = "";
		RuleFars = "";
		BlankPenalty = 0f;
		HotwordsBuf = "";
		HotwordsBufSize = 0;
		Hr = new HomophoneReplacerConfig();
	}
}
public class OnlineRecognizerResult
{
	private struct Impl
	{
		public IntPtr Text;

		public IntPtr Tokens;

		public IntPtr TokensArr;

		public IntPtr Timestamps;

		public int Count;
	}

	private string _text;

	private string[] _tokens;

	private float[] _timestamps;

	public string Text => _text;

	public string[] Tokens => _tokens;

	public float[] Timestamps => _timestamps;

	public unsafe OnlineRecognizerResult(IntPtr handle)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(handle, typeof(Impl));
		int num = 0;
		byte* ptr = (byte*)(void*)impl.Text;
		while (*ptr != 0)
		{
			ptr++;
			num++;
		}
		byte[] array = new byte[num];
		Marshal.Copy(impl.Text, array, 0, num);
		_text = Encoding.UTF8.GetString(array);
		_tokens = new string[impl.Count];
		byte* ptr2 = (byte*)(void*)impl.Tokens;
		for (int i = 0; i < impl.Count; i++)
		{
			num = 0;
			byte* ptr3 = ptr2;
			while (*ptr2 != 0)
			{
				ptr2++;
				num++;
			}
			ptr2++;
			array = new byte[num];
			fixed (byte* ptr4 = array)
			{
				for (int j = 0; j < num; j++)
				{
					ptr4[j] = ptr3[j];
				}
			}
			_tokens[i] = Encoding.UTF8.GetString(array);
		}
		float* ptr5 = (float*)(void*)impl.Timestamps;
		if (ptr5 != null)
		{
			_timestamps = new float[impl.Count];
			fixed (float* ptr6 = _timestamps)
			{
				for (int k = 0; k < impl.Count; k++)
				{
					ptr6[k] = ptr5[k];
				}
			}
		}
		else
		{
			_timestamps = new float[0];
		}
	}
}
public class OnlineStream : IDisposable
{
	private HandleRef _handle;

	public IntPtr Handle => _handle.Handle;

	public OnlineStream(IntPtr p)
	{
		_handle = new HandleRef(this, p);
	}

	public void AcceptWaveform(int sampleRate, float[] samples)
	{
		SherpaOnnxOnlineStreamAcceptWaveform(Handle, sampleRate, samples, samples.Length);
	}

	public void InputFinished()
	{
		SherpaOnnxOnlineStreamInputFinished(Handle);
	}

	~OnlineStream()
	{
		Cleanup();
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyOnlineStream(Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyOnlineStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxOnlineStreamAcceptWaveform(IntPtr handle, int sampleRate, float[] samples, int n);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxOnlineStreamInputFinished(IntPtr handle);
}
public struct OnlineToneCtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OnlineToneCtcModelConfig()
	{
		Model = "";
	}
}
public struct OnlineTransducerModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Joiner;

	public OnlineTransducerModelConfig()
	{
		Encoder = "";
		Decoder = "";
		Joiner = "";
	}
}
public struct OnlineZipformer2CtcModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public OnlineZipformer2CtcModelConfig()
	{
		Model = "";
	}
}
public struct SileroVadModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public float Threshold;

	public float MinSilenceDuration;

	public float MinSpeechDuration;

	public int WindowSize;

	public float MaxSpeechDuration;

	public SileroVadModelConfig()
	{
		Model = "";
		Threshold = 0.5f;
		MinSilenceDuration = 0.5f;
		MinSpeechDuration = 0.25f;
		WindowSize = 512;
		MaxSpeechDuration = 5f;
	}
}
public class SpeakerEmbeddingExtractor : IDisposable
{
	private HandleRef _handle;

	public int Dim => SherpaOnnxSpeakerEmbeddingExtractorDim(_handle.Handle);

	public SpeakerEmbeddingExtractor(SpeakerEmbeddingExtractorConfig config)
	{
		IntPtr handle = SherpaOnnxCreateSpeakerEmbeddingExtractor(ref config);
		_handle = new HandleRef(this, handle);
	}

	public OnlineStream CreateStream()
	{
		return new OnlineStream(SherpaOnnxSpeakerEmbeddingExtractorCreateStream(_handle.Handle));
	}

	public bool IsReady(OnlineStream stream)
	{
		return SherpaOnnxSpeakerEmbeddingExtractorIsReady(_handle.Handle, stream.Handle) != 0;
	}

	public float[] Compute(OnlineStream stream)
	{
		IntPtr intPtr = SherpaOnnxSpeakerEmbeddingExtractorComputeEmbedding(_handle.Handle, stream.Handle);
		int dim = Dim;
		float[] array = new float[dim];
		Marshal.Copy(intPtr, array, 0, dim);
		SherpaOnnxSpeakerEmbeddingExtractorDestroyEmbedding(intPtr);
		return array;
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~SpeakerEmbeddingExtractor()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroySpeakerEmbeddingExtractor(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateSpeakerEmbeddingExtractor(ref SpeakerEmbeddingExtractorConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroySpeakerEmbeddingExtractor(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingExtractorDim(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxSpeakerEmbeddingExtractorCreateStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingExtractorIsReady(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxSpeakerEmbeddingExtractorComputeEmbedding(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxSpeakerEmbeddingExtractorDestroyEmbedding(IntPtr p);
}
public struct SpeakerEmbeddingExtractorConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public SpeakerEmbeddingExtractorConfig()
	{
		Model = "";
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
	}
}
public class SpeakerEmbeddingManager : IDisposable
{
	private HandleRef _handle;

	private int _dim;

	public int NumSpeakers => SherpaOnnxSpeakerEmbeddingManagerNumSpeakers(_handle.Handle);

	public SpeakerEmbeddingManager(int dim)
	{
		IntPtr handle = SherpaOnnxCreateSpeakerEmbeddingManager(dim);
		_handle = new HandleRef(this, handle);
		_dim = dim;
	}

	public bool Add(string name, float[] v)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(name);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return SherpaOnnxSpeakerEmbeddingManagerAdd(_handle.Handle, array, v) == 1;
	}

	public bool Add(string name, ICollection<float[]> v_list)
	{
		int count = v_list.Count;
		float[] array = new float[count * _dim];
		int num = 0;
		foreach (float[] item in v_list)
		{
			item.CopyTo(array, num);
			num += _dim;
		}
		byte[] bytes = Encoding.UTF8.GetBytes(name);
		byte[] array2 = new byte[bytes.Length + 1];
		Array.Copy(bytes, array2, bytes.Length);
		array2[bytes.Length] = 0;
		return SherpaOnnxSpeakerEmbeddingManagerAddListFlattened(_handle.Handle, array2, array, count) == 1;
	}

	public bool Remove(string name)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(name);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return SherpaOnnxSpeakerEmbeddingManagerRemove(_handle.Handle, array) == 1;
	}

	public unsafe string Search(float[] v, float threshold)
	{
		IntPtr intPtr = SherpaOnnxSpeakerEmbeddingManagerSearch(_handle.Handle, v, threshold);
		string result = "";
		int num = 0;
		byte* ptr = (byte*)(void*)intPtr;
		if (ptr != null)
		{
			while (*ptr != 0)
			{
				ptr++;
				num++;
			}
		}
		if (num > 0)
		{
			byte[] array = new byte[num];
			Marshal.Copy(intPtr, array, 0, num);
			result = Encoding.UTF8.GetString(array);
		}
		SherpaOnnxSpeakerEmbeddingManagerFreeSearch(intPtr);
		return result;
	}

	public bool Verify(string name, float[] v, float threshold)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(name);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return SherpaOnnxSpeakerEmbeddingManagerVerify(_handle.Handle, array, v, threshold) == 1;
	}

	public bool Contains(string name)
	{
		byte[] bytes = Encoding.UTF8.GetBytes(name);
		byte[] array = new byte[bytes.Length + 1];
		Array.Copy(bytes, array, bytes.Length);
		array[bytes.Length] = 0;
		return SherpaOnnxSpeakerEmbeddingManagerContains(_handle.Handle, array) == 1;
	}

	public unsafe string[] GetAllSpeakers()
	{
		if (NumSpeakers == 0)
		{
			return new string[0];
		}
		IntPtr intPtr = SherpaOnnxSpeakerEmbeddingManagerGetAllSpeakers(_handle.Handle);
		string[] array = new string[NumSpeakers];
		byte** ptr = (byte**)(void*)intPtr;
		for (int i = 0; i != NumSpeakers; i++)
		{
			int num = 0;
			byte* ptr2 = ptr[i];
			while (*ptr2 != 0)
			{
				ptr2++;
				num++;
			}
			byte[] array2 = new byte[num];
			Marshal.Copy((IntPtr)ptr[i], array2, 0, num);
			array[i] = Encoding.UTF8.GetString(array2);
		}
		SherpaOnnxSpeakerEmbeddingManagerFreeAllSpeakers(intPtr);
		return array;
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~SpeakerEmbeddingManager()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroySpeakerEmbeddingManager(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateSpeakerEmbeddingManager(int dim);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroySpeakerEmbeddingManager(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingManagerAdd(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Name, float[] v);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingManagerAddListFlattened(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Name, float[] v, int n);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingManagerRemove(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Name);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxSpeakerEmbeddingManagerSearch(IntPtr handle, float[] v, float threshold);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxSpeakerEmbeddingManagerFreeSearch(IntPtr p);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingManagerVerify(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Name, float[] v, float threshold);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingManagerContains(IntPtr handle, [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1)] byte[] utf8Name);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxSpeakerEmbeddingManagerNumSpeakers(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxSpeakerEmbeddingManagerGetAllSpeakers(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxSpeakerEmbeddingManagerFreeAllSpeakers(IntPtr names);
}
public class SpeechSegment
{
	private struct Impl
	{
		public int Start;

		public IntPtr Samples;

		public int Count;
	}

	public int _start;

	private float[] _samples;

	public int Start => _start;

	public float[] Samples => _samples;

	public unsafe SpeechSegment(IntPtr handle)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(handle, typeof(Impl));
		_start = impl.Start;
		float* ptr = (float*)(void*)impl.Samples;
		_samples = new float[impl.Count];
		fixed (float* ptr2 = _samples)
		{
			for (int i = 0; i < impl.Count; i++)
			{
				ptr2[i] = ptr[i];
			}
		}
	}
}
public class SpokenLanguageIdentification : IDisposable
{
	private HandleRef _handle;

	public SpokenLanguageIdentification(SpokenLanguageIdentificationConfig config)
	{
		IntPtr handle = SherpaOnnxCreateSpokenLanguageIdentification(ref config);
		_handle = new HandleRef(this, handle);
	}

	public OfflineStream CreateStream()
	{
		return new OfflineStream(SherpaOnnxSpokenLanguageIdentificationCreateOfflineStream(_handle.Handle));
	}

	public SpokenLanguageIdentificationResult Compute(OfflineStream stream)
	{
		IntPtr handle = SherpaOnnxSpokenLanguageIdentificationCompute(_handle.Handle, stream.Handle);
		SpokenLanguageIdentificationResult result = new SpokenLanguageIdentificationResult(handle);
		SherpaOnnxDestroySpokenLanguageIdentificationResult(handle);
		return result;
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~SpokenLanguageIdentification()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroySpokenLanguageIdentification(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateSpokenLanguageIdentification(ref SpokenLanguageIdentificationConfig config);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroySpokenLanguageIdentification(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxSpokenLanguageIdentificationCreateOfflineStream(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxSpokenLanguageIdentificationCompute(IntPtr handle, IntPtr stream);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroySpokenLanguageIdentificationResult(IntPtr handle);
}
public struct SpokenLanguageIdentificationConfig
{
	public SpokenLanguageIdentificationWhisperConfig Whisper;

	public int NumThreads;

	public int Debug;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public SpokenLanguageIdentificationConfig()
	{
		Whisper = new SpokenLanguageIdentificationWhisperConfig();
		NumThreads = 1;
		Debug = 0;
		Provider = "cpu";
	}
}
public class SpokenLanguageIdentificationResult
{
	private struct Impl
	{
		public IntPtr Lang;
	}

	private string _lang;

	public string Lang => _lang;

	public unsafe SpokenLanguageIdentificationResult(IntPtr handle)
	{
		Impl impl = (Impl)Marshal.PtrToStructure(handle, typeof(Impl));
		int num = 0;
		byte* ptr = (byte*)(void*)impl.Lang;
		while (*ptr != 0)
		{
			ptr++;
			num++;
		}
		byte[] array = new byte[num];
		Marshal.Copy(impl.Lang, array, 0, num);
		_lang = Encoding.UTF8.GetString(array);
	}
}
public struct SpokenLanguageIdentificationWhisperConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Encoder;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Decoder;

	public int TailPaddings;

	public SpokenLanguageIdentificationWhisperConfig()
	{
		Encoder = "";
		Decoder = "";
		TailPaddings = -1;
	}
}
public struct TenVadModelConfig
{
	[MarshalAs(UnmanagedType.LPStr)]
	public string Model;

	public float Threshold;

	public float MinSilenceDuration;

	public float MinSpeechDuration;

	public int WindowSize;

	public float MaxSpeechDuration;

	public TenVadModelConfig()
	{
		Model = "";
		Threshold = 0.5f;
		MinSilenceDuration = 0.5f;
		MinSpeechDuration = 0.25f;
		WindowSize = 256;
		MaxSpeechDuration = 5f;
	}
}
public struct VadModelConfig
{
	public SileroVadModelConfig SileroVad;

	public int SampleRate;

	public int NumThreads;

	[MarshalAs(UnmanagedType.LPStr)]
	public string Provider;

	public int Debug;

	public TenVadModelConfig TenVad;

	public VadModelConfig()
	{
		SileroVad = new SileroVadModelConfig();
		SampleRate = 16000;
		NumThreads = 1;
		Provider = "cpu";
		Debug = 0;
		TenVad = new TenVadModelConfig();
	}
}
public class VersionInfo
{
	public unsafe static string Version
	{
		get
		{
			IntPtr intPtr = SherpaOnnxGetVersionStr();
			string result = "";
			int num = 0;
			byte* ptr = (byte*)(void*)intPtr;
			if (ptr != null)
			{
				while (*ptr != 0)
				{
					ptr++;
					num++;
				}
			}
			if (num > 0)
			{
				byte[] array = new byte[num];
				Marshal.Copy(intPtr, array, 0, num);
				result = Encoding.UTF8.GetString(array);
			}
			return result;
		}
	}

	public unsafe static string GitSha1
	{
		get
		{
			IntPtr intPtr = SherpaOnnxGetGitSha1();
			string result = "";
			int num = 0;
			byte* ptr = (byte*)(void*)intPtr;
			if (ptr != null)
			{
				while (*ptr != 0)
				{
					ptr++;
					num++;
				}
			}
			if (num > 0)
			{
				byte[] array = new byte[num];
				Marshal.Copy(intPtr, array, 0, num);
				result = Encoding.UTF8.GetString(array);
			}
			return result;
		}
	}

	public unsafe static string GitDate
	{
		get
		{
			IntPtr intPtr = SherpaOnnxGetGitDate();
			string result = "";
			int num = 0;
			byte* ptr = (byte*)(void*)intPtr;
			if (ptr != null)
			{
				while (*ptr != 0)
				{
					ptr++;
					num++;
				}
			}
			if (num > 0)
			{
				byte[] array = new byte[num];
				Marshal.Copy(intPtr, array, 0, num);
				result = Encoding.UTF8.GetString(array);
			}
			return result;
		}
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxGetVersionStr();

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxGetGitSha1();

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxGetGitDate();
}
public class VoiceActivityDetector : IDisposable
{
	private HandleRef _handle;

	public VoiceActivityDetector(VadModelConfig config, float bufferSizeInSeconds)
	{
		IntPtr handle = SherpaOnnxCreateVoiceActivityDetector(ref config, bufferSizeInSeconds);
		_handle = new HandleRef(this, handle);
	}

	public void AcceptWaveform(float[] samples)
	{
		SherpaOnnxVoiceActivityDetectorAcceptWaveform(_handle.Handle, samples, samples.Length);
	}

	public bool IsEmpty()
	{
		return SherpaOnnxVoiceActivityDetectorEmpty(_handle.Handle) == 1;
	}

	public bool IsSpeechDetected()
	{
		return SherpaOnnxVoiceActivityDetectorDetected(_handle.Handle) == 1;
	}

	public void Pop()
	{
		SherpaOnnxVoiceActivityDetectorPop(_handle.Handle);
	}

	public SpeechSegment Front()
	{
		IntPtr intPtr = SherpaOnnxVoiceActivityDetectorFront(_handle.Handle);
		SpeechSegment result = new SpeechSegment(intPtr);
		SherpaOnnxDestroySpeechSegment(intPtr);
		return result;
	}

	public void Clear()
	{
		SherpaOnnxVoiceActivityDetectorClear(_handle.Handle);
	}

	public void Reset()
	{
		SherpaOnnxVoiceActivityDetectorReset(_handle.Handle);
	}

	public void Flush()
	{
		SherpaOnnxVoiceActivityDetectorFlush(_handle.Handle);
	}

	public void Dispose()
	{
		Cleanup();
		GC.SuppressFinalize(this);
	}

	~VoiceActivityDetector()
	{
		Cleanup();
	}

	private void Cleanup()
	{
		SherpaOnnxDestroyVoiceActivityDetector(_handle.Handle);
		_handle = new HandleRef(this, IntPtr.Zero);
	}

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxCreateVoiceActivityDetector(ref VadModelConfig config, float bufferSizeInSeconds);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroyVoiceActivityDetector(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxVoiceActivityDetectorAcceptWaveform(IntPtr handle, float[] samples, int n);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxVoiceActivityDetectorEmpty(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern int SherpaOnnxVoiceActivityDetectorDetected(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxVoiceActivityDetectorPop(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxVoiceActivityDetectorClear(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern IntPtr SherpaOnnxVoiceActivityDetectorFront(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxDestroySpeechSegment(IntPtr segment);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxVoiceActivityDetectorReset(IntPtr handle);

	[DllImport("sherpa-onnx-c-api")]
	private static extern void SherpaOnnxVoiceActivityDetectorFlush(IntPtr handle);
}