Пример #1
0
        private Task <SpeakPosition> PrepareAudioFile()
        {
            SpeakPosition speakPosition = GetNextSpeakPosition();

            if (speakPosition == null)
            {
                return(Task.FromResult <SpeakPosition>(null));
            }

            string text = _textBase[speakPosition.textBaseIndex].Text;

            return(Task.Run(() =>
            {
                try
                {
                    Swap(ref _audioFilePath, ref _audioFilePathNext);
                    speakPosition.filePath = _audioFilePathNext;

                    if (!SpeakToFile(speakPosition.filePath, text))
                    {
                        return null;
                    }

                    return speakPosition;
                }
                catch (System.OperationCanceledException)
                {
                    return null;
                }
            }));
        }
Пример #2
0
        private SpeakPosition GetNextSpeakPosition()
        {
            SpeakPosition speakPosition = new SpeakPosition();

            while (true)
            {
                bool isEnd = false;

                if (Random)
                {
                    if (_randomIndexes == null)
                    {
                        _randomIndexes = Enumerable.Range(0, _textBase.Count).ToList();
                    }

                    if (_randomIndexes.Count > 0)
                    {
                        speakPosition.isRandom      = true;
                        speakPosition.randomIndex   = _random.Next(_randomIndexes.Count);
                        speakPosition.textBaseIndex = _randomIndexes[speakPosition.randomIndex];
                    }
                    else
                    {
                        isEnd = true;
                    }
                }
                else
                {
                    speakPosition.isRandom      = false;
                    speakPosition.textBaseIndex = _currentTextBaseIndex + 1;
                    isEnd = speakPosition.textBaseIndex >= _textBase.Count;
                }

                if (!isEnd)
                {
                    return(speakPosition);
                }

                if (Repeat && IsReady)
                {
                    _randomIndexes        = null;
                    _currentTextBaseIndex = -1;
                    continue;
                }

                return(null);
            }
        }
Пример #3
0
        private void SpeakNext()
        {
            _player.Stop();

            if (State != TalkerStatus.Run)
            {
                return;
            }

            if (_taskAudioFilePreparation == null)
            {
                _player.Close();
                _taskAudioFilePreparation = PrepareAudioFile();
            }

            SpeakPosition speakPosition = _taskAudioFilePreparation.Result;

            if (speakPosition != null)
            {
                PlayAudio(speakPosition.filePath);

                _currentTextBaseIndex = speakPosition.textBaseIndex;
                SpeakElementChanged?.Invoke(speakPosition.textBaseIndex);

                if (speakPosition.isRandom)
                {
                    _randomIndexes.RemoveAt(speakPosition.randomIndex);
                }

                _taskAudioFilePreparation = PrepareAudioFile();
            }
            else
            {
                Stop();
            }
        }