Как говорить миллисекунды молчания в С# с использованием SpVoice?

Как на самом деле говорить молчание за X # миллисекунд, а не с помощью Thread.Sleep(). Я пытаюсь использовать функцию .Speak() в библиотеке SpeechLib переменной SpVoice, чтобы говорить о конкретной длительности молчания в соответствии с заданным количеством миллисекунд. В частности, в выходном файле .wav, в котором я вставляю периоды молчания между устными линиями текста. Использование Thread.Sleep() будет принимать непристойное количество времени, чтобы говорить или сохранять, так как я планирую сохранить почти 5000 строк устного текста в .wav с паузами между линиями.

Это решение, которое у меня есть до сих пор:

        int pauseA = (int)(22050.0 * ((double)pauseTargetToSource.Value / 1000.0) * 2.0);
        int pauseB = (int)(22050.0 * ((double)pauseLineBreak.Value / 1000.0) * 2.0);
        while (
            (lineSource = srSource.ReadLine()) != null &&
            (lineTarget = srTarget.ReadLine()) != null)
        {
            voiceSource.Speak(lineSource, SpeechVoiceSpeakFlags.SVSFlagsAsync);
            voiceSource.WaitUntilDone(Timeout.Infinite);
            voiceSource.AudioOutputStream.Write(new byte[pauseA]);
            voiceTarget.Speak(lineTarget, SpeechVoiceSpeakFlags.SVSFlagsAsync);
            voiceTarget.WaitUntilDone(Timeout.Infinite);
            voiceSource.AudioOutputStream.Write(new byte[pauseB]);
        }

Где 22050.0 - частота выборки, а pauseLineBreak.Value - это число в миллисекундах. Множитель 2.0 для 2-байтовой длины короткого значения в данных .wav.

AudioOutputStream.Write просто записывает правильный номер 00 в файл для молчания.

Ответы

Ответ 1

Это не идеальное решение, но...

Вы можете использовать определенное количество "тихой" фонемы, то есть "_" (подчеркнуто) (см. http://msdn.microsoft.com/en-us/library/ms717239(v=vs.85).aspx) после проверки того, как много мс это длится. Возможно, вам придется настроить количество тишин в зависимости от установленной вами скорости.

Ответ 2

Пара вариантов:

  • Вы можете перевернуть еще один поток, чтобы выполнить операцию
  • Вы можете просто определить, сколько байтов требуется в секунду, и записать их в выходной поток.