private void ConvertCompleteUnit()
        {
            if (_lastComplete == 0)
            {
                return;
            }
            if (_phonemeQueue.Count == 0)
            {
                Trace.TraceError("Failed to convert phonemes. Phoneme queue is empty.");
                return;
            }
            char[] array = new char[_lastComplete];
            _phonemes.CopyTo(0, array, 0, _lastComplete);
            _phonemes.Remove(0, _lastComplete);
            char[]   value    = (_conversion != 0) ? _alphabetConverter.SapiToIpa(array) : _alphabetConverter.IpaToSapi(array);
            TTSEvent tTSEvent = null;
            long     num      = 0L;

            tTSEvent = (TTSEvent)_phonemeQueue.Peek();
            TTSEvent tTSEvent2;

            for (int i = 0; i < _lastComplete; i += tTSEvent2.Phoneme.Length)
            {
                tTSEvent2 = (TTSEvent)_phonemeQueue.Dequeue();
                num      += tTSEvent2.PhonemeDuration.Milliseconds;
            }
            TTSEvent evt = TTSEvent.CreatePhonemeEvent(new string(value), "", TimeSpan.FromMilliseconds(num), tTSEvent.PhonemeEmphasis, tTSEvent.Prompt, tTSEvent.AudioPosition);

            SendToQueue(evt);
        }
Beispiel #2
0
        private TTSEvent CreateTtsEvent(SpeechEventInfo sapiEvent)
        {
            TTSEvent ttsEvent;

            switch ((TtsEventId)sapiEvent.EventId)
            {
            case TtsEventId.Phoneme:
                ttsEvent = TTSEvent.CreatePhonemeEvent("" + (char)((uint)sapiEvent.Param2 & 0xFFFF), // current phoneme
                                                       "" + (char)(sapiEvent.Param1 & 0xFFFF),       // next phoneme
                                                       TimeSpan.FromMilliseconds(sapiEvent.Param1 >> 16),
                                                       (SynthesizerEmphasis)((uint)sapiEvent.Param2 >> 16),
                                                       _prompt, _audio.Duration);
                break;

            case TtsEventId.Bookmark:
                // BookmarkDetected
                string bookmark = Marshal.PtrToStringUni(sapiEvent.Param2);
                ttsEvent = new TTSEvent((TtsEventId)sapiEvent.EventId, _prompt, null, null, _audio.Duration, _audio.Position, bookmark, (uint)sapiEvent.Param1, sapiEvent.Param2);
                break;

            default:
                ttsEvent = new TTSEvent((TtsEventId)sapiEvent.EventId, _prompt, null, null, _audio.Duration, _audio.Position, null, (uint)sapiEvent.Param1, sapiEvent.Param2);
                break;
            }
            return(ttsEvent);
        }
Beispiel #3
0
        private void ConvertCompleteUnit()
        {
            if (_lastComplete == 0)
            {
                return;
            }
            if (_phonemeQueue.Count == 0)
            {
                Trace.TraceError("Failed to convert phonemes. Phoneme queue is empty.");
                return;
            }

            char[] source = new char[_lastComplete];
            _phonemes.CopyTo(0, source, 0, _lastComplete);
            _phonemes.Remove(0, _lastComplete);
            char[] target;
            if (_conversion == PhonemeConversion.IpaToSapi)
            {
                target = _alphabetConverter.IpaToSapi(source);
            }
            else
            {
                target = _alphabetConverter.SapiToIpa(source);
            }

            //
            // Convert the audio duration
            // Update the next phoneme id
            // Retain any other information based on the first TTS phoneme event.
            //
            TTSEvent ttsEvent, targetEvent, basePhonemeEvent = null;
            long     totalDuration = 0;

            basePhonemeEvent = (TTSEvent)_phonemeQueue.Peek();
            for (int i = 0; i < _lastComplete;)
            {
                ttsEvent       = (TTSEvent)_phonemeQueue.Dequeue();
                totalDuration += ttsEvent.PhonemeDuration.Milliseconds;
                i             += ttsEvent.Phoneme.Length;
            }

            targetEvent = TTSEvent.CreatePhonemeEvent(new string(target), "",
                                                      TimeSpan.FromMilliseconds(totalDuration),
                                                      basePhonemeEvent.PhonemeEmphasis,
                                                      basePhonemeEvent.Prompt,
                                                      basePhonemeEvent.AudioPosition);
            SendToQueue(targetEvent);
        }
Beispiel #4
0
        private TTSEvent CreateTtsEvent(SpeechEventInfo sapiEvent)
        {
            switch (sapiEvent.EventId)
            {
            case 6:
                return(TTSEvent.CreatePhonemeEvent(((char)((int)sapiEvent.Param2 & 0xFFFF)).ToString() ?? "", ((char)(sapiEvent.Param1 & 0xFFFF)).ToString() ?? "", TimeSpan.FromMilliseconds(sapiEvent.Param1 >> 16), (SynthesizerEmphasis)((uint)(int)sapiEvent.Param2 >> 16), _prompt, _audio.Duration));

            case 4:
            {
                string bookmark = Marshal.PtrToStringUni(sapiEvent.Param2);
                return(new TTSEvent((TtsEventId)sapiEvent.EventId, _prompt, null, null, _audio.Duration, _audio.Position, bookmark, (uint)sapiEvent.Param1, sapiEvent.Param2));
            }

            default:
                return(new TTSEvent((TtsEventId)sapiEvent.EventId, _prompt, null, null, _audio.Duration, _audio.Position, null, (uint)sapiEvent.Param1, sapiEvent.Param2));
            }
        }