/// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        /// <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);
        }
Exemple #9
0
        /// <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);
        }
Exemple #10
0
        /// <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);
            }
        }
Exemple #14
0
        /// <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);
        }
Exemple #16
0
        /// <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);
        }