/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text, Settings.Default.HOYASettings.ToString()); lock (this) { if (!File.Exists(wave)) { if (string.IsNullOrWhiteSpace( Settings.Default.HOYASettings.APIKey)) { return; } this.CreateWave( text, wave); } } // 再生する SoundPlayerWrapper.Play(wave); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, bool isSync = false) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), Settings.Default.PollySettings.ToString(), true); lock (this) { if (!File.Exists(wave)) { this.CreateWave( text, wave); } } // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, VoicePalettes voicePalette = VoicePalettes.Default, bool isSync = false, float?volume = null) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), Settings.Default.SasaraSettings.ToString()); this.CreateWaveWrapper(wave, () => { // 音声waveファイルを生成する Settings.Default.SasaraSettings.SetToRemote(); RemoteTTSClient.Instance.TTSModel.TextToWave( TTSTypes.CeVIO, text, wave, 0, Settings.Default.SasaraSettings.Gain); }); // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync, volume); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), Settings.Default.SasaraSettings.ToString()); lock (this) { if (!File.Exists(wave)) { // 音声waveファイルを生成する RemoteTTSClient.Instance.TTSModel.TextToWave( TTSTypes.CeVIO, text, wave, 0, Settings.Default.SasaraSettings.Gain); } } // 再生する SoundPlayerWrapper.Play(wave, playDevice); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text) { if (string.IsNullOrWhiteSpace(text)) { return; } // テキストをユーザ辞書で置き換える text = this.ReplaceByUserDictionary(text); // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text, Settings.Default.OpenJTalkSettings.ToString()); lock (this) { if (!File.Exists(wave)) { this.CreateWave( text, wave); } } // 再生する SoundPlayerWrapper.Play(wave); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, bool isSync = false, float?volume = null) { if (string.IsNullOrWhiteSpace(text)) { return; } // テキストをユーザ辞書で置き換える text = this.ReplaceByUserDictionary(text); // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), this.Config.ToString()); lock (this) { if (!File.Exists(wave)) { this.CreateWave( text, wave); } } // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync, volume); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, VoicePalettes voicePalette = VoicePalettes.Default, bool isSync = false, float?volume = null) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), Settings.Default.PollySettings.ToString(), true); this.CreateWaveWrapper(wave, () => { this.CreateWave( text, wave); }); // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync, volume); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, VoicePalettes voicePalette = VoicePalettes.Default, bool isSync = false, float?volume = null) { if (string.IsNullOrWhiteSpace(text)) { return; } HOYAConfig config; switch (voicePalette) { case VoicePalettes.Default: config = Settings.Default.HOYASettings; break; case VoicePalettes.Ext1: config = Settings.Default.HOYASettingsExt1; break; case VoicePalettes.Ext2: config = Settings.Default.HOYASettingsExt2; break; default: config = Settings.Default.HOYASettings; break; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), config.ToString()); this.CreateWaveWrapper(wave, () => { if (string.IsNullOrWhiteSpace( Settings.Default.HOYASettings.APIKey)) { return; } this.CreateWave( text, config, wave); }); // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync, volume); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, bool isSync = false, float?volume = null) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text, this.Config.ToString()); lock (this) { if (!File.Exists(wave)) { using (var fs = new FileStream(wave, FileMode.Create)) using (var synth = new SpeechSynthesizer()) { // VOICEを設定する var voice = this.GetSynthesizer(this.Config.VoiceID); if (voice == null) { return; } synth.SelectVoice(voice.VoiceInfo.Name); synth.Rate = this.Config.Rate; synth.Volume = this.Config.Volume; // Promptを生成する var pb = new PromptBuilder(voice.VoiceInfo.Culture); pb.StartVoice(voice.VoiceInfo); pb.AppendSsmlMarkup( $"<prosody pitch=\"{this.Config.Pitch.ToXML()}\">{text}</prosody>"); pb.EndVoice(); synth.SetOutputToWaveStream(fs); synth.Speak(pb); } } } // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync, volume); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public override void Speak( string text) { lock (lockObject) { if (string.IsNullOrWhiteSpace(text)) { return; } // 今回の再生データをMD5化したものからwaveファイルの名称を作る var wave = ("Yukkuri" + TTSYukkuriConfig.Default.YukkuriSpeed.ToString() + text).GetMD5() + ".wav"; wave = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"anoyetta\ACT\" + wave); if (!File.Exists(wave)) { // よみがなに変換する var textByYomigana = this.ConvertYomigana(text); // サーバに送信する var e = new TTSMessage.SpeakEventArg() { TTSType = TTSTEngineType.Yukkuri, TextToSpeack = textByYomigana, SpeakSpeed = TTSYukkuriConfig.Default.YukkuriSpeed, WaveFile = wave }; TTSServerController.Message.Speak(e); } // サブデバイスを再生する // サブデバイスは専らVoiceChat用であるため先に鳴動させる if (TTSYukkuriConfig.Default.EnabledSubDevice) { SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.SubDeviceID, wave, TTSYukkuriConfig.Default.EnabledYukkuriVolumeSetting ? TTSYukkuriConfig.Default.YukkuriVolume : 100); } // メインデバイスを再生する SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.MainDeviceID, wave, TTSYukkuriConfig.Default.EnabledYukkuriVolumeSetting ? TTSYukkuriConfig.Default.YukkuriVolume : 100); } }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public override void Speak( string text) { lock (lockObject) { if (string.IsNullOrWhiteSpace(text)) { return; } // 今回の再生データをMD5化したものからwaveファイルの名称を作る var wave = ("Sasara" + TTSYukkuriConfig.Default.SasaraSettings.GetMD5() + text).GetMD5() + ".wav"; wave = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"anoyetta\ACT\" + wave); if (!File.Exists(wave)) { // 初期化する this.Initialize(); // 音声waveファイルを生成する var e = new TTSMessage.SpeakEventArg() { TTSType = TTSTEngineType.CeVIO, TextToSpeack = text, WaveFile = wave }; TTSServerController.Message.Speak(e); } // サブデバイスで再生する if (TTSYukkuriConfig.Default.EnabledSubDevice) { SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.SubDeviceID, wave, (int)TTSYukkuriConfig.Default.SasaraSettings.Onryo); } // メインデバイスで再生する SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.MainDeviceID, wave, (int)TTSYukkuriConfig.Default.SasaraSettings.Onryo); } }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, bool isSync = false, float?volume = null) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), Settings.Default.YukkuriSettings.ToString()); lock (this) { if (!File.Exists(wave)) { // よみがなに変換する var tts = text; if (Settings.Default.YukkuriSettings.UseKanji2Koe) { tts = this.ConvertToPhoneticByKanji2Koe(tts); } else { tts = this.ConvertToPhonetic(tts); } this.GetLogger()?.Trace($"Yukkuri speak={text}, phonetic={tts}"); // WAVEを生成する AquesTalk.Instance.TextToWave( tts, wave, Settings.Default.YukkuriSettings.ToParameter()); } } // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync, volume); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public override void Speak( string text) { lock (lockObject) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件からwaveファイル名を生成する var wave = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"anoyetta\ACT\" + ("HOYA" + TTSYukkuriConfig.Default.HOYASettings.ToString() + text).GetMD5() + ".wav"); if (!File.Exists(wave)) { if (string.IsNullOrWhiteSpace( TTSYukkuriConfig.Default.HOYASettings.APIKey)) { return; } this.CreateWave( text, wave); } // サブデバイスを再生する // サブデバイスは専らVoiceChat用であるため先に鳴動させる if (TTSYukkuriConfig.Default.EnabledSubDevice) { SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.SubDeviceID, wave, 100); } // メインデバイスを再生する SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.MainDeviceID, wave, 100); } }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public override void Speak( string text) { lock (lockObject) { if (string.IsNullOrWhiteSpace(text)) { return; } // テキストをユーザ辞書で置き換える text = this.ReplaceByUserDictionary(text); // 現在の条件からwaveファイル名を生成する var wave = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"anoyetta\ACT\" + ("OpenJTalk" + TTSYukkuriConfig.Default.OpenJTalkSettings.ToString() + text).GetMD5() + ".wav"); if (!File.Exists(wave)) { this.CreateWave( text, wave); } // サブデバイスを再生する // サブデバイスは専らVoiceChat用であるため先に鳴動させる if (TTSYukkuriConfig.Default.EnabledSubDevice) { SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.SubDeviceID, wave, TTSYukkuriConfig.Default.OpenJTalkSettings.Volume); } // メインデバイスを再生する SoundPlayerWrapper.Play( TTSYukkuriConfig.Default.MainDeviceID, wave, TTSYukkuriConfig.Default.OpenJTalkSettings.Volume); } }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text) { if (string.IsNullOrWhiteSpace(text)) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text, Settings.Default.YukkuriSettings.ToString()); lock (this) { if (!File.Exists(wave)) { // よみがなに変換する var tts = text; if (Settings.Default.YukkuriSettings.UseKanji2Koe) { tts = this.ConvertToPhoneticByKanji2Koe(tts); } else { tts = this.ConvertToPhonetic(tts); } // WAVEを生成する AquesTalk.Instance.TextToWave( tts, wave, Settings.Default.YukkuriSettings.ToParameter()); } } // 再生する SoundPlayerWrapper.Play(wave); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public async void Speak( string text) { if (string.IsNullOrWhiteSpace(text)) { return; } // 起動していなければ起動させる var err = await this.Start(); if (!string.IsNullOrEmpty(err)) { this.GetLogger().Error($"VOICEROID Speeak error text={text}, err={err}"); return; } var process = this.Config.GetSelected()?.InnerProcess; if (process == null) { return; } // アクティブにさせないようにする this.SetNotActiveWindow(process.MainWindowHandle); if (this.Config.DirectSpeak) { // 直接再生する if (await process.SetTalkText(text)) { if (!await process.Play()) { this.GetLogger().Error($"VOICEROID Speeak error text={text}"); return; } } return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text, this.Config.ToString()); if (!File.Exists(wave)) { // 音声waveファイルを生成する if (await process.SetTalkText(text)) { var result = await process.Save(wave); if (!result.IsSucceeded) { this.GetLogger().Error($"VOICEROID Speeak error text={text}, err={result.Error}, extra={result.ExtraMessage}"); return; } } } // 再生する SoundPlayerWrapper.Play(wave); }
/// <summary> /// テキストを読み上げる /// </summary> /// <param name="text">読み上げるテキスト</param> public void Speak( string text, PlayDevices playDevice = PlayDevices.Both, bool isSync = false, float?volume = null) { if (string.IsNullOrWhiteSpace(text)) { return; } var client = GoogleCloudTextToSpeechConfig.TTSClient; if (client == null) { return; } // 現在の条件をハッシュ化してWAVEファイル名を作る var wave = this.GetCacheFileName( Settings.Default.TTS, text.Replace(Environment.NewLine, "+"), Settings.Default.GoogleCloudTextToSpeechSettings.ToString()); this.CreateWaveWrapper(wave, () => { // 合成する音声のパラメーターを設定する SynthesisInput input = new SynthesisInput { Text = text }; VoiceSelectionParams voice = new VoiceSelectionParams { LanguageCode = Settings.Default.GoogleCloudTextToSpeechSettings.LanguageCode, Name = Settings.Default.GoogleCloudTextToSpeechSettings.Name, }; AudioConfig config = new AudioConfig { AudioEncoding = AudioEncoding.Linear16, VolumeGainDb = Settings.Default.GoogleCloudTextToSpeechSettings.VolumeGainDb, Pitch = Settings.Default.GoogleCloudTextToSpeechSettings.Pitch, SpeakingRate = Settings.Default.GoogleCloudTextToSpeechSettings.SpeakingRate, SampleRateHertz = Settings.Default.GoogleCloudTextToSpeechSettings.SampleRateHertz, }; // 音声合成リクエストを送信する var response = client.SynthesizeSpeech(new SynthesizeSpeechRequest { Input = input, Voice = voice, AudioConfig = config }); // 合成した音声をファイルに書き出す using (Stream output = File.Create(wave)) { response.AudioContent.WriteTo(output); } }); // 再生する SoundPlayerWrapper.Play(wave, playDevice, isSync, volume); }