/// <summary> /// パラメータを設定する。 /// param.Sizeおよびparam.NumberOfSpeakersは自動的に設定される。 /// </summary> /// <param name="tts_param">パラメータ(話者パラメータを除く)</param> /// <param name="speaker_params">話者パラメータ</param> private static void SetParameters(AitalkCore.TtsParam tts_param, AitalkCore.TtsParam.SpeakerParam[] speaker_params) { // パラメータを格納するバッファを確保する int size = Marshal.SizeOf <AitalkCore.TtsParam>() + Marshal.SizeOf <AitalkCore.TtsParam.SpeakerParam>() * speaker_params.Length; IntPtr ptr = Marshal.AllocCoTaskMem(size); try { // パラメータを設定する tts_param.Size = size; tts_param.NumberOfSpeakers = speaker_params.Length; Marshal.StructureToPtr <AitalkCore.TtsParam>(tts_param, ptr, false); for (int index = 0; index < speaker_params.Length; index++) { IntPtr speaker_ptr = IntPtr.Add(ptr, Marshal.SizeOf <AitalkCore.TtsParam>() + Marshal.SizeOf <AitalkCore.TtsParam.SpeakerParam>() * index); Marshal.StructureToPtr <AitalkCore.TtsParam.SpeakerParam>(speaker_params[index], speaker_ptr, false); } AitalkCore.Result result; result = AitalkCore.SetParam(ptr); if (result != AitalkCore.Result.Success) { throw new AitalkException("動作パラメータの設定に失敗しました。", result); } } finally { Marshal.FreeCoTaskMem(ptr); } }
/// <summary> /// コンストラクタ。 /// </summary> /// <param name="voice_db_name">ボイスライブラリ名</param> /// <param name="tts_param">パラメータ</param> /// <param name="speaker_params">話者のパラメータリスト</param> internal AitalkParameter(string voice_db_name, AitalkCore.TtsParam tts_param, AitalkCore.TtsParam.SpeakerParam[] speaker_params) { VoiceDbName = voice_db_name; TtsParam = tts_param; SpeakerParameters = speaker_params; CurrentSpeakerName = SpeakerParameters[0].VoiceName; CurrentSpeakerParameter = SpeakerParameters[0]; }
/// <summary> /// パラメータを取得する /// </summary> /// <param name="tts_param">パラメータ(話者パラメータを除く)</param> /// <param name="speaker_params">話者パラメータ</param> private static void GetParameters(out AitalkCore.TtsParam tts_param, out AitalkCore.TtsParam.SpeakerParam[] speaker_params) { // パラメータを格納するのに必要なバッファサイズを取得する AitalkCore.Result result; int size = 0; result = AitalkCore.GetParam(IntPtr.Zero, ref size); if ((result != AitalkCore.Result.Insufficient) || (size < Marshal.SizeOf <AitalkCore.TtsParam>())) { throw new AitalkException("動作パラメータの長さの取得に失敗しました。", result); } IntPtr ptr = Marshal.AllocCoTaskMem(size); try { // パラメータを読み取る Marshal.WriteInt32(ptr, (int)Marshal.OffsetOf <AitalkCore.TtsParam>("Size"), size); result = AitalkCore.GetParam(ptr, ref size); if (result != AitalkCore.Result.Success) { throw new AitalkException("動作パラメータの取得に失敗しました。", result); } tts_param = Marshal.PtrToStructure <AitalkCore.TtsParam>(ptr); // 話者のパラメータを読み取る speaker_params = new AitalkCore.TtsParam.SpeakerParam[tts_param.NumberOfSpeakers]; for (int index = 0; index < speaker_params.Length; index++) { IntPtr speaker_ptr = IntPtr.Add(ptr, Marshal.SizeOf <AitalkCore.TtsParam>() + Marshal.SizeOf <AitalkCore.TtsParam.SpeakerParam>() * index); speaker_params[index] = Marshal.PtrToStructure <AitalkCore.TtsParam.SpeakerParam>(speaker_ptr); } } finally { Marshal.FreeCoTaskMem(ptr); } }