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; } })); }
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); } }
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(); } }