public void TextToWave( string textToSpeak, string waveFileName, AQTK_VOICE voice) { if (string.IsNullOrWhiteSpace(textToSpeak)) { return; } if (this.SyntheDelegate == null || this.FreeWaveDelegate == null) { return; } var wavePtr = IntPtr.Zero; var waveSize = 0; try { var chars = this.UTF16Encoding.GetBytes(textToSpeak); // テキストを音声データに変換する wavePtr = this.SyntheDelegate?.Invoke( ref voice, chars, ref waveSize) ?? IntPtr.Zero; if (wavePtr == IntPtr.Zero || waveSize <= 0) { return; } FileHelper.CreateDirectory(waveFileName); // 生成したwaveデータを読み出す var buff = new byte[waveSize]; Marshal.Copy(wavePtr, buff, 0, (int)waveSize); using (var fs = new FileStream(waveFileName, FileMode.Create, FileAccess.Write)) { fs.Write(buff, 0, buff.Length); } } finally { if (wavePtr != IntPtr.Zero && waveSize != 0) { this.FreeWaveDelegate?.Invoke(wavePtr); } } }
public void TextToWave( string textToSpeak, string waveFileName, AQTK_VOICE voice) { if (string.IsNullOrWhiteSpace(textToSpeak)) { return; } if (this.SynthesizeDelegate == null || this.SynthesizeUTF16Delegate == null || this.FreeWaveDelegate == null) { return; } var wavePtr = IntPtr.Zero; try { // テキストを音声データに変換する uint size = 0; wavePtr = this.SynthesizeDelegate.Invoke( ref voice, textToSpeak, ref size); if (wavePtr == IntPtr.Zero || size <= 0) { return; } FileHelper.CreateDirectory(waveFileName); // 生成したwaveデータを読み出す var buff = new byte[size]; Marshal.Copy(wavePtr, buff, 0, (int)size); using (var fs = new FileStream(waveFileName, FileMode.Create, FileAccess.Write)) { fs.Write(buff, 0, buff.Length); } } finally { if (wavePtr != IntPtr.Zero) { this.FreeWaveDelegate.Invoke(wavePtr); } } }
public extern static IntPtr Synthe( ref AQTK_VOICE voice, [MarshalAs(UnmanagedType.LPArray)] byte[] text, ref int waveSize);