Пример #1
0
        /// <summary>リップシンク開始を通知する。</summary>
        /// <param name="data">wavの波形データ</param>
        private void RequestLipSynchByWavData(byte[] data)
        {
            //DEBUG: NAudioベースの実装に差し替えられるか様子見
            var lipSynchValues = WaveInfoWithNAudio.GetVolumesDiscrete(data, ModelCore.TimerUpdateIntervalSec);

            //var lipSynchValues = WaveInfo.GetVolumesDiscrete(data, ModelCore.TimerUpdateIntervalSec);
            var lipsynch = new LipSyncher(DateTime.Now, lipSynchValues, ModelCore.TimerUpdateIntervalSec);

            LipSynchRequested?.Invoke(this, new LipSynchEventArgs(lipsynch));
        }
Пример #2
0
        /// <summary>
        /// バイト配列として読みだした音を再生します。
        /// ブロッキングで実行され、音声再生が終了するかStop関数が呼び出されるかすると
        /// 関数が終了します。
        /// </summary>
        public async Task PlayByPronounce(string text, bool useLipSynch)
        {
            Stop();

            UpdateBySetting();

            string pronounce = _textToPronounceConverter.Convert(text);

            _cts = new CancellationTokenSource();
            var token = _cts.Token;
            var data  = _currentSynthesizer.CreateWav(pronounce);

            //ガードが必要: 合成音声に失敗した場合を想定する
            if (data == null || data.Length == 0)
            {
                return;
            }

            using (var ms = new MemoryStream(data))
                using (var sp = new SoundPlayer(ms))
                {
                    try
                    {
                        //再生時間を読み取る
                        int durationMillisec = (int)WaveInfoWithNAudio.GetDurationMillisec(data);

                        if (useLipSynch)
                        {
                            RequestLipSynchByWavData(data);
                        }
                        sp.Play();

                        await Task.Delay(durationMillisec, token);
                    }
                    catch (TaskCanceledException)
                    {
                        sp.Stop();
                    }
                }
        }