using System.Runtime.InteropServices; using TTS.Struct; namespace TTS { internal sealed class TTSCore : IDisposable { public const string Filename = "sherpa-onnx-c-api"; [DllImport(Filename)] private static extern IntPtr SherpaOnnxCreateOfflineTts(SherpaOnnxOfflineTtsConfig handle); [DllImport(Filename)] private static extern IntPtr SherpaOnnxOfflineTtsGenerate(IntPtr createOfflineTtsIntptr, IntPtr text, int sid, float speed); [DllImport(Filename)] private static extern void SherpaOnnxDestroyOfflineTts(IntPtr intPtr); /// /// 原生句柄 /// private IntPtr thisHandle; public TTSCore(SherpaOnnxOfflineTtsConfig modelConfig) { thisHandle = SherpaOnnxCreateOfflineTts(modelConfig); } /// /// 文字转语音 /// /// 文字 /// 音色 /// 速度 /// public SherpaOnnxGeneratedAudioResult ToSpeech(string text, int sid, float speed = 1f) { var result = SherpaOnnxOfflineTtsGenerate(thisHandle, Marshal.StringToCoTaskMemUTF8(text), sid, speed); SherpaOnnxGeneratedAudio impl = (SherpaOnnxGeneratedAudio)Marshal.PtrToStructure(result, typeof(SherpaOnnxGeneratedAudio)); return new SherpaOnnxGeneratedAudioResult(result, impl); } /// /// 文字转语音 /// /// 文字 /// 音色 /// 速度 /// public Task ToSpeechAsync(string text, int sid, float speed = 1f) { return Task.Run(() => ToSpeech(text, sid, speed)); } ~TTSCore() { Dispose(); } public void Dispose() { if (this.thisHandle != IntPtr.Zero) { SherpaOnnxDestroyOfflineTts(this.thisHandle); GC.SuppressFinalize(this); this.thisHandle = IntPtr.Zero; } } } }